wake-up-neo.com

Einschließlich aller Begriffe in wordpress tax_query

Ich bin ein bisschen verwirrt, warum ich nicht alle Begriffe automatisch in tax_query aufnehmen kann.

Mein Code:

'tax_query' => array(
    array(
        'taxonomy' => 'city',
        'field' => 'slug',
        'terms' => array( nyc, boston, london ),
         )
)

Was ist, wenn ich Dutzende Städte habe? Ist es nicht uncool, alle manuell hinzuzufügen?

2
wp student

Wenn Sie keine Posts haben, die nicht eine Stadt haben, fragen Sie nicht im Wesentlichen alle Ihre Posts ab? Wie auch immer, Eric Holmes hat Recht, dass Sie WP_Query anstelle von query_posts() verwenden sollten.

Sie können jedoch eine Liste aller Begriffe in einer Taxonomie abrufen und diese Werte dann in Ihrer Steuerabfrage verwenden.

// get all terms in the taxonomy
$terms = get_terms( 'city' ); 
// convert array of term objects to array of term IDs
$term_ids = wp_list_pluck( $terms, 'term_id' );

// proceed with tax query
$args = array ('tax_query' => array(
    array(
        'taxonomy' => 'city',
        'field' => 'term_id',
        'terms' => $term_ids,
         )
)
);

$city_posts = new WP_Query( $args );
6
helgatheviking

Verwenden Sie zunächst nicht query_posts. Erstellen Sie stattdessen ein neues WP_Query Objekt.

Zweitens, warum müssten Sie alle Kategorien hinzufügen, wenn Sie buchstäblich ALLE Kategorien hinzufügen? Wäre das nicht dasselbe wie alle Posts zu bekommen? Sie können auch angeben, welche NICHT eingeschlossen werden sollen. dh "Alles außer Chicago".

1
Eric Holmes

Neben der markierten "besten Antwort" gibt es noch eine andere Möglichkeit, die möglicherweise noch schneller ist, da wir nicht erst die Begriffe abrufen und die Namen extrahieren müssen.

Dies wird mit einem Trick erreicht, indem ein nicht vorhandener Operator verwendet wird (keiner von 'IN', 'NOT IN', 'AND', 'EXISTS' und 'NOT EXISTS'). Beispielsweise erledigt die Zeichenfolge 'XXX' die Aufgabe und veranlasst WP, die Fälle während der Abfragegenerierung nicht einzugeben, und daher wird auch die 0 = 1-Verkettung übersprungen.

(Die Fälle befinden sich in der Funktion get_sql_for_clause() der Datei class-wp-tax-query.php, wo die erlaubten Operatoren über Bedingungen geprüft werden und es kein 'else' gibt.).

$args = array ('tax_query' => 
     array(
         array(
              'taxonomy' => 'city',
              //'field' => 'term_id', // <-- not needed, default
              //'terms' => $term_ids, // <-- not needed
              'operator' => 'XXX'     // Use a non-existing operator
         )
     )
);