web-dev-qa-db-fra.com

Inclure tous les termes dans wordpress tax_query

Je suis un peu confus. Pourquoi ne puis-je pas inclure automatiquement tous les termes dans tax_query?

Mon code:

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

Et si j'ai des dizaines de villes? N'est-il pas bizarre de tous les ajouter manuellement?

2
wp student

Sauf si vous avez des messages qui not ont une ville, ne cherchez-vous pas essentiellement tous vos messages? Quoi qu'il en soit, Eric Holmes a raison de dire que vous devriez utiliser WP_Query au lieu de query_posts().

Cela dit, vous pouvez obtenir une liste de tous les termes d'une taxonomie, puis utiliser ces valeurs dans votre requête de taxe.

// 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

Tout d'abord, n'utilisez pas query_posts. Créez un nouvel objet WP_Query à la place.

Deuxièmement, pourquoi auriez-vous besoin d'ajouter toutes les catégories, si vous ajoutez littéralement TOUTES les catégories? Ne serait-ce pas la même chose que d'avoir tous les messages? Vous pouvez également spécifier les éléments à ne pas inclure. c'est à dire. "Tout sauf Chicago".

1
Eric Holmes

En plus de la "meilleure réponse", il existe un autre moyen qui pourrait être encore plus rapide, car nous n'avons pas à extraire les termes et extraire les noms en premier.

Ceci est obtenu avec une astuce en utilisant un opérateur non existant (aucun de 'IN', 'NOT IN', 'AND', 'EXISTS' et 'NOT EXISTS'). Par exemple, la chaîne 'XXX' effectue le travail et empêche WP de saisir les observations lors de la génération de la requête. Par conséquent, la concaténation 0 = 1 est également ignorée.

(Les cas sont situés dans la fonction get_sql_for_clause() du fichier class-wp-tax-query.php, où les opérateurs autorisés sont vérifiés via des conditions et où il n'y a pas de 'else'.).

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