Ändern Sie die Taxonomieseiten, um Elemente in untergeordneten Taxonomien auszuschließen

18

Ich habe diese Frage gefunden:

Gibt es eine Möglichkeit, $ query-> set ('tax_query' im pre_get_posts-Filter zu verwenden?

Dies scheint darauf hinzudeuten, dass Sie die Taxonomieabfrage in Taxonomiearchiven über pre_get_posts () ändern können. Also habe ich mir etwas ausgedacht

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

ebenso gut wie

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

um zu versuchen, den include_children-Parameter auf false zu setzen ... und fast jede Kombination der beiden, die mir einfällt. Bisher zeigt das Taxonomiearchiv jedoch immer noch die Elemente im untergeordneten Begriff an

und der folgende Test scheint nur die zusätzlichen Steuerabfragen HINZUFÜGEN, anstatt sie zu überschreiben ... was mich nur verwirrt.

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

soll SET den aktuellen Wert nicht überschreiben?

helgatheviking
quelle
Bitte schauen Sie sich diese Antwort an . Das sollte dich weiter bringen.
Kaiser
danke, aber das ist so ziemlich das, was ich versucht habe. var_dumps / print_rs von $ wp_query global zeigen diese neue Steuerabfrage zusätzlich zu der vorhandenen Abfrage anstelle von ... an, zumindest auf meiner Taxonomieseite.
Helgatheviking
Ja, dieser Code soll der Abfrage hinzugefügt werden.
Kaiser
Gibt es also keine Möglichkeit, die vorhandene Abfrage anzupassen / zu überschreiben? b / c, was ich will, ist, den include_children-Parameter zu ändern
helgatheviking

Antworten:

22

Ich weiß, dass dies eine alte Frage ist, aber sie ist etwas verwirrend und wird hoffentlich jemandem helfen. Der Grund, warum $ query-> set nicht funktioniert, ist, dass die Abfrage bereits analysiert wurde und dass wir jetzt auch das Objekt tax_query aktualisieren müssen. So habe ich es gemacht:

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
quelle
Süss!! Ich habe dies überprüft und konnte Ihren Code so anpassen, dass er für alle Taxonomien funktioniert. Dies war die ursprüngliche Frage. +1 (ich würde dir mehr Upvotes geben, wenn ich könnte)
helgatheviking
Ich war überrascht und zuversichtlich, dass diese Methode auch für Datumsabfragen funktioniert.
David
14

Ab Wordpress 3.7 parse_tax_querywurde genau zu diesem Zweck eine neue Aktion namens hinzugefügt.

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

Dieser Hook ändert die Werte von query_vars und tax_query. Die Verwendung der pre_get_postsMethode führte zu doppelten Taxonomie-Abfragen, zumindest für mich.

Vor 3.7 müssen Sie pre_get_postsstattdessen die Aktion verwenden, wie in den anderen Antworten beschrieben.

leepowers
quelle
In meinem Fall scheint das etwas zu weit zu reichen und hat unbeabsichtigte Nebenwirkungen ... es verhindert, dass die Untermenüs meiner Navigation angezeigt werden.
Manu
2
@Manu - du hast vollkommen recht. Das Beispiel ist sehr vereinfacht und zeigt nur die relevanten Variablen. In einem realen Szenario sollten Sie $wp_queryVorlagen-Tags oder beides oder eine andere Logik verwenden, um zu bestimmen, ob die Abfrage überhaupt geändert werden soll.
leepowers
5

Ich konnte das mit keiner Kombination von pre_get_postsoder zum Laufen bringen parse_query. Ich kann es relativ einfach tun, indem ich das Abfrageobjekt lösche, nachdem es erstellt wurde. Ich mag es nicht, weil ich die Abfrage dann zweimal durchführe, aber ich bin mit dem Versuch, "effizient" zu sein, am Ende.

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

Bis jemand eine bessere Antwort findet, ist dies die einzige Methode, die ich bisher gefunden habe.

BEARBEITEN:

Nachdem ich die Antwort von @Tanner Moushey angepasst habe, konnte ich mit dieser Funktion endlich alle untergeordneten Begriffe aus einem Taxonomie-Archiv am pre_get_postsHook ausschließen, ohne dass eine ineffiziente Doppelabfrage erforderlich war.

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
quelle
Das ist falsch. Sie sollten stattdessen keine query_posts, pre_get_posts oder request verwenden.
Kovshenin
das ist nicht hilfreich Warum nicht eine Antwort posten, wenn Sie wissen, wie pre_get_posts in dieser Instanz funktioniert? Ich habe natürlich in meiner Frage geschrieben, dass ich es versucht habe, bin aber zu dem Schluss gekommen, dass Sie das Objekt tax_Query nicht über diesen Filter ändern können
helgatheviking
Entschuldigung, hätte hilfreicher sein sollen. Daher wird die echte Steuerabfrage (mit parse_tax_query) erstellt, nachdem pre_get_posts ausgelöst wurde, und in einer tatsächlichen WP_Tax_Query, die alle Steuerabfragen enthält, die aus Abfragevariablen (einschließlich der tax_query-Abfragevariablen) kombiniert wurden, so dass in Ihrem Fall die tax_query-Abfragevariablen und analysiert werden Fügen Sie dann alles an, was über Abfragevariablen verfügbar ist, z. B. category, tag__in und andere. Sie können pre_get_posts verwenden, um vorhandene Abfragevariablen zu entfernen, bevor Sie eigene hinzufügen.
Kovshenin
Danke für die bessere Erklärung. Offensichtlich ist dies alt, und so ging ich mit der Lösung weiter, die ich hatte. Ich konnte den include_childrenParameter nie über den pre_get_postsHook ändern . Ah, gut.
Helgatheviking
Ja, ich dachte, ich bin schon lange nicht mehr hier;)
Kovshenin
2

Für diejenigen, die mich mögen, steckte dieses Problem fest, ich fand etwas Nützliches. Ich habe das Prioritätssystem verwendet

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

Meine Suchanfrage wurde nicht in das Ergebnis aufgenommen und die Suche wurde mit meinen Ausschlüssen abgebrochen. Hoffe das wird helfen.

youkoal
quelle