WordPressのアーカイブをJSONに保存
【2021/7/31追記】予約投稿が反映できないため、アクションフックを追加しました。【/追記終了】
2021年7月現在のこのサイトは、メニューでVueを使って絞り込みをしているだけの簡単なつくりとなっています。
左のメニュー(スマホは右上のメニュー)にWP_Queryにposts_per_page=-1をセットして全記事を読み込むという荒業を使ってVue用の配列に入れるということをやっていました。(現在はやっていません)
外部ファイルで読み込まずにサイドバーに埋め込んでいることもあり見た目が悲惨だし、いちいちWP_Queryで全記事取得をすると記事が増えれば増えるほどサーバーレスポンスが遅くなってしまう。
そのため、呼び出す際にクエリを使わなくていいように、記事の一覧をJSONに保存することにした。
本日の目標
記事を保存したときにアーカイブ用のJSONファイルを出力する。
コード
JSONにはid,タイトル,URLを入れる場合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function output_archive_json() { $filepath = 'ファイルパス'; $args = array( 'post_type' => 'post', 'posts_per_page' => -1, 'no_found_rows' => true ); $postArray = array(); $the_query = new WP_Query( $args ); if( $the_query->have_posts() ) : while( $the_query->have_posts() ) : $the_query->the_post(); $postArray[] = array( "id" => get_the_ID(), "ttl" => get_the_title(), "url" => get_the_permalink() ); endwhile; endif; wp_reset_postdata(); $data = json_encode($postArray); file_put_contents($filepath, $data); } add_action( 'wp_insert_post', 'output_archive_json', 10, 3 ); add_action( 'future_to_publish', 'output_archive_json'); |
アクションフックについて
はじめはアクションフックのsave_postを使っていたが、反映がまちまちだった。
第三引数のプライオリティを10よりもっと大きい数字に変更すればいいのかもしれないが、ここの検証をするのは大変そうなのでアクションフックを変えることに。save_postの直後に発火するというwp_insert_postに変えたらうまくいくようになった。
また、future_to_publishで予約投稿が公開されたときにもJSONを再生成するようにしました。
思っていたよりすんなりできてしまった。
あとはこのJSONをfetch APIで呼び出してVueを使うだけ。