業務多忙により、長らく記事を更新おらず、申し訳ございませんでした。
今週から毎週記事の更新を行いますので、ご閲覧よろしくお願いします!
今週は、WordPress の REST API で、並び順を拡張する方法についてご紹介します。
■REST API v2 で標準対応している並び順
以下の公式サイトに記載されておりますが、標準では以下のような項目で
並べ替えることが出来ます。
・date(公開日)
・id(記事毎に設定されるID)
・title(タイトル)
・slug(スラッグ)
しかし、他の項目で並び替えを行いたい場合もあると思います。
たとえば、日付順ではあるのですが、公開日ではなくて、更新日時順で取得したいと
考えた時には、標準にはないため、自分で拡張しないといけません。
そこで今回は、並び順に「更新日時」を追加しようと思います。
■REST APIの拡張方法
投稿ページに対して、並び順に「更新日時」を追加する場合、
一番簡単に対応するのでしたら、適用しているテーマの functions.php に、
以下のプログラムを記載します。
add_filter('rest_endpoints', 'my_modify_rest_routes'); function my_modify_rest_routes( $routes ) { array_push( $routes['/wp/v2/posts'][0]['args']['orderby']['enum'], 'modified' ); return $routes; }
このプログラムは、REST API が実行された時に、
投稿記事(’/wp/v2/posts’)の設定情報のうち、
並べ替え(’orderby’)として利用できる設定情報一覧(’enum’)に、
更新日時(’modified’)を追加しています。
ただ、この方法ですと、以下のケースに対応できません。
・カスタム投稿を追加した場合
・マルチサイトを採用していて、様々なテーマを適用している場合
そこで、上述の問題点を解消するために、以下2つの工夫をします。
■どのサイトを表示する場合にも、絶対に読み込む設定ファイルを追加する
wp-settings.php に、以下の通り、拡張用のPHPを読み込む処理を追加します。
// Load early WordPress files. require( ABSPATH . WPINC . '/compat.php' ); require( ABSPATH . WPINC . '/class-wp-list-util.php' ); require( ABSPATH . WPINC . '/functions.php' ); require( ABSPATH . WPINC . '/class-wp-matchesmapregex.php' ); require( ABSPATH . WPINC . '/class-wp.php' ); require( ABSPATH . WPINC . '/class-wp-error.php' ); require( ABSPATH . WPINC . '/pomo/mo.php' ); require( ABSPATH . WPINC . '/class-phpass.php' ); // my config files. require( ABSPATH . WPINC . '/my_functions.php' );
■どの投稿タイプであっても、絶対に並び順に「更新日時」を設定できるプログラムにする
wp-includes/my_functions.php の中に、以下のようなプログラムを記述します。
add_filter('rest_endpoints', 'add_rest_orderby_modified'); function add_rest_orderby_modified ( $routes ) { //投稿タイプで検索する foreach ($routes as $types => $value){ //配列0番目 foreach ($routes[$types] as $types_index => $value2){ if ($types_index == 0) { //REST の引数名 foreach ($routes[$types][$types_index] as $rest_settings => $value3){ if ($rest_settings == "args") { //並び替え foreach ($routes[$types][$types_index][$rest_settings] as $input_data => $value4){ if ($input_data == "orderby") { //定数定義 foreach ($routes[$types][$types_index][$rest_settings][$input_data] as $orderby => $value5){ if ($orderby == "enum") { //更新日時を追加 array_push( $routes[$types][$types_index][$rest_settings][$input_data][$orderby], 'modified' ); } } } } } } } } } return $routes; }
■実行結果
以下の通り、URLを実行することで、更新日時で並び替えた一覧を取得することが出来ます
実行するURL
http://<あなたのサイトのドメイン>/wp-json/wp/v2/posts?orderby=modified

<図1 実行結果>
最後までご覧いただき、ありがとうございます。