web-dev-qa-db-ja.com

空の日付アーカイブで404エラーを回避する

日付アーカイブページで(その日付の)投稿が存在しない場合、WordPressは404ページにアクセスします。

WordPressに404ではなくオリジナルのアーカイブを使い続けるようにする方法はありますか。そのようにすれば、 "No posts found"メッセージを出力するためにif ( have_posts() )条件を使うことができます。

4
Ben Everard

コードをOPの回答から404テンプレートフィルタに移動し、WPにdate.phpの代わりに404.phpファイルを強制的にロードさせることができます。それでも404ヘッダーを送信しますが、別のテンプレートを使用してページをレンダリングします。

function wpd_date_404_template( $template = '' ){
    global $wp_query;
    if( isset($wp_query->query['year'])
        || isset($wp_query->query['monthnum'])
        || isset($wp_query->query['day']) ){
            $template = locate_template( 'date.php', false );
    }
    return $template;
}
add_filter( '404_template', 'wpd_date_404_template' );
4
Milo

さて、熟考してみれば、私があまりにも多くのWPを求めているのかどうかはわかりません。私はSEOの観点から私は404に空のページをしたいのですが、私は確かにそれらをインデックスにしたくないと思います。

代わりに404テンプレートを使用して "No posts found"メッセージを出力することにしましたが、is_date()is_day()(など)関数は404ページでは機能しないため、404が日付アーカイブ。

以下をURLを検出するために404.phpに貼り付けてください。

global $wp_query;

$is_date_archive = ( isset($wp_query->query['year']) || isset($wp_query->query['monthnum']) || isset($wp_query->query['day']) );

それから、変数$is_date_archiveを使用して404テンプレートをそれに応じて変更できます。

例(404.php

global $wp_query;

$is_date_archive = ( isset($wp_query->query['year']) || isset($wp_query->query['monthnum']) || isset($wp_query->query['day']) );

if( $is_date_archive ){ echo 'No posts found'; } else { echo 'general 404 page'; }
3
Ben Everard