web-dev-qa-db-ja.com

カスタムquery_varにより、フロントページに投稿アーカイブが表示される

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" );

なぜそんなことが起こるのか、どんな考え?

3
pawelkmpt

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のときにアーカイブロードを投稿するので、この値が設定されている場所を遡ってみました。要するに、私はそれがこんな感じだと思います:

  1. $this->query_vars['post_type']$this->query_vars['name']は設定されていません この条件では 日付クエリvarがどの投稿タイプにも割り当てられていないため。
  2. 多くの操作の結果WP_Query::$is_singularはfalseに設定されます ここ
  3. そしてそれはWP_Query::$is_home = trueにつながります。
2
pawelkmpt