My開発メモ

メインループをカスタムフィールドのキーでソートする (WordPress)

読書メモのアプリをWordPressで作成していて、カスタムフィールドにページNOを記録している。

archive.php で各記事のタイトルを一覧表示すると、作成した日時の降順で一覧されるが、それを”ページNO” の昇順で一覧表示したくなったので、以下のようにした。

functions.php に $query を引数とした関数を作成し、その関数を ‘pre_get_posts’ というアクションフックに登録する。

functions.php
function sort_by_pageNumber($query) {
  // 管理画面ならリターン
  // あるいはメインループでなければリターン
  if (is_admin() || !$query->is_main_query()) {
    return;
  }
  $query->set('orderby', 'meta_value');
  $query->set('meta_key', 'page_number');
  $query->set('order', 'ASC');

  return $query;
}
add_action('pre_get_posts', 'sort_by_pageNumber');

課題

メインループのソート順を 作成日時とページNO で切り替えることが
できればいいのだが、そのやり方が思いつかなかった。

archive.phpが実行されるときには、functions.php はすでに実行されているから、それをどうやって切り替えるか。

切り替えボタンを formタグで作成し、それをarchive.phpに設置することを考えたのだけれど、その form から送信したデータをどこで受け取るのか。

プラグインを作成すれば、プラグインの設定画面を作成し、そこにソート順切り替えフォームを作って、そのプラグインで add_action(‘pre_get_posts’, ‘sort_by-pageNumber’) とやればできそうな気がする。

しかし、プラグインを作成してそこにソート順切り替えボタンを作成するという方法を避けたかった。アーカイブ一覧ページにソート順切り替えボタンを設置したかった。

そこで、僕がとった方法は、メインループをあきらめて、サブループでソート順を
切り替えることだった。

カテゴリー: memo, wordpress

タグ: pre_get_posts, カスタムフィールド, ソート順, メインループ

カウント: 72