カスタム投稿のアーカイブで2ページ目が表示されない時の対処

カスタマイズ
WordPressカテゴリー
Pocket

カスタム投稿タイプのアーカイブページ(taxonomy-$taxonomy.php)を用いて一覧ページを準備していた際、2ページ目以降が404 NotFoundとなってページが表示されない事態が発生してしまいました。

どうにか解決できましたのでまとめておきます。

手こずったポイント1:パーマリンク設定がデフォルトだった

なかなかググっても答えに到達できなかった原因は、今回解決したいのがパーマリンク設定がデフォルトのままの場合でした。

http://ドメイン名/?taxonomy&paged=2

一般的に利用されているURL形式は

http://ドメイン名/taxonomy/paged/2

なので、このURL形式で2ページ目以降が404 NotFoundとなってページが表示されない問題を解決するのは沢山検索に引っかかりましたが、デフォルトのままの場合は見つけられず。。。

手こずったポイント2:WP_Query() にこだわったせい

これが一番の原因ですが、アーカイブページなのに固定ページで使うWP_Query()を使っていたことでした。
1ページ目がちゃんと表示できているだけに、ケアレスミスじゃないかと思い込み原因や解決方法を探して時間をロスしました。。

WP_Query()はページ内に複数のループがあるときに利用するサブループです。
 ・サブループなのでページングができない。
 ・するとしても専用のアーカイブページが必要。

ここが認識不足でした。。

解決方法:pre_get_posts を使う

では、アーカイブページのメインループはどうするか。
pre_get_posts()を用いてメインクエリを変更します。

※こちらを参考にさせていだだきまいた。
 WordPressの新・旧ループからカスタムクエリ・アーカイブまで徹底解説

function.phpに、下記のフォーマットで記述します。

function 関数( $query ) {
 if ( is_admin() || ! $query->is_main_query() )
 return;
 
 if ( クエリーの改変を適用する条件 ) {
 $query->set( 'パラメーター', '値' );
 return;
 }
}
add_action( 'pre_get_posts', '関数名' );

 

たとえば、適用する条件をタクソノミーのスラッグ(town)で指定する場合。

function custom_query( $query ) {
 if ( is_admin() || ! $query->is_main_query() )
 return;
 if ( $query->is_tax( 'town') ) {
 $query->set( 'posts_per_page', '10' ); //10記事毎にページング
 return;
 }
 }
 add_action( 'pre_get_posts', 'custom_query' );

条件分岐のタグは、『Codexの条件分岐のページ』をご参照ください。
たくさんの条件分岐タグがありますので柔軟に対応させることが可能です。

そして、アーカイブページのテンプレート.phpには下記の形で記述します。

<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
<!-- ここに表示フォーマットを指定 -->
<?php endwhile;  ?>

これで無事、2ページ目以降が404 NotFoundとなってページが表示されない事態を解決することが出来ました。
WP_Query()では必要だった色々なパラメータも不要となり、とてもシンプルな形になりました。

メインループとサブループ。意識しないで進めたことで思わぬ落とし穴にハマってしまいました。
どちらも1ページ目は簡単に表示させられてしまうのでご注意ください。