it-swarm.com.de

Einschließen und Ausschließen von Taxonomien aus Archiven und Feeds mittels "pre_get_posts"

Was versuche ich zu tun?

Mein Blog verwendet eine benutzerdefinierte Taxonomie namens edition mit Begriffen wie us-canada (6), eu (7) und india (8) - term slug (ID).

Ich möchte sicherstellen, dass Posts nicht einer bestimmten 'Edition' zugeordnet unter allen Bedingungen angezeigt werden (dh, wenn ein Post nicht den USA, Europa oder Indien zugeordnet ist, wird er im Archiv angezeigt Seiten all dieser Begriffe).

Was habe ich versucht?

Hier ist der Beispielcode für einen der Begriffe, der Ihnen eine Vorstellung davon geben soll, was ich genau versuche und was ich falsch machen würde.

add_filter('pre_get_posts','better_editions_archive');

function better_editions_archive($query) {

    if ( $query->is_tax( 'edition', 6 ) && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post' ) );

        $query->set( 'tax_query',
            array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'id',
                    'terms' => array( 1, 2, 4, 5 )
                ),
                array(
                    'taxonomy' => 'edition',
                    'field' => 'id',
                    'terms' => array( 7, 8 ),
                    'operator' => 'NOT IN'
                )
            )
        );
    }

    return $query;
}

Was ist los? Der oben genannte Code funktioniert nicht (andere, die ich ausprobiert habe: code-1 , code-2 ), er ändert nichts. Es gibt auch keinen Debug-Fehler.

Also, was könnte ich falsch machen?

ALSO, um sicherzustellen, dass die Änderungen auch für Feeds dieser Begriffe gelten, habe ich die entsprechende Zeile im oben genannten Code folgendermaßen ersetzt:

function better_editions_archive($query) {

    if ( ( $query->is_tax( 'edition', 6 ) && $query->is_main_query() ) || ( $query->is_feed() && $query->is_tax( 'edition', 6 ) ) ) {

Dadurch werden jedoch die Rückmeldungen zu den Term-Archiven umgeleitet. Mit der Funktion leitet example.com/edition/usa/feed/ zurück zu example.com/edition/usa/.

Auch hier habe ich keine Ahnung, was ich falsch machen würde.

UPDATE: Was hat bei mir funktioniert? (Aber...)

add_filter( 'pre_get_posts', 'better_editions_archive' );

function better_editions_archive( $query ) {
    if ( $query->is_tax( 'edition', 6 ) && $query->is_main_query() ) {

        $args = array(
            'post_type' => 'post',

            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'id',
                    'terms' => array( 1, 2, 4, 5 )
                ),
                array(
                    'taxonomy' => 'edition',
                    'field' => 'id',
                    'terms' => array( 7, 8 ),
                    'operator' => 'NOT IN'
                )
            )
        );

        $query->query_vars = $args;
    }

    return $query;
}

Es funktioniert, aber das Problem ist, dass ich eine ausführliche Chat-Diskussion mit einem sachkundigen WordPress-Entwickler geführt habe, und er hat mir Folgendes mitgeteilt (Sie können die vollständige Konversation hier verfolgen, aber sie ist zu langwierig):

Anschließend weisen Sie dieses Array als query_vars zu. Jetzt ist der query_vars ein ziemlich großes Objekt. Und im Grunde überschreiben Sie die Daten dort und fügen nur Ihre benutzerdefinierten hinzu. Dies bedeutet, dass Sie alle standardmäßig hinzugefügten Elemente "deaktivieren".

Er riet ziemlich davon ab, diese Lösung zu verwenden, und entschied sich stattdessen für die Methode $query->set();.

Aber wie Sie oben sehen können, konnte ich den anderen nicht zum Arbeiten bringen. Also bin ich hier, um zu sehen, ob mir jemand sagen kann, was ich falsch mache, in einer weniger technischen Sprache.

5
its_me

Ich mache noch einen Schuss.

Im Folgenden sollte die Hauptabfrage so geändert werden, dass alle Posts in die Schleife aufgenommen werden, die zu kein Begriff der benutzerdefinierten Taxonomie der Edition gehören.

add_filter('pre_get_posts','better_editions_archive');

function better_editions_archive( $query ) {

    if ( $query->is_tax( 'edition' ) && $query->is_main_query() ) {
        $terms = get_terms( 'edition', array( 'fields' => 'ids' ) );
        $query->set( 'post_type', array( 'post' ) );
        $query->set( 'tax_query', array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'edition',
                'field' => 'id',
                'terms' => $terms,
                'operator' => 'NOT IN'
            )
        ) );
    }

    return $query;
}
14
vancoder

Hinweis an sich selbst: @ Vancoder Antwort ist im Grunde eine bessere (& automatisierte) Version davon:

add_filter('pre_get_posts','better_editions_archive');

function better_editions_archive($query) {

    if ( $query->is_tax( 'edition') && $query->is_main_query() ) {

        $query->set( 'post_type', array( 'post' ) );

        $query->set( 'tax_query',
            array(
                array(
                    'taxonomy' => 'edition',
                    'field' => 'id',
                    'terms' => array( 6, 7, 8 ),
                    'operator' => 'NOT IN'
                )
            )
        );

    }

    return $query;
}

(Was der Code sagt) Wenn es das Archiv für einen Begriff ist, der zur benutzerdefinierten Taxonomie 'edition' gehört, dann ...

  1. Der Code beeinträchtigt nicht die Standardfunktion der Archivseiten der Begriffe, d. H. Posts, die einem Begriff der benutzerdefinierten Taxonomie "edition" zugewiesen sind, werden (wie üblich) im Archiv des betreffenden Begriffs angezeigt.

  2. Wenn ein Beitrag jedoch keinem der Begriffe der benutzerdefinierten Taxonomie zugewiesen ist (siehe 'terms' => array( 6, 7, 8 ) und 'operator' => 'NOT IN'), werden diese Beiträge auf den Archivseiten aller Begriffe der benutzerdefinierten Taxonomie angezeigt.

  3. Der Code wirkt sich auch auf die Feeds der genannten Begriffe aus. Daher spiegeln die Feeds den Inhalt der Archivseiten wider, was genau das ist, was ich benötige. Wenn Sie nicht möchten, dass die Feeds betroffen sind, d. H., Wenn die Änderungen nur für die Archivseiten gelten sollen, ersetzen Sie die IF durch Folgendes:

    if ( $query->is_tax( 'edition') && $query->is_main_query() && ! $query->is_feed() ) {
    
1
its_me