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
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:
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
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.
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:
Utilise une requête SQL complète avec $wpdb->get_results()
,
Obtenez une liste de $post->ID
s pour toutes les publications de votre taxonomie, puis transmettez-les à l'aide de l'argument 'post__id'
, ou
Annote le code SQL utilisé par WP_Query
avec 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-ID
s à 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_Query
appelé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
.
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);
}
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.
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.