web-dev-qa-db-ja.com

max_num_postsを使用して、404エラーではなく、コンテンツのないページをリダイレクトしますか?

改ページ構造を変更して404エラーが大量に発生したサイトがあります(以前よりも多くの投稿が表示されているため、検索エンジンで索引付けされたページが多数あります)。 。

私がやりたいのは、ページ番号がmax_num_pages値より大きいかどうかをチェックし、それが当てはまる場合は404ページを提供するというデフォルトのワードプレス動作を中断し、代わりにどちらかのホームにリダイレクトする関数を作成することですページ、あるいはもっと良いのは最初のタグページを選択することです(全体構造の中でタグページだけに興味があります)。

私が知らないのはどうやって - もっと正確にはこの関数を使うべきか - です。私はWordPressがすでにこの情報をチェックする機能を持っていると推測しています。それが次に404を起動します、それで私は既存のプラガブル機能へのフィルタとしてそれを設定する必要があるでしょうか?

これまでの機能は

redirect_tags(){ 
if (is_main_query() && !is_singular() && is_paged()) 
{global $wp_query;
$paged = intval(get_query_var('paged'));
$max_page = $wp_query->max_num_pages;
if($max_page < $paged){
echo 'page is greater than max';}
 }}
2
andy

あなたの関数の残りがうまくいくなら、あなたは wp_safe_redirectへの呼び出しを追加する必要があります$wp_queryを取り込む最初のフックはwpだと思います。だからあなたの関数の最後の部分を変更する...

if($max_page < $paged){
    wp_safe_redirect(get_bloginof('url'),'301');
}

そして関数の後に(外側に)以下を追加してください。

add_action('wp','redirect_tags');

私はそれがそれをするべきだと思います。あなたは無限のリダイレクトループを設定することができますので注意してください。

編集:問題はあなたの関数の上部にあるis_paged()チェックです。存在しないページ編集ページにアクセスしようとすると、is_paged()falseを返し、残りの関数は実行されません。そのチェックを外し、template_redirectにフックしてください。私はこれをテストしました、そしてそれは働きます。言い換えると...

function redirect_tags() {
  if (is_main_query() && !is_singular() ) {
    global $wp_query;
    $paged = intval(get_query_var('paged'));
    $max_page = $wp_query->max_num_pages;
    if ( ($max_page < $paged) ) {
      wp_safe_redirect(get_bloginfo('url'),'301');
    }
  }
}
add_filter('template_redirect','redirect_tags');
3
s_ha_dum