カスタム投稿タイプのページャー実装(2ページ目が404になるアレに苦しめられる)

電脳備忘録

久しぶりにドハマりした・・・

久しぶりにWordPressでドハマりしました。カスタム投稿タイプ「news」があって、アーカイブページにページャーを実装したところ、2ページ目が404で表示されないエラーにぶち当たりました。 ページャーで2ページ目が404で表示されないというのは、WordPressでよく見かけるエラーで、検索すると解決方法を書いたサイトが多くヒットします。
以前、別のサイトでカスタム投稿タイプにページャーを実装していたので、それをそのまま使えると思い実装したところ404で突き返されてしまいました。ネットを海を彷徨い紹介されている方法を試しましたが、それをあざ笑うかのように跳ね返されまぁまぁなストレスに晒されましたね。

検索にヒットしたものを手当たり次第試している中でこちらのエントリーにあった方法が解決の糸口となりました。

wordpress カスタム投稿で 2ページ目以降が404になってしまう

ARA WEB BLOG

ただ紹介されていた通りの方法でも上手くいかず、試行錯誤した結果、ようやく動いてくれるようになりました。
どうしてこれで動くようになったのか正直なところ理解していません。ただ今は先を急ぐのでね・・・他にもやらなければならない事が多くある中で、原因の解明にこだわってはいられないのですよ・・・。

WordPress管理画面

「/wp-admin/options.php」にアクセスしてposts_per_pageの値を-1に設定する。

functions.php

リライトルールを書く

//カスタム投稿タイプページング リライトルール
add_rewrite_rule('news/([^/]+)/page/([0-9]{1,})/?$', 'index.php?post_type=news&term=$matches[1]]&paged=$matches[2]', 'top');

ページ遷移時のリダイレクトを阻止する

add_filter('redirect_canonical','my_disable_redirect_canonical');
function my_disable_redirect_canonical( $redirect_url ) {
if ( is_single() ){
//リクエストURLに「/page/」があれば、リダイレクトしない
preg_match('/\/paged\//', $redirect_url, $matches);
if ($matches){
$redirect_url = false;
return $redirect_url;
}
}
}

archive-news.php

WP_Queryの設定

<?php
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = array(
'post_type' => 'news',
'post_status' => 'publish',
'posts_per_page' => 9,
'paged' => $paged,
);
$the_query = new WP_Query( $args );
if($the_query->have_posts()) :
while($the_query->have_posts()) : $the_query->the_post();
?>
<!-- ここに表示させたいものを設定する -->
<?php endwhile; endif; ?>

ページャーの設定

<div class="pager-nav">
<?php
$GLOBALS['wp_query']->max_num_pages = $the_query->max_num_pages;
$pagination = get_the_posts_pagination( array(
'base'               => '?paged=%#%',
'format'             => '?paged=%#%',
'prev_text' => '‹',
'next_text' => '›',
));
echo $pagination;
?>
</div><!--/.page-nav-->

パーマリンクは「ドメイン/news/?paged=2」といった感じになり無事2ページ目が表示されました。
久しぶりにハマって6時間くらいこれに時間をとられましたが、なんとか動いてくれたのでよしとします・・・。

広告

ブログの維持費に充てるでございます・・・。