WordPressで同じ投稿日時の記事のページング処理

wordpress同じ日付の一覧ページング Wordpress
wordpress同じ日付の一覧ページング

WordPressでCSVインポートで記事を投稿した際、全く同じ日時の記事が複数できたのでページングの処理で対応した内容について説明します。

同じ日時の投稿記事がある場合どうなるのか?

アーカイブページの表示順、ページング処理に影響があります。ページング処理では記事が飛んでしまうのでページの総数(母数)と実際に表示されるページ数が違うという問題が発生します。

同じ日時の投稿記事がある場合は日時とIDでソートする

WordPressのIDはautoincrementなので記事のINSERT順にバン後うが採番されます。ですので、全く同じ日時の投稿記事が存在する場合は投稿日時とID複数でのソートが必要になります。

get_postsでのorderby複数指定

get_postsでのorderby複数指定は注意が必要です。複数指定の方法は配列での指定ではなく、スペース区切りでの指定です。私は配列で指定していて、間違えに気が付くまでかなりの時間がかかりました。

$args = array(
	'post_status' => 'publish',

	'orderby' => 'post_date ID', // 半角スペース区切りで複数指定
	'order'=> 'ASC',
);
$posts_array = get_posts( $args );

ページングの処理はget_next_post_whereとget_next_post_sortフィルターで

ページングの処理は条件とソート両方での対応が必要です。まずは条件部分を書き換えます。こちらの条件は昇順(ASC)ので1記事ずつのページングの場合の例です。※処理にあわせて書き換えが必要です。

function my_next_post_where($where, $in_same_term, $excluded_terms) {
	global $post;
	
	$where = str_replace('p.post_date >', 'p.ID > '.$post->ID.' AND p.post_date >=', $where);
	return $where;
}

次にソート部分を書き換えます

function my_next_post_sort($order) {
	
	$order = "ORDER BY p.ID ASC LIMIT 1";
	return $order;
}
add_filter('get_next_post_sort', 'my_next_post_sort', 10, 3);

以上で同じ日時の記事の一覧表示、ページング処理の完成です。

コメント

タイトルとURLをコピーしました