投稿やページ、カスタム投稿まで自由に並び替えられる便利なプラグインがあります。
Intuitive Custom Post Orderというプラグインです。
このプラグインはとても便利なのでよく使います。
今回、TCD系のテーマでIntuitive Custom Post Orderが使えない現象に出くわして、並び替えに苦労したのでメモしておきます。
Intuitive Custom Post Orderの基本的な使い方のおさらい
Intuitive Custom Post Orderは日本人作者のプラグインです。
フロントエンドでは、ダッシュボードの投稿一覧等でD&Dで並び順を変更できるようになり、バックエンドではその並び順はmenu_orderとして保存され、クエリ実行時にmenu_order順になるようにクエリパラメータをフックして一連の並び替えを実現しています。
Intuitive Custom Post Orderが効かない、動かないという時は?
どうにもこうにも、いうことを聞かないという現象になっている場合は、以下の条件が当てはまっていると思って間違いありません。
Intuitive Custom Post Orderの公式サイトに以下のように書かれています。
また、テンプレート側で、WP_Queryクラス, pre_get_postsフック, query_posts() を使ったカスタムループを生成して、orderおよびorderby引数を指定した場合は、テンプレート側の条件が優先されます。
https://hijiriworld.com/web/wp-intuitive-custom-post-order/
テンプレート側を変更しないとダメということなので、テンプレートの修正が出来ない場合はプラグインによる並べ替えを諦めるしかありません。
そういう場合は、別の方法を使う必要があります。
投稿、ページ、カスタム投稿をプラグインなしで並べ替える方法
Intuitive Custom Post Orderが動かなかったり、テンプレートのwp_queryのパラメータを変更しても全く結果が変わらない原因は、ほとんどの場合、テーマやプラグインによるpre_get_postsフックが上書きしています。
pre_get_postsフックが使われている箇所を探す方法
使用されているフックを確認するのは、QueryMonitorプラグインを使うと簡単です。
Query Monitorで使用されているフックをモニターできるので、pre_get_postsを検索してフックが見つかれば、ビンゴです。
pre_get_postsフックが使われていた場合の対処方法
自分でpre_get_postsを使ってテーマやプラグインのpre_get_postsを上書きすればよいです。
上書きする具体的な方法は、テーマやプラグインでpre_get_postsのフックを定義している記述をそのまま持ってきて、クエリパラメータを変更し、Priorityを下げれば上書きできます。
テーマ側でpre_get_postsフックでorderbyを指定している例
以下はテーマ側で記述されたpre_get_postsのフックの定義の例です。
$query->set( ‘orderby’があるので、プラグインの並べ替えが効きません。
function po_pre_get_posts( $query ) {
$options = get_design_plus_option();
// Modify post order of faq and clinic
if ( is_admin() ) return;
if ( $query->is_post_type_archive( 'service' ) || $query->is_post_type_archive( 'faq' )) {
// Change post order by menu_order and date
$query->set( 'orderby', array( 'menu_order' => 'ASC', 'date' => 'DESC' ) );
// Display all posts in archive pages
if ( $query->is_main_query() ) {
// Change posts number to display
$query->set( 'posts_per_page', -1 );
}
}
}
add_action( 'pre_get_posts', 'po_pre_get_posts' );
テーマ側のpre_get_postsフックを上書きする例
そのままコピペしてきて、並べ替えたい内容に変更してPriorityを大きくします。
自由に並び替えたかったので、post__inを使って、ID指定しています。
function change_service_order( $query ) {
$options = get_design_plus_option();
// Modify post order of faq and clinic
//if ( is_admin() || ! $query->is_main_query() ) return;
if ( is_admin() ) return;
if ( $query->is_post_type_archive( 'service' ) ) {
// Change post order by menu_order and date
$query->set('orderby', 'post__in');
$query->set('post__in', array(1,2,3));
// Display all posts in archive pages
if ( $query->is_main_query() ) {
// Change posts number to display
$query->set( 'posts_per_page', -1 );
}
}
}
add_action( 'pre_get_posts', 'change_service_order',999 );
まとめ
カスタム投稿タイプなどでpre_get_postsフックを使って並び順が初期状態から変更されているテーマなどでは、今回のようにプラグインが使えない問題が起きやすいです。
その場合に自力で並べ替えようと思ってテンプレートファイルを直接修正しても、フックで後から書き換えられてしまうので結果が反映されない現象に悩まされます。
この記事では、Intuitive Custom Post Orderが効かない、動かないという時に自前で並び替えをおこなう時のポイントをまとめました。