メインループをカスタムフィールドのキーでソートする (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