web-dev-qa-db-fra.com

Taxonomie personnalisée WP_Query pour tous les termes d'une taxonomie?

Existe-t-il un moyen simple de rechercher des publications étiquetées avec un terme d'une taxonomie particulière?

Je connais cette technique:

$custom_taxonomy_query = new WP_Query( 
 array(
  'taxonomy_name' => 'term_slug',
 )
);

Mais je voudrais soit passer un caractère générique à la place de term_slug, ou peut-être juste une chaîne vide. Cela me donnerait alors tous les articles étiquetés par n’importe quel terme de cette taxonomie, et pas seulement un terme spécifique.

Merci pour votre aide, Dave

6
Dave Morris

En rétrospective, j’ai fait un mashup de MikeSchinkel et de la suggestion t31os. Il est possible d'injecter cela dans les requêtes existantes à la volée, mais il faut WordPress 3.1:

Plugin pour obtenir un flux RSS pour les publications contenant n'importe quel terme d'une taxonomie.

1
hakre

J'ai rencontré une situation similaire Dave. Ce code a fait l'affaire pour mes besoins. Ce n’est pas l’option la plus légère au monde, mais elle fait bien son travail:

// Get all term ID's in a given taxonomy
$taxonomy = 'taxonomy_name';
$taxonomy_terms = get_terms( $taxonomy, array(
    'hide_empty' => 0,
    'fields' => 'ids'
) );

// Use the new tax_query WP_Query argument (as of 3.1)
$taxonomy_query = new WP_Query( array(
    'tax_query' => array(
        array(
            'taxonomy' => $taxonomy,
            'field' => 'id',
            'terms' => $taxonomy_terms,
        ),
    ),
) );

J'espère que cela vous aidera, vous ou toute autre personne confrontée à ce problème.

Kevin

18
Kevin Leary

Quelque chose comme ça pourrait marcher:

 $ args = array (
 'post_type' => 'post', 
 'tax_query' => array (
 array (
 'taxonomie '=>' your_custom_taxonomy ', 
' operator '=>' EXISTS '
), 
), 
); 
 $ query = new WP_Query ($ args); 

Vous demandez fondamentalement toute publication affectée à un terme de your_custom_taxonomy.

5
laurenfs132

Bonjour @ Dave Morris:

Vous avez raison, WordPress décide que si vous n'avez pas de terme, ils vont simplement ignorer votre taxonomie.

Il y a trois (3) approches principales vous pouvez essayer:

  1. Utilise une requête SQL complète avec $wpdb->get_results(),

  2. Obtenez une liste de $post->IDs pour toutes les publications de votre taxonomie, puis transmettez-les à l'aide de l'argument 'post__id', ou

  3. Annote le code SQL utilisé par WP_Queryavec l'un des points d'ancrage permettant d'ajouter un code SQL INNER JOIN faisant référence aux tables de taxonomie.

J'essaie d'éviter le SQL complet dans WordPress jusqu'à ce qu'il ne soit plus possible de l'aider ou qu'il renvoie simplement une liste d'identifiants. Et dans ce cas, j'éviterais de tirer une liste de $post-IDs à utiliser avec l'argument 'post__id' car cela pourrait entraîner des problèmes de performances et même des problèmes de mémoire si vous avez beaucoup de publications. Cela nous laisse donc avec # 3.

J'ai créé une classe à étendre WP_Queryappelée PostsByTaxonomy qui utilise le hook 'posts_join '. Tu peux le voir ici:

class PostsByTaxonomy extends WP_Query {
  var $posts_by_taxonomy;
  var $taxonomy;
  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    unset($args['taxonomy']);
    parent::query($args);
  }
  function posts_join($join,$query) {
    if (isset($query->posts_by_taxonomy)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
  AND {$wpdb->term_taxonomy}.taxonomy='{$this->taxonomy}'
SQL;
    }
    return $join;
  }
}

Vous appelleriez cette classe comme vous voyez ci-dessous. L'argument 'taxonomy' est un obligatoire mais vous pouvez transmettre n'importe quel (all?)) Autres paramètres que WP_Query attend également, tels que 'posts_per_page':

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
));
foreach($query->posts as $post) {
  echo " {$post->post_title}\n";
}

Vous pouvez copier la classe PostsByTaxonomy dans le fichier functions.php de votre thème ou vous pouvez l'utiliser dans un fichier .php d'un plug-in que vous écrivez peut-être.

Si vous voulez le tester rapidement, j'ai posté une version autonome du code dans Gist que vous pouvez télécharger et copier à la racine de votre serveur Web au format test.php, à modifier en fonction de votre cas d'utilisation. , puis demandez à votre navigateur à l'aide d'une URL telle que http://example.com/test.php.

METTRE À JOUR

Pour omettez les post-it-collants parmi les posts inclus dans la requête, essayez ceci:

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
  'caller_get_posts' => true,
));

Ou, s'il est important pour vous que la classe PostsByTaxonomy n'inclue jamais de posts collants, vous pouvez l'insérer dans le constructeur:

  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    $args['caller_get_posts'] = true     // No Sticky Posts
    unset($args['taxonomy']);
    parent::query($args);
  }

MISE À JOUR 2

Après avoir posté ce qui précède, j'ai appris que "caller_get_posts" serait obsolète et que 'ignore_sticky_posts' serait utilisé dans WordPress 3.1.

3
MikeSchinkel

Vous devriez juste pouvoir définir la taxonomie et nier l’inclusion d’un terme.

Par exemple.

<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>

Ce qui serait à peu près identique à la requête effectuée par une archive de taxonomie.

1
t31os