Wordpressに標準装備されているページ送り関数である『next_posts_link()』『previous_posts_link()』

それぞれ、カテゴリーやアーカイブページで『古い記事・新しい記事』の一覧に自動でページナビリンクを生成してくれる便利なWP関数です。

ですが今回、個別記事ページ(single.php)上で使用してみたら、リンク先が404エラーとなりました。どうやらWPのリダイレクト設定が関連しているようです。

今回は、『next_posts_link()』のリンク先が強制リダイレクト(要するにリンク切れ)してしまう場合の対処法を紹介します。

今回の症状。ページナビリンクは表示できても、リンクがエラーする。

今回は、既に『next_posts_link()』を用いたページナビの表示自体は完了している前提で説明します。

『古い記事へ・新しい記事へ』リンクは表示されても、リンク先がエラーになってしまうケースの対処法ですのでご注意下さい。

ページ送りのリンク先が404エラーになり、
強制リダイレクトされてしまう。

next_posts_link()関数は、記事リスト表示中のページURLの末尾に自動で「 /page/2 」を追加し、『次の記事リスト』を表示するためのURLを自動で生成してくれます。

例えば、カテゴリページ『example.com/archive』で使用すると、次の記事一覧『example.com/archive/page/2』に表示されます。

通常のループ内(index.php、category.php、archive.php等)で使用した場合は、ほぼ問題はありません。

ですが、下記のような使用例では、不具合を招くケースがあります。

・カスタム投稿のリライト設定と相性が悪い。
・パーマリンク設定との関係
・アーカイブ系テンプレートの外で「next_posts_link()」を使っている場合。

これらの場合は「 /page/2 」付きのURLが「WP的に存在しないURL」と認識されてしまい、404へ強制リダイレクトされてしまう事があるようです。

404への強制リダイレクトを制御して対処する。

通常、記事一覧を表示するのはアーカイブ系テンプレート上です。
ですので、これらのページでは「 /page/2 」を含むURLに対して、強制リダイレクトは行われない設定になっています。

■アーカイブ系テンプレートとは?↓
index.php、category.php、archive.phpなど、記事一覧を表示するためのテンプレの事。
single.phpやpage.php等、単一記事表示テンプレとは異なるループ・設定になってると思います、多分。

なので、今回はその『リダイレクトさせないWPの機能』を応用して対処していきます。

要するに、『archive-カスタム投稿.phpでも、single.phpでも、強制リダイレクトはやめてくれ』と設定してしまうのです。

では、具体的な手順に移ります。

function.phpで、不都合な強制リダイレクト機能を停止する。 

では、実際にWorpdressの設定をいじっていきます。今回も、functions.php を使用します。

■使用中テーマのfunctions.phpに下記を追加

add_filter('redirect_canonical','my_disable_redirect_canonical');
 
function my_disable_redirect_canonical( $redirect_url ) {
    if ( is_single( 'カスタム投稿名' ) )
    $redirect_url = false;
    return $redirect_url;
}
※ is_single と 'カスタム投稿名' の部分は、目的に合わせた条件分岐タグに書き換えてください。例:is_single()、is_page()、is_archive() 等。
※テーマの編集は自己責任でお願いします。不安な人は編集前にバックアップを。
※functions.phpの編集は、「外観⇒テーマ編集 ⇒テーマの為の関数( functions.php )」から編集できます。 ※functions.phpに記述する場所はどこでも構いませんが、後で誤って消してしまわないようにコメントアウトを添えておきましょう。

上記のコードをfunctions.phpに記述して上書きすれば、強制リダイレクトは解除され、ページナビのリンク先「/page/2」が正常に表示されるハズです。

 自分は「is_single()」で動作確認しました。他の条件分岐タグでも動くと思います。多分。

URLに『/page/』を含む場合のみ、リダイレクトしない設定にカスタマイズ。

以上の設定で、『~/page/2』がついたURLがリダイレクトされない状態になったと思います。

ですが、Wordpressのデフォルトで強制リダイレクト設定になっていたのには、何かしらの理由があるのかもしれません。

『リダイレクトを強制的に全停止してしまうと、セキュリティー的な問題や、他機能やプラグインとの予期せぬ衝突があるかも・・・。』とちょっと不安になりました。

なので、ちょっとだけ工夫して、URLに『/page/』を含むアクセスがあった場合のみ、リダイレクトしない設定にカスタムしてみました。

自分は、single.php上でページナビ(next_posts_link)を使用したかったので、その場合の記述例を紹介します。

■function.phpに記述。

add_filter('redirect_canonical','my_disable_redirect_canonical');
 
function my_disable_redirect_canonical( $redirect_url ) {

	if ( is_single() ){
		$subject = $redirect_url;
		$pattern = '/\/page\//'; // URLに「/page/」があるかチェック
		preg_match($pattern, $subject, $matches);

		if ($matches){
		//リクエストURLに「/page/」があれば、リダイレクトしない。
		$redirect_url = false;
		return $redirect_url;
		}
	}

}


■コードの説明

単純に、URLに『/page/』を含む場合のみ、リダイレクト機能を停止する、という設定です。

この設定に意味があるのか分かりません。

とは言え、single.phpでどうしてもカスタムクエリnew WP_Query();を使った記事一覧を表示したかったので、自分はとりあえずこのコードで実装中です。

ご使用は自己責任で~動作確認はしっかりと~。

今回紹介した方法は、Wordpressの基本機能を直接書き換えています。

使用中のプラグインや各種設定によっては、上手く動作しない可能性や不具合が出るかも知れません。

特にリライト機能をカスタムとかしてたら、干渉するかも?知れないですね。

心当たりがある場合は、動作確認をしっかりとお願いします。

不具合や他機能との干渉があれば、コメント欄でお知らせもらえると、今後の参考になります。

あと、他にもsingle.php等で特定記事一覧表示+ページ送りを実装出来る機能があるなら、教えてください。

自分は発見できませんでした。お願いしまーす。

参考ページ:Pagination on single.php causing 301 redirect (10 posts)


前の記事次の記事