pre_get_postsでメインクエリを変更した際の次/前リンクの取得する方法

pre_get_postsでメインクエリを変更した際の次/前リンクの取得する方法



WordPressでは、pre_get_postsを使用することで、メインクエリで取得される記事の順番をカスタマイズすることができます。
例えば「イベント投稿」では、並び順をカスタムフィールドで設定した「開催日」に変更するなど。

しかし、pre_get_postsをカスタマイズするだけでは該当する記事の「次の投稿」「前の投稿」を取得するnext_post_linkprevious_post_linkでは、標準の日付順となり、メインクエリの通りにはなりません。

そこで色々と調べてみたのですが、SQLを記述して取得するような手段しか見つかりませんでした。

Wordpress 記事を属性 順序( menu_order ) の順番に並べたい
参考
Wordpress 記事を属性 順序( menu_order ) の順番に並べたい

Wordpressの固定ページには属性の欄に順序があり表示する順番を決めることができます。
この順序ですが投稿やカスタム投稿でもこの属性欄を表示させることがで、順序に入力した順番で表示させることもできます。

Wordpress 記事を属性 順序( menu_order ) の順番に並べたい かもメモ

これでも行けると思うのですが、SQLで、となると記述が面倒な気も致します。

そこで他に何か代替手段は無いかと模索していましたが、結局は

同条件のWP_Queryから記事IDの配列を取得

して、記事IDキーの前後キー値を次/前の記事リンクを出力すれば簡単なのでは無かろうかと。

例:カスタム投稿/my_event、開催日(カスタムフィールド)/from_date

// single.phpで表示中の記事ID取得.
$current_ID = get_the_ID();
// pre_get_postsと同じクエリ条件を指定.
$args = array(
	'post_type'      => 'my_event',
	'post_status'    => 'publish',
	'posts_per_page' => -1,
	'meta_key'       => 'from_date',
	'orderby'        => 'meta_value_num',
	'order'          => 'DESC',
	'fields'         => 'ids', // これでID配列を取得出来る.
);
$nav_query  = new WP_Query( $args );
// これで$post_arrayにクエリ条件下の記事IDが配列として格納される.
$post_array = $nav_query->posts;
wp_reset_postdata();
// 記事IDのキーを取得.
$current_index = array_search( $current_ID, $post_array );
// 次/前の記事IDを取得.
if ( $current_index ) {
	$next_post_ID = $post_array[ $current_index + 1 ];
	$prev_post_ID = $post_array[ $current_index - 1 ];
	// 次の記事.
	echo '<a href="' . get_permalink( $next_post_ID ) . '">' . get_the_title( $next_post_ID ) . '</a>';
	// 前の記事.
	echo '<a href="' . get_permalink( $prev_post_ID ) . '">' . get_the_title( $prev_post_ID ) . '</a>';
}

これで何とかはなるかな。
重いかな。

今日はここまで

関連する記事



こちらはいかが?


コメントを残す