web-dev-qa-db-fra.com

Obtenir l'intersection de deux termes de taxonomie personnalisés pour un type de message personnalisé?

( Note du modérateur : A l'origine, l'intitulé "Comment recevoir un article de type personnalisé qui se trouve dans deux taxonomies personnalisées?" )

J'ai un type de message personnalisé qui a deux taxonomies qui sont séparées, l'une appelée "Type de projet" et l'autre appelée "Package" . Je dois obtenir une liste des projets qui sont de "Type de projet" A et "Package" A. J'ai essayé d'utiliser le code suivant:

$args = array(
  'post_type' => 'portfolio', 
  'numberposts' => -1, 
  'project_type' => 'A', 
  'package' => 'A'
); 
$my_posts = get_posts($args);  

Mais cela obtient tous les articles qui sontSOITdans le type de projet A OR Package A.

Existe-t-il un moyen de dire à get_posts() que je souhaite renvoyer uniquement les publications qui se trouvent dansBOTH/ taxonomies?

6
Shaun

À partir de la v1.3, le plugin Query Multiple Taxonomies fonctionne parfaitement avec WP_Query. Vos arguments originaux fonctionnent tels quels.

$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);

Puis faites une nouvelle requête et vérifiez-la:

$foo = new WP_Query($args);
var_dump($foo->posts);

J'ai testé cela sur ma propre configuration de taxonomie personnalisée et elle n'a renvoyé que les publications qui correspondaient à both terms dans la requête.

Une autre méthode pratique pour récupérer plusieurs termes de taxonomie avec QMT consiste à créer des requêtes URL simples:

site.com/?post_type=portfolio&package=foo&project=bar

J'ai utilisé cette méthode avec la fonction add_query_args() pour créer des liens sur une page qui modifient la requête en cours, en l'affinant en ajoutant des termes et des taxonomies supplémentaires. La syntaxe fonctionne également très bien avec une entrée de recherche, car plusieurs mots du champ de saisie sont affichés sous la forme foo + bar, ce qui fonctionne très bien avec QMT:

site.com/?post_type=portfolio&project=alpha&colors=red+blue+green

Qui renvoie uniquement les messages répondant à all ces critères - Type: Portfolio/Projet: Alpha/Couleurs: rouge + bleu + vert

4
somatic

Salut @shaun :

@Rarsta raison de dire qu'ils sont en ajoutant cette fonctionnalité à WordPress v3.1 , mais ce ne sera pas là avant un moment et je suis sûr que vous en avez besoin maintenant. Vous pouvez essayer de prenez le code sur lequel ils travaillent et essayez de le faire fonctionner, vous pouvez utiliser le plugin les deux @Rarstet @somaticmention, ou vous pouvez simplement inclure le code besoin dans votre thème, ci-dessous.

Le code suivant est un crochet posts_where pour ajouter une variable de requête tax_terms avec une valeur de format (c.-à-d. Virgule-virgule)où les valeurs sont term slug :

"{$varname1}:{$value1},{$varname2}:{$value2},...{$varnameN}:{$valueN}"

Ceci est un .php autonome que vous pouvez déposer à la racine de votre site Web pour le tester avant d'extraire l'appel add_action et la fonction tax_terms_where() dans le fichier functions.php de votre thème (ou dans le fichier .php de l'un de vos propres plugins.)

<?php
/*
* Adds "tax_terms" to WP_Query()
*
* See: http://lists.automattic.com/pipermail/wp-hackers/2010-October/035258.html
* See: http://wordpress.stackexchange.com/questions/2255/
*
*/

  header('Content-Type:text/plain');
  include "wp-load.php";
  add_action('posts_where','tax_terms_where',10,2);

  $result = new WP_Query('post_type=portfolio&tax_terms=project_type:A,package:A');
  foreach($result->posts as $post) {
    echo "{$post->post_title}\n";
  }

function tax_terms_where($where,$wp_query) {
  if (isset($wp_query->query)) {
    $query = $wp_query->query;
    if (is_string($query))
      parse_str($query,$query);
    if (is_array($query) && isset($query['tax_terms'])) {
      global $wpdb;
      $tax_terms = explode(',',$query['tax_terms']);
      foreach($tax_terms as $tax_term) {
        list($taxonomy,$term) = explode(':',$tax_term);
        $sql = <<<SQL
AND $wpdb->posts.ID IN (
  SELECT tr.object_id
  FROM $wpdb->term_relationships AS tr
  INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
  INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id
  WHERE tt.taxonomy='%s' AND t.slug='%s'
)
SQL;
        $where .= $wpdb->prepare($sql,$taxonomy,$term);
      }
    }
  }
  return $where;
}

Si ce n'est pas exactement ce dont vous avez besoin car, par exemple, vous préférez faire correspondre le $term->term_id au lieu de correspondre au $term->slug, le code ne devrait pas être trop difficile à modifier pour vos besoins, en supposant que vous maîtrisiez bien SQL et .php.

4
MikeSchinkel

Ancien Q, mais apparemment, voici donc l'état actuel - les requêtes de taxonomie se sont beaucoup améliorées dans la version 3.1 et plus depuis.

De nos jours, il sera facilement traité avec une requête fiscale en utilisant la relation AND, exemple du Codex:

'tax_query' => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'movie_genre',
        'field'    => 'slug',
        'terms'    => array( 'action', 'comedy' ),
    ),
    array(
        'taxonomy' => 'actor',
        'field'    => 'term_id',
        'terms'    => array( 103, 115, 206 ),
        'operator' => 'NOT IN',
    ),
),

Voir Paramètres de taxonomie pour une documentation complète.


Clause de non-responsabilité habituelle - Je ne m'étais pas encore amusée avec les produits personnalisés.

Je pense que les requêtes de taxonomie complexes ne sont pas implémentées dans WP core (pour le moment). Essayez Interrogez plusieurs taxonomies plugin.

1
Rarst