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);
以上で同じ日時の記事の一覧表示、ページング処理の完成です。
コメント