Wie schließe ich eine benutzerdefinierte Taxonomie von der Post-Schleife aus?


22

Gibt es eine einfache oder einfache Möglichkeit, alle Posts von einer benutzerdefinierten Taxonomie in der Schleife auszuschließen? Ich habe hoch und tief geschaut und weder SE, SO noch Google scheinen eine klare Antwort zu haben.

Ich weiß, dass dies über eine WPDB-Abfrage erfolgen kann, aber das scheint nur ein riesiges Seil zu sein, um nach etwas zu springen, das ziemlich einfach sein sollte.


5
Gibt es Beiträge mit Begriffen in dieser Taxonomie oder beziehen Sie sich auf einen bestimmten Begriff in Ihrer benutzerdefinierten Taxonomie? Beispiel: Wenn meine Taxonomie Obst ist und ich zwei Begriffe habe, Apfel und Orange, möchte ich alle Beiträge mit Obst oder nur die mit Äpfeln ausschließen?
16.

@ t31os erweitern F: post_tag, category, link_category usw. sind allesamt eingebaute Taxonomien. Selbst wenn Sie Post-Tags als "Begriffe" bezeichnen würden, handelt es sich dennoch nur um eine Taxonomie (nicht hierarchisch) und auf derselben "Ebene" wie die Taxonomie "Kategorie" (hierarchisch).
Kaiser

Um mit @ t31os fortzufahren, Beispiel: Ich versuche, alle Posts auszuschließen, die in der Taxonomie enthalten sind (unabhängig davon, ob sie in "Äpfeln", "Birnen" oder "Orangen" enthalten sind).
Thomas

Antworten:


13

Sie möchten den NOT EXISTSOperator zusammen mit der Übergabe des Taxonomie-Slugs verwenden, wodurch die Abfrage angewiesen wird, keine der ausgewählten Kategorien aus Ihrer benutzerdefinierten Taxonomie in die Schleife aufzunehmen.

Um alle Posts auszuschließen, die sich in der Taxonomie "fruit" befinden (unabhängig von der Fruchtart), ist hier das Snippet:

$args = array(
    'post_type'      => 'post',
    'tax_query'      => array(
        array(
            'taxonomy' => 'fruit',
            'operator' => 'NOT EXISTS'
        )
    )
);

$query = new WP_Query( $args );

2
Das sieht so aus, als ob es effizienter sein sollte, als NOT INXX Nummer von zu sagen terms. Diese Liste von Begriffen kann sehr umfangreich werden, sie sollte jedoch alle Begriffe mit dem Namen dieser Taxonomie abdecken.
Italiensoda

Während dies die Antwort auf die Frage des OP ist (positiv bewertet), möchten die meisten von uns wahrscheinlich einen bestimmten Begriff oder eine Reihe von Begriffen ausschließen. Dafür möchten Sie diese Antwort .
rinogo

26

Die Lösung dafür ist nicht wirklich so bekannt, aber sie sollte es sein.

Sie können Folgendes tun:

$args['tax_query'] = array(
    array(
        'taxonomy' => 'category',
        'terms' => array('cat', 'dog'),
        'field' => 'slug',
        'operator' => 'NOT IN',
    ),
);
query_posts($args);

Das Operatorargument kann andere Ausdrücke annehmen, aber der obige Code besagt im Grunde, dass alle Posts aus der Taxonomie "Kategorie" abgerufen werden, die nicht die Ausdrücke "Katze" oder "Hund" enthalten.


Klug. Aber dann müsste ich immer noch jeden Begriff in dieser Taxonomie manuell eingeben, richtig?
Thomas

Es tut mir leid, dass ich dir nicht folge. Im Terms-Array definieren Sie die Termwerte, die Sie von Ihrer Schleifenabfrage ausschließen möchten. Wenn Sie möchten, dass sie dynamisch sind, können Sie jedem Beitrag möglicherweise einen benutzerdefinierten Metawert hinzufügen und dann in Ihrer Abfrage nach dem Wert dieses Metaschlüssels suchen und diesen so festlegen, wenn Sie dies meinen.
Dwayne Charrington

Ah. Ich verstehe, was du meinst, aber das ist wirklich umständlich.
Thomas

Ich habe nicht wirklich nachgesehen, aber es muss doch ein Plugin geben, das das macht, wonach du fragst?
Dwayne Charrington

8

So geht's für benutzerdefinierte Beitragstypen und benutzerdefinierte Taxonomien:

$happening = new WP_Query(
array( 
  'post_type'  => 'news',        // only query News post type
  'tax_query' => array(
    array(
        'taxonomy'  => 'news-cat',
        'field'     => 'slug',
        'terms'     => 'media', // exclude items media items in the news-cat custom taxonomy
        'operator'  => 'NOT IN')

        ),
   )
);

Dies funktionierte perfekt, um benutzerdefinierte Taxonomie vom benutzerdefinierten Beitragstyp auszuschließen. Ich wollte nur den Abfrage-Schleifencode hinzufügen, um das Snippet zu vervollständigen: while ($ the_query-> have_posts ()): $ the_query-> the_post ();


0

Ich habe Folgendes getan, um Posts von einem bestimmten Taxonomiebegriff auszuschließen:

$argos = array( 
    'tax_query' =>  array (
        array(
            'taxonomy' => 'topics', // My Custom Taxonomy
            'terms' => 'college', // My Taxonomy Term that I wanted to exclude
            'field' => 'slug', // Whether I am passing term Slug or term ID
            'operator' => 'NOT IN', // Selection operator - use IN to include, NOT IN to exclude
        ),
    ),
    'post_type'=>'page', // Post type I want to show, can be a custom post type too
    'posts_per_page' => -1,
    'orderby' => 'title',
    'order'=>'ASC',
    'post_parent' =>$post->ID // show child posts or pages of current page/post
); 

$query = new WP_Query( $args );

0
query_posts( array(
    'post_type' => 'listings',
    'tax_query' => array(
        array(
            'taxonomy' => 'status',
            'field'    => 'slug',
            'terms'    => 'sold',
            'operator' => 'NOT IN'
            ),
        )
    )
);

Dieser Code schließt status => sold from post_type => listings aus


-1

Ich benutze das "RYO 'Category Visibility' WordPress Plugin", das ziemlich gut zu funktionieren scheint.

Auf einer Admin-Seite können Sie entscheiden, welche Kategorien in verschiedenen Bereichen sichtbar oder ausgeschlossen sind.

http://ryowebsite.com/wp-plugins/category-visibility/

-Adam


4
Es scheint mir, dass es übertrieben ist, ein zusätzliches Plugin installieren zu müssen, um dies zu tun. Ich würde es vorziehen, meine Abhängigkeiten auf ein Minimum zu beschränken, und es muss sicher eine Möglichkeit geben, dies in der Schleife zu tun.
Thomas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.