web-dev-qa-db-ja.com

Tax_queryをリレーション「OR」で使用して設定されたクエリがカテゴリオブジェクトを変更しますか?

更新:下の編集をご覧ください。)

コード:

function itsme_better_editions( $query ) {
    if ( $query->is_category() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post' ) );
        $query->set( 'tax_query',
            array(
                'relation' => 'OR',
                array(
                    'taxonomy' => 'category',
                    'field' => 'slug',
                    'terms' => 'intl',
                    'operator' => 'IN'
                )
            )
        );
    }
    return $query;
}
add_filter( 'pre_get_posts', 'itsme_better_editions' );

この機能を使用して、すべてのカテゴリの下、つまりすべてのカテゴリアーカイブ内の「International(intl)」カテゴリに割り当てられている投稿を表示します。

(私の場合、カテゴリは、たとえばニュースサイトと共通のエディションを表します。)

問題は、機能が適切に配置されている場合、カテゴリアーカイブ、タグアーカイブ、カスタム分類アーカイブなど、すべてのアーカイブのオブジェクトという用語が 'International(intl)'に設定されているように見えることです。

したがって、、たとえばのように、 'UK(uk)'カテゴリアーカイブにアクセスすると、<?php single_cat_title(); ?>には 'UK'ではなく 'International'と表示されます。 (注:single_cat_title()は単なる例であり、termオブジェクトの変更によって引き起こされる問題の1つにすぎません。)

なんでこんなことが起こっているの? (私は'relation' => 'OR'を設定しています。)これを修正するにはどうすればいいですか?

PS:驚くべきことにこれは動作していました(非常に肯定的)、そして私はこれがどのバージョンのWordPressで壊れたのかわかりません。

編集:問題は、$tax_query = $query->get( 'tax_query' );が空であるか配列ではないということです。なぜこれが起こっているのか、そして私のコードの何が悪いのか、私にはよくわかりません。

関連質問:'$query->get( 'tax_query' );'が空を返すのはいつですか?

2
its_me

問題はあなたがtax_query全体を上書きしているということです。あなたがイギリスのカテゴリーアーカイブに行くとき、税の質問はあなたがインターナショナルのために持っているものと同じものを持つように設定されています、しかしあなたは現在の質問にこだわっています。これが解決策です。

...
$tax_query = $query->get('tax_query');
$tax_query['relation'] = 'OR';
// puts the item at the beginning of the array instead of the end.
array_unshift( $tax_query, array(
        'taxonomy' => 'category',
        'field' => 'slug',
        'terms' => 'intl',
        'operator' => 'IN'
    );
$query->set( 'tax_query', $tax_query );
...
1
Eric Holmes