DEBUGメモ:WordPressで記事がページ送り跨いで重複する現象

現象:


記事一覧ページにおいて、投稿がページを跨いで繰り返して表示される・重複する

原因調査の手順:


1.情報入手から原因判明まで


問題発生箇所のテンプレート→archive.php
記事が重複する箇所の該当クエリ→メインクエリ
該当のSQL文をDUMPして、MySQLに投げて重複するかどうか見る→やはり重複する
メインクエリはカスタイマイズされているか?→いいえ、デフォルトの設定を使用(wp_optionの最大表示記事数+公開時刻降順)
SELECT文に公開時刻を追加して、もう1回クエリを送る

重複する記事を含め、全記事の公開時刻が同一であることが判明される

2.原因


“orderby post_date”の為、post_dateをindexとして利用しているのにすべての値が同一では順番が付けられない、
MySQL的に”LIMIT 0,10″から”LIMIT 10,10″に改ページした場合、決まった順番がない為適当に順番を付けられてしまう。

3.解決策


記事が重複する箇所の該当クエリ→メインクエリ→pre_get_postsで制御

functions.phpに該当するクエリの分岐を作成し、下記の制御文を追記


<?php
//...前略
function hogehoge_pre_get_posts_func($query){
	if ( $query->is_admin() || ! $query->is_main_query() ){
		return;
	}
	//ソート時公開時刻を第一参考とし、重複防止の為候補として記事IDを追加
	if ( 'hogehogeクエリの分岐条件' === TRUE ){
		$query->set( 'orderby',array('date' => 'DESC', 'ID' => 'DESC'));
	}
	//...以下略
}
add_action('pre_get_posts','hogehoge_pre_get_posts_func');

学爾時習之、不亦悦乎? 有朋自遠方来、不亦楽乎? 人不知爾不愠、不亦君子乎?

シェアする

コメントを残す

コメントする

CAPTCHAis initialing...