Ubah halaman Taksonomi untuk mengecualikan item dalam taksonomi anak

18

Saya menemukan pertanyaan ini:

Apakah ada cara untuk menggunakan $ query-> set ('tax_query' di filter pre_get_posts?

yang tampaknya menunjukkan bahwa ya, Anda dapat mengubah kueri taksonomi pada arsip taksonomi melalui pre_get_posts (). jadi saya datang dengan

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;
  }
}

sebaik

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

untuk mencoba mengatur parameter include_children ke false ... dan hampir setiap kombinasi dari keduanya dapat saya pikirkan. Namun sejauh ini, arsip taksonomi masih menunjukkan item dalam istilah anak

dan tes berikut sepertinya menambah ADD permintaan pajak bukannya menimpa mereka ... yang hanya membingungkan saya.

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

bukankah SET harus menimpa nilai saat ini?

helgatheviking
sumber
Silakan lihat jawaban ini . Itu akan membawa Anda lebih jauh.
kaiser
terima kasih, tapi itu sudah banyak yang saya coba. var_dumps / print_rs dari $ wp_query global menunjukkan bahwa permintaan pajak baru sebagai tambahan dari permintaan yang ada dan bukannya di tempat ... setidaknya pada halaman taksonomi saya.
Helgatheviking
Ya, kode itu dimaksudkan untuk menambah kueri.
kaiser
jadi tidak ada cara untuk menyesuaikan / menimpa permintaan yang ada? b / c yang saya inginkan adalah mengubah parameter include_children
helgatheviking

Jawaban:

22

Saya tahu ini adalah pertanyaan lama, tapi agak membingungkan dan mudah-mudahan akan membantu seseorang. Alasan `set kueri-> tidak berfungsi adalah karena kueri telah diuraikan dan sekarang kita juga perlu memperbarui objek tax_query. Inilah cara saya melakukannya:

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' );
Tanner Moushey
sumber
Manis!! Saya memeriksa ini dan mampu mengadaptasi kode Anda agar berfungsi untuk semua taksonomi, yang merupakan pertanyaan awal. +1 (saya akan memberi Anda lebih banyak upvotes jika saya bisa)
helgatheviking
Saya terkejut dan tertekan melihat bahwa metode ini juga berfungsi untuk permintaan tanggal.
David
14

Pada Wordpress 3.7 tindakan baru bernama parse_tax_queryditambahkan persis untuk tujuan ini.

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

Hook ini mengubah nilai query_vars dan tax_query. Menggunakan pre_get_postsmetode menghasilkan duplikat pertanyaan taksonomi, setidaknya bagi saya.

Sebelum ke 3.7 Anda harus menggunakan pre_get_poststindakan sebagai gantinya, sebagaimana dirinci dalam jawaban lainnya.

leepower
sumber
Dalam kasus saya, ini tampaknya terlalu jauh untuk dicapai dan memiliki efek samping yang tidak diinginkan ... mencegah submenu dari navigasi saya muncul.
Manu
2
@ Manu - Anda sepenuhnya benar. Contoh yang diberikan sangat sederhana dan hanya menunjukkan variabel yang relevan. Dalam skenario kehidupan nyata Anda akan memeriksa $wp_query, menggunakan tag templat, atau keduanya, atau beberapa logika lain, untuk menentukan apakah kueri harus dimodifikasi di tempat pertama.
Leepowers
5

Saya tidak bisa menjalankan ini dengan kombinasi pre_get_postsatau parse_query. Saya bisa melakukannya dengan relatif mudah dengan memusnahkan objek permintaan setelah dibuat. Saya tidak suka karena saat itu saya menjalankan kueri dua kali, tetapi akhirnya saya berusaha untuk menjadi "efisien."

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

Jadi sampai seseorang datang dengan jawaban yang lebih baik, ini adalah satu-satunya metode yang saya temukan sejauh ini.

EDIT:

Mengadaptasi jawaban dari @Tanner Moushey, saya akhirnya bisa membuat pekerjaan ini untuk mengecualikan semua istilah anak dari arsip taksonomi di pre_get_postshook tanpa double-query yang tidak efisien.

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' );
helgatheviking
sumber
Ini salah. Anda seharusnya tidak menggunakan query_posts, gunakan pre_get_posts atau permintaan saja.
kovshenin
itu tidak membantu. mengapa tidak memposting jawaban lalu jika Anda tahu cara membuat pre_get_posts berfungsi dalam hal ini? saya jelas diposting dalam pertanyaan saya bahwa saya mencobanya, tetapi sampai pada kesimpulan bahwa Anda tidak dapat memodifikasi objek tax_Query melalui filter itu
helgatheviking
Maaf, seharusnya lebih bermanfaat. Jadi permintaan pajak sebenarnya dibuat (dengan parse_tax_query) setelah pre_get_posts dipecat, dan dalam WP_Tax_Query yang sebenarnya, yang berisi semua permintaan pajak yang digabungkan dari variabel permintaan (termasuk permintaan tax_query var) sehingga dalam kasus Anda ini menguraikan permintaan tax_query var Anda, dan kemudian menambahkan apa pun yang tersedia melalui kueri vars, seperti kategori, tag__in, dan lainnya. Anda dapat menggunakan pre_get_posts untuk menghapus var permintaan yang sudah ada sebelum menambahkan milik Anda.
kovshenin
Terima kasih atas penjelasan yang lebih baik. Jelas ini sudah tua, jadi saya melanjutkan dengan solusi yang saya miliki. Saya tidak pernah bisa memodifikasi include_childrenparameter melalui pre_get_postshook. Baiklah
Helgatheviking
Ya saya pikir, sudah lama tidak di sini;)
kovshenin
2

Bagi mereka yang menyukai saya terjebak dengan masalah ini, saya menemukan sesuatu yang bermanfaat. Saya menggunakan sistem prioritas

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

Permintaan saya tidak termasuk dalam hasil dan pencarian rusak dengan pengecualian saya. Semoga ini bisa membantu.

youkoal
sumber