[WordPress] REST API のご紹介 -3-

業務多忙により、長らく記事を更新おらず、申し訳ございませんでした。
今週から毎週記事の更新を行いますので、ご閲覧よろしくお願いします!

今週は、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 実行結果>

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*