WordPressで「news」というカスタム投稿タイプを追加したサイトのアーカイブページ(archive-news.php)にプラグイン「WP-PageNav」を用いてページ送りを導入したのですが、2ページ目以降のリンクが全て404エラー(Not Found)になる現象に陥り地味にはまったので、原因と対処法を書いていきます。
原因
その1
特別複雑な条件を入れていないのに WP_Query をあえて使ってしまったこと。
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$term_object = get_queried_object();
$term_slug = $term_object->slug;
$term_name = $term_object->name;
$args = array(
'paged' => $paged,
'post_type' => 'news',
'posts_per_page' => 5,
);
if ($term_slug) {
$args['tax_query'] = array(
array(
'taxonomy' => 'news_tax',
'field' => 'slug',
'terms' => $term_slug,
)
);
}
$news_query = new WP_Query($args);
その2
「1ページに表示する最大投稿数」の設定が管理画面上の設定では “10” としていましたが、その1のコードでは “5” と一致していなかったこと。(※デフォルト設定を仮に “5” にして一致させると正常に動く)
解説
上記原因は一見なんの問題もなさそうなのですが、WordPressのルールにそってカスタム投稿タイプのアーカイブページを “archive-news.php” で作っておりましたので、WP_Query で投稿データを取得する前にデフォルトで、カスタム投稿タイプ「news」の記事を取得する処理が走っています(※止められるのかな?)。
対象記事数が10件だとする場合、WP_Query を使って取得した結果では2ページ分あるはずですが、デフォルトの設定は10件表示するようになっているため2ページは存在しません。
デフォルトで走っている処理の方で、2ページ目がないと判断されてしまっていたため WP_Query の方で正しい記述をしても2ページ目を 404エラーで表示出来ない現象が起きておりました。
対処法
WP_Queryを使わずにデフォルトの取得処理に任せてしまえばいいのですが、どうしてもWP_Queryを使いたい場合や表示件数を変えたい場合には以下のコードで投稿タイプ毎に表示件数を変更することであるはずのページが存在しないという今回の現象を回避することが出来ます。
/**
* カスタム投稿タイプ「news」のアーカイブページの記事表示件数を変更する
*/
define('POSTS_PER_PAGE_NEWS', 5);
function change_posts_per_page($query)
{
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_post_type_archive('news') ) {
$query->set( 'posts_per_page', POSTS_PER_PAGE_NEWS );
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
動作環境情報
エックスサーバー(x10) PHP 7.3.14 MySQL 5.7 WordPress 5.3.2
コメント