WordPress カスタム投稿タイプ ページ送りの2ページ目以降が 404エラーになる原因と対処法

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

コメント

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