Obtenir l'intersection de deux personnalisée Taxonomy Termes pour un type post personnalisé?
-
16-10-2019 - |
Question
( Note Modérateurs : était à l'origine intitulé "Comment get_posts d'un type de poste personnalisé qui est en deux taxonomies personnalisées" )
J'ai un type de poste personnalisé qui a deux taxonomies qui sont séparés, l'un appelé "Type de projet" et un appelé "Package" . Je dois obtenir une liste de projets qui sont de "Type de projet" A
et "Package" A
. J'ai essayé en utilisant le code suivant:
$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);
$my_posts = get_posts($args);
Mais cela devient tous les postes qui sont sur Type de projet A OU Forfait A.
Est-il possible de dire à get_posts()
que je veux retourner uniquement les postes qui sont dans DEUX taxonomies?
La solution
$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);
Ensuite, faire une nouvelle requête et vérifier:
$foo = new WP_Query($args);
var_dump($foo->posts);
J'ai testé sur mon propre configuration de taxonomie personnalisée, et il ne retourne les messages qui correspondent les termes dans la requête.
Une autre méthode pratique de saisir plusieurs termes de taxonomie avec QMT construit des requêtes simples URL:
site.com/?post_type=portfolio&package=foo&project=bar
Je l'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, le raffinage en ajoutant des termes et des taxonomies supplémentaires. La syntaxe fonctionne également très bien avec une entrée de recherche, comme plusieurs mots dans le champ d'entrée sont affichés comme bar foo +, qui fonctionne très bien avec QMT:
site.com/?post_type=portfolio&project=alpha&colors=red+blue+green
qui renvoie uniquement aux postes qui répondent à tous ces critères - Type: Portfolio / projet: Alpha / Couleurs: rouge vert + bleu +
Autres conseils
Salut @shaun :
@Rarst est juste en ce sens qu'ils sont ajouter cette fonctionnalité à WordPress v3.1 , mais il ne sera pas là pendant un certain temps et je suis sûr que vous en avez besoin maintenant. Vous pouvez essayer de saisir le code qu'ils travaillent sur et essayer de le faire fonctionner , vous pouvez utiliser le plugin à la fois @Rarst et @somatic mention, ou vous pouvez simplement inclure le code dont vous avez 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 du format (c.-à-deux points-virgules) où les valeurs sont terme limaces :
"{$varname1}:{$value1},{$varname2}:{$value2},...{$varnameN}:{$valueN}"
Ceci est un .php
autonome, vous pouvez tomber dans la racine de votre site Web pour le tester avant de tirer l'appel add_action
et la fonction tax_terms_where()
dans le fichier functions.php
de votre thème (ou dans le fichier .php
d'un de vos 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 parce que, par exemple, vous préférez faire correspondre le $term->term_id
au lieu de chercher le $term->slug
alors le code ne doit pas être trop difficile à modifier pour vos besoins, vous êtes à l'aise en supposant avec SQL et .php
.
Vieux Q, mais est apparemment en voici donc l'état actuel -. Requêtes de taxonomie se sont nettement améliorées en 3.1 et plus depuis
Ces jours-ci, il sera traitée facilement avec requête fiscale en utilisant la relation AND
, par 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 rel="nofollow"> taxonomie pour une documentation complète.
Usual disclaimer - Je ne l'avais pas sali avec des trucs sur mesure moi-même jusqu'à présent.
Je pense que les requêtes de taxonomie complexes ne sont pas mises en œuvre dans le noyau WP (encore). Essayez Interrogation multiples taxonomies plugin.