私はこの質問を見つけました:
pre_get_postsフィルタで$ query-> set( 'tax_query'を使う方法はありますか?
これはそうであることを示しているようです、あなたはpre_get_posts()によって分類アーカイブの分類クエリを変更することができます。だから私は思い付きました
add_action('pre_get_posts', 'kia_no_child_terms' );
function kia_no_child_terms( $wp_query ) {
if( is_tax() ) {
$wp_query->tax_query->queries[0]['include_children'] = 0;
}
}
と同様
add_action('pre_get_posts', 'kia_no_child_terms' );
function kia_no_child_terms( $wp_query ) {
if( is_tax() ) {
$tax_query = $wp_query->get( 'tax_query' );
$tax_query->queries[0]['include_children'] = 0;
$wp_query->set( 'tax_query', $tax_query );
}
}
include_childrenパラメータをfalseに設定しようとしています。しかし、これまでのところ、分類法アーカイブではまだ子用語の項目を表示しています
そして、次のテストはそれらを上書きするのではなく追加の税照会を追加するように思われる…それは私を混乱させるだけです。
function dummy_test( $wp_query){
$tax_query = array(
'relation' => 'OR',
array(
'taxonomy' => 'tax1',
'terms' => array( 'term1', 'term2' ),
'field' => 'slug',
),
array(
'taxonomy' => 'tax2',
'terms' => array( 'term-a', 'term-b' ),
'field' => 'slug',
),
);
$wp_query->set( 'tax_query', $tax_query );
);
add_action('pre_get_posts','dummy_test');
sETは現在の値を上書きしませんか?
これをpre_get_postsやparse_queryのどのような組み合わせでもうまく動作させることはできませんでした。私はそれが作られた後にクエリオブジェクトを一掃することによって比較的簡単にそれを行うことができます。私はそれが好きではありませんb/cそれから私は2回クエリを実行していますが、私は私のウィットの終わりに「効率的」になろうとしています
function kia_no_child_taxonomies(){
if(is_tax()){
$args = array(
'tax_query' => array(
array(
'taxonomy' => get_query_var('taxonomy'),
'field' => 'slug',
'terms' => get_query_var('term'),
'include_children' => FALSE
)
)
);
query_posts($args);
}
}
add_action('wp','kia_no_child_taxonomies');
だから誰かがw /より良い答えが来るまで、これが私がこれまでに見つけた唯一の方法です。
編集:
@Tanner Mousheyからの答えを応用して、私はついにこの作業を行い、非効率的な二重照会なしでpre_get_posts
フックの分類アーカイブからすべての子用語を除外することができました。
function kia_no_child_taxonomies( $query ) {
if( is_tax() ):
$tax_obj = $query->get_queried_object();
$tax_query = array(
'taxonomy' => $tax_obj->taxonomy,
'field' => 'slug',
'terms' => $tax_obj->slug,
'include_children' => FALSE
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
endif;
}
add_action( 'pre_get_posts', 'kia_no_child_taxonomies' );
私はこれが古い質問であることを知っています、しかしそれは少し紛らわしくてそしてうまくいけば誰かを助けるでしょう。 `$ query-> setが機能しないのは、クエリが既に解析されているので、今度はtax_queryオブジェクトも更新する必要があるためです。これが私のやり方です。
function my_tax_query( $query ) {
$package_id = 12345;
$tax_query = array(
'taxonomy' => 'package_id',
'terms' => array( $package_id ),
'field' => 'slug',
'operator' => 'IN',
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
}
add_action( 'pre_get_posts', 'my_tax_query' );
Wordpress 3.7では、この目的のために parse_tax_query
という名前の新しいアクションが追加されました。
function kia_no_child_terms($wp_query) {
$wp_query->tax_query->queries[0]['include_children'] = 0;
}
add_action('parse_tax_query', 'kia_no_child_terms');
このフックはquery_varsとtax_queryの両方の値を変更します。 pre_get_posts
メソッドを使用すると、少なくとも私にとっては、分類法クエリが重複していました。
3.7より前のバージョンでは、他の回答で詳しく説明されているように、代わりにpre_get_posts
アクションを使用する必要があります。
私のような人たちがこの問題に立ち往生していた人にとって、私は何か便利なことがわかった。優先システムを使用しました
function kia_no_child_taxonomies( $query ) {
if( is_tax() ):
$tax_obj = $query->get_queried_object();
$tax_query = array(
'taxonomy' => $tax_obj->taxonomy,
'field' => 'slug',
'terms' => $tax_obj->slug,
'include_children' => FALSE);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
return $query;
endif;
}
add_action( 'pre_get_posts', 'kia_no_child_taxonomies',0 );
私の質問は結果に含まれておらず、検索は私の除外で壊れていました。これが役立つことを願っています