Taxonomie sur mesure WP_Query tous les termes dans une taxonomie?
Question
Y at-il un moyen facile de requête pour tous les postes qui est associé à aucune terme d'une taxonomie particulière?
Je sais cette technique:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
Mais je voudrais passer soit un caractère générique à la place de term_slug, ou peut-être juste une chaîne vide. Ensuite, cela me donnerait tous les messages qui sont marqués par un terme dans cette taxonomie, pas seulement un terme spécifique.
Merci pour votre aide, Dave
La solution
Avec le recul, je l'ai fait un mashup de suggestion MikeSchinkel et t31os. Il est possible d'injecter que pour les requêtes existantes à la volée, mais il a besoin de WordPress 3.1:
Plugin pour obtenir un flux RSS pour les messages contenant un terme d'une taxonomie.
Autres conseils
Je rencontrais une situation similaire Dave. Ce code a fait l'affaire pour mes besoins. Ce n'est pas l'option la plus maigre dans le monde, mais il fait bien le 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,
),
),
) );
Espérons que cela vous aide ou quelqu'un d'autre connaît la question.
Kevin
Quelque chose comme ce travail pourrait:
$args = array( 'post_type' => 'post', 'tax_query' => array( array( 'taxonomy' => 'your_custom_taxonomy', 'operator' => 'EXISTS' ), ), ); $query = new WP_Query( $args );
Vous demandez essentiellement pour un poste attribué à un terme dans your_custom_taxonomy.
Salut Morris @ Dave:
Vous avez raison, WordPress décide si vous ne disposez pas d'un terme, ils vont tout simplement ignorer votre taxonomie.
Il y a trois (3) principales approches vous pouvez essayer:
-
Utilisez une requête SQL complète avec
$wpdb->get_results()
, -
Obtenir une liste de
$post->ID
s pour tous les postes de votre taxonomie et les transmettre ensuite en utilisant l'argument'post__id'
ou -
annoter le SQL utilisé par
WP_Query
avec l'un des crochets qui vous permettent d'ajouter un estINNER JOIN
SQL faisant référence aux tables de taxonomie.
J'essaie d'éviter SQL complète dans WordPress jusqu'à ce qu'il ne peut pas être aidé ou il est tout simplement retourner une liste d'ID. Et dans ce cas, j'éviter de tirer une liste de $post-ID
s pour une utilisation avec l'argument 'post__id'
parce qu'il pourrait rencontrer des problèmes de performance et même des problèmes de mémoire si vous aviez beaucoup de messages. Alors que nous laisse avec # 3.
J'ai créé une classe d'étendre WP_Query
appelé PostsByTaxonomy
qui utilise le crochet 'posts_join
». Vous pouvez 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 appellerait cette classe comme vous le voyez ci-dessous. Le 'taxonomy'
argument est un nécessaire , mais vous pouvez passer une (tous?) des autres paramètres qui attend de WP_Query
aussi bien, comme '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
au fichier functions.php
de votre thème, ou vous pouvez l'utiliser dans un fichier .php
d'un plugin peut être écrit.
Si vous voulez tester rapidement que je l'ai posté une version autonome du code Contenu essentiel que vous pouvez télécharger et copier sur votre racine du serveur Web comme test.php
, pour modifier votre cas d'utilisation, puis demander à votre navigateur en utilisant une URL comme http://example.com/test.php
.
UPDATE
Omettre Post-it Post des messages 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 ne comprend PostsByTaxonomy
messages collants, vous pouvez le mettre 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 affiché ce qui précède, j'ai appris « » caller_get_posts sera dépréciée et 'ignore_sticky_posts'
sera utilisé dans WordPress 3.1.
Vous devriez juste être en mesure de définir la taxonomie et negate pour inclure un terme ..
Par exemple.
<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>
Ce qui serait à peu près la même que la requête a effectue des archives de taxonomie.