質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

Q&A

解決済

2回答

33568閲覧

WordPressでページネーション2ページ目が404エラー

kota1010

総合スコア60

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

0グッド

1クリップ

投稿2018/06/08 18:02

編集2018/06/10 10:47

WordPressのページネーションで404エラーは頻出ネタで自分なりに調べてみましたが解決しないのでこちらでお尋ねします。

現状は以下のようなURL構成です。

トップページ:ドメイン名(使用テンプレート:front-page.php)
ブログのトップページ:ドメイン名/blog(使用テンプレート:home.php スラッグ:blog)
投稿記事:ドメイン名/blog/カテゴリー/記事ID (使用テンプレート:single.php)
カテゴリーページ:ドメイン名/blog/カテゴリー (使用テンプレート:archive.php)

パーマリンク設定は

ドメイン名/blog/%category%/%post_id%

カテゴリーベースは空欄です。

プラグインのYoastSEOの設定でカテゴリーベースの「category」を削除しています。

この状態で、URL構成は実現できていますが、カテゴリーページのページネーションの2ページ目が404となります。

ドメイン名/blog/category/page/2

が404、ということです。

ブログ記事アーカイブの2ページ目はちゃんと表示されます。

YoastSEOのカテゴリーベース設定をオフにして、こちらの記事(https://web-tech-blog.com/wordpress/wp-pagenavi_permalink_notfound.html)を参考に、functions.phpに以下のソースを記述すると、カテゴリーの2ページ目はちゃんと表示されますが、ブログ記事の2ページ目が404になります。

php

1function catbase_function($link) { 2return str_replace("/category/", "/", $link); 3} 4function catbase_flush_rules() { 5global $wp_rewrite; 6$wp_rewrite->flush_rules(); 7} 8function catbase_rewrite($wp_rewrite) { 9$new_rules = array('(.+)/page/(.+)/?' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&paged='.$wp_rewrite->preg_index(2)); 10$wp_rewrite->rules = $new_rules + $wp_rewrite->rules; 11} 12add_filter('user_trailingslashit', 'catbase_function'); 13add_action('init', 'catbase_flush_rules'); 14add_filter('generate_rewrite_rules', 'catbase_rewrite');

こうすると、ドメイン名/blog/page/2

が404になります。

使用テーマはunderscoreを独自カスタマイズしたのですが、archive.phpのループ部分とページネーションはオリジナルのままです。

php

1<?php 2if ( have_posts() ) : ?> 3while ( have_posts() ) : the_post(); ?> 4 5ループ処理 6 7<?php endwhile; 8 9the_posts_navigation(); 10 11else : 12 13get_template_part( 'template-parts/content', 'none' ); 14 15endif; ?>

1ページ内の表示記事数は設定>表示設定で10にしたあるままです。

これは問題はソースやプラグインではなく、こちら(https://osha-kimi.com/memo/custompost-pagination/)にあるようにblogのトップと個別記事のURLがダブってしまうのが原因なのでしょうか。

しかしいまやろうとしているURLの構成はごく普通のものだと思うのですが、これを実現しつつ、ページネーションの2ページ目以降も404にならないようにするには一体どうしたらいいのでしょうか。

どうかどなたかおわかりの方、ご教授よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

以前、以下のURLで回答したadd_rewrite_rulesを利用して、/blog/category/page/2の場合は
第4階層をページ番号として指定すると良いのではないでしょうか?(具体的なコードが無くてすいません。)

https://teratail.com/questions/81930#reply-128721

投稿2019/08/23 07:34

madone99

総合スコア1855

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

とりあえず妥協しました・・・

結局、こちらのページ(https://osha-kimi.com/memo/custompost-pagination/)にあるように、ブログ記事アーカイブのスラッグ(blog)と、個別記事のパーマリンク設定の最上位フォルダ名が同じ(blog)なので、カテゴリーの2ページ目は

ドメイン名/category/page/2

となり、「category/page/2」という個別記事を探してしまうから404になるのだろう、と推測しました。それ以外の原因は考えられなかったので。

すでにブログ記事アーカイブはblogというスラッグで検索エンジンにインデックスされていてそこそこアクセスも稼いでいますし、個別記事も同様なので両方ともURLは変えたくない。

となると残された方法としては、カテゴリーページの2ページ目は「category/page/2」というURLではなく、デフォルトの「?page=2」形式で表示させることにしました。

まずはページネーションのソースを、

php

1$paged = (int) get_query_var('paged'); 2$category = get_the_category(); 3$category = $category[0]; 4$args = array( 5 'cat'=> $category->cat_ID, 6 'posts_per_page' => 10, 7 'paged' => $paged, 8 'orderby' => 'post_date', 9 'order' => 'DESC', 10 'post_type' => 'post', 11 'post_status' => 'publish' 12); 13$the_query = new WP_Query($args); 14 15if ($the_query->max_num_pages > 1) { 16 echo paginate_links(array( 17 'base' => get_pagenum_link(1) . '%_%', 18 'format' => '?paged=%#%', 19 'current' => max(1, $paged), 20 'total' => $the_query->max_num_pages 21 )); 22} 23 24wp_reset_postdata;

に変更。ポイントは「format」で「?paged=%#%」を指定している点です。

しかしこれだけではパーマリンク設定のカスタム構造の「/blog/%category%/%post_id%/」という設定によってURLをリライトされてしまい意味がありません。

ですのでこちらの記事(http://blog.livedoor.jp/net_scope-diary/archives/25879219.html)を参考に、カテゴリーページでURLに「page」が含まれる時だけリダイレクトをしないようfunctions.phpに記述を追加、無事カテゴリーの2ページ目だけは「?page=2」で表示させるようにできました。

php

1add_filter('redirect_canonical','my_disable_redirect_canonical'); 2 3function my_disable_redirect_canonical( $redirect_url ) { 4 5 if ( is_archive() ){ 6 $subject = $redirect_url; 7 $pattern = '//page//'; // URLに「/page/」があるかチェック 8 preg_match($pattern, $subject, $matches); 9 10 if ($matches){ 11 //リクエストURLに「/page/」があれば、リダイレクトしない。 12 $redirect_url = false; 13 return $redirect_url; 14 } 15 } 16 17}

ひとまず今回はこれで対応済みにしましたが、本来の希望であるURL構造、

サイトトップ:ドメイン名
ブログ記事一覧:ドメイン名/blog
ブログ記事一覧2ページ目:ドメイン名/blog/page/2
個別記事:ドメイン名/blog/category/page-id
カテゴリー:ドメイン名/blog/category
カテゴリー2ページ目:ドメイン名/blog/category/page/2

このURL構造が実現できるやり方がありましたら、ぜひ教えてください。
それともやっぱりWordPressではこれはどうしても不可能なのでしょうか?
ありふれた、自然な形だと思うのですが・・・

投稿2018/06/11 16:39

編集2018/06/11 16:43
kota1010

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問