query_vars
フックを使用して追加したdate
という名前のカスタムクエリvarが原因で問題が発生しています。フロントページのURLにdate
パラメータが存在する場合( https://example.com/?date=23.08.2016 )、WordPressはフロントページだけでなく投稿アーカイブをロードしています。他のランダムパラメータがリンクに追加されている場合( https://example.com/?foo=bar )、またはパラメータが存在しない場合、フロントページは定義した静的ページで正しく読み込まれます。
バックエンドの投稿ページはフロントページとは異なります。
次のコードを使用してカスタムクエリvarを追加しました。
my_query_vars( $vars ) {
$vars[] = 'date';
return $vars;
}
add_filter( "query_vars", "my_query_vars" );
なぜそんなことが起こるのか、どんな考え?
WP::parse_request()
とWP_Query::parse_query()
の詳細なデバッグの後、私は'request'
フィルターのunset( $query_vars['date'] );
が役に立つことを知りました。
WP_Query::parse_query()
が呼び出される前に基本的には日付クエリvarの設定を解除しますので、is_home()
はfalseを返します。
add_filter( 'request', function( $query_vars ) {
global $wp_query, $wp;
if ( ! $wp_query->is_main_query() ) {
return $query_vars;
}
$qv_keys = array_keys( $wp->query_vars );
if ( ! ( in_array( 'product_cat', $qv_keys, true )
|| in_array( 'product_tag', $qv_keys, true )
|| in_array( 'post_type', $qv_keys, true ) && 'product' === $wp->query_vars['post_type']
|| in_array( 's', $qv_keys, true )
) ) {
unset( $query_vars['date'] );
}
return $query_vars;
} );
説明:
WP_Query::$is_home = true
のときにアーカイブロードを投稿するので、この値が設定されている場所を遡ってみました。要するに、私はそれがこんな感じだと思います: