Alt sınıflandırma öğelerindeki öğeleri hariç tutmak için Sınıflandırma sayfalarını değiştirme


18

Bu soruyu buldum:

Pre_get_posts filtresinde $ query-> set ('tax_query' kullanmanın bir yolu var mı?

evet gibi görünüyor, taksonomi arşivlerindeki sınıflandırma sorgusunu pre_get_posts () ile değiştirebilirsiniz. bu yüzden geldim

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

Hem de

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 parametresini false olarak ayarlamaya çalışmak ... ve hemen hemen her kombinasyonun aklıma geldi. Ancak şu ana kadar, sınıflandırma arşivi hala alt dönemdeki öğeleri gösteriyor

ve aşağıdaki test, üzerlerine kafa karıştırmak yerine ek vergi sorguları EKLEMEK gibi görünüyor.

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 geçerli değerin üzerine yazılmamalı mı?


Lütfen bu cevaba bir göz atın . Bu sizi daha da ileriye götürmeli.
kaiser

teşekkürler, ama ben denedim hemen hemen budur. $ wp_query global var_dumps / print_rs, en azından sınıflandırma sayfamda ... yerine mevcut sorguya ek olarak yeni vergi sorgusunu gösteriyor.
Şubat'ta helgatheviking

Evet, bu kod sorguya eklenecek.
kaiser

böylece mevcut sorguyu ayarlamak / geçersiz kılmak için bir yolu yoktur? b / c istediğim include_children parametresini değiştirmek
helgatheviking

Yanıtlar:


22

Bunun eski bir soru olduğunu biliyorum, ama biraz kafa karıştırıcı ve umarım birine yardım eder. `$ Query-> set'in çalışmamasının nedeni, sorgunun zaten ayrıştırılmış olması ve artık tax_query nesnesini de güncellememiz gerektiğidir. İşte nasıl yaptım:

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

Tatlı!! Bunu kontrol ettim ve orijinal soru olan tüm taksonomiler için kodunuzu uyarlamayı başardım. +1 (yapabilseydim sana daha fazla oy veririm)
07'de helgatheviking

Şaşırdım ve bu yöntemin tarih sorguları için de işe yaradığını gördüm.
David

14

Wordpress 3.7'den itibaren parse_tax_querytam olarak bu amaçla yeni bir eylem eklendi.

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

Bu kanca hem query_vars hem de tax_query değerlerini değiştirir. pre_get_postsYöntemi kullanmak , en azından benim için yinelenen sınıflandırma sorgularına neden oldu.

3.7'den önce pre_get_posts, diğer cevaplarda ayrıntılı olarak açıklandığı gibi eylemi kullanmalısınız.


Benim durumumda, bu biraz fazla ulaşıyor ve istenmeyen yan etkileri var ... navigasyonumun alt menülerinin görünmesini engelliyor.
Manu

2
@ Manu - tamamen haklısın. Sağlanan örnek çok basitleştirilmiştir ve yalnızca ilgili değişkenleri gösterir. Gerçek hayat senaryosunda $wp_query, sorgunun ilk etapta değiştirilmesi gerekip gerekmediğini belirlemek için şablon etiketlerini veya her ikisini veya başka bir mantığı kullanabilirsiniz.
leepowers

5

Ben herhangi bir kombinasyonu ile çalışmak için bu alamadım pre_get_postsveya parse_query. Yapıldıktan sonra sorgu nesnesini silerek nispeten kolayca yapabilirsiniz. Bunu sevmiyorum çünkü o zaman sorguyu iki kez çalıştırıyorum, ama "verimli" olmaya çalışarak zekamın sonundayım.

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

Birisi daha iyi bir cevapla gelene kadar, şimdiye kadar bulduğum tek yöntem bu.

DÜZENLE:

@Tanner Moushey'den gelen cevabı uyarlayarak, nihayet bu çalışmayı pre_get_posts, verimsiz çift sorgu olmadan kancadaki bir sınıflandırma arşivinden hariç tutmak için yapabildim .

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

Bu yanlış. Query_posts kullanmamalı, bunun yerine pre_get_posts veya request kullanmamalısınız.
kovshenin

bu yararlı değil. neden bu durumda pre_get_posts çalışmasını biliyorsanız bir cevap yayınlamıyorsunuz? Açıkçası ben denedim benim soru yayınlanmıştır, ancak bu filtre ile tax_Query nesne değiştiremezsiniz sonucuna geldi
helgatheviking

Üzgünüm, daha fazla yardımcı olmalıydı. Bu nedenle, gerçek vergi sorgusu, pre_get_posts tetiklendikten sonra (parse_tax_query ile) oluşturulur ve sorgu değişkenlerinden (tax_query query var dahil) birleştirilen tüm vergi sorgularını (tax_query query var dahil) içeren gerçek bir WP_Tax_Query'de ve kategori, tag__in ve diğerleri gibi sorgu değişkenleri aracılığıyla kullanılabilen her şeyi eklemek. Kendinizinkini eklemeden önce mevcut sorgu çeşitlerini kaldırmak için pre_get_posts komutunu kullanabilirsiniz.
kovshenin

Daha iyi açıklama için teşekkürler. Açıkçası bu eski, bu yüzden sahip olduğum çözüm ile devam ettim. include_childrenParametreyi asla pre_get_postskancadan değiştiremedim . Ah güzel.
helgatheviking

Evet, uzun süredir burada
değildim

2

Benden hoşlananlar için bu konuda sıkışıp kaldım, yararlı bir şey buldum. Öncelik sistemini kullandım

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

Sorgum sonuca dahil edilmedi ve arama, hariç tuttuğum öğelerle kırıldı. Umarım bu yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.