2010-08-10 10 views
2

Mon thème WordPress a une taxonomie personnalisée appelée "Collections". La taxonomie personnalisée est hiérarchique, il existe donc des sous-collections. J'ai une Collection appelée "Livres" et une sous-collection appelée "Romans". Il y a quelques articles qui sont juste dans "Livres", et certains messages qui sont dans "Romans". Je souhaite que la page de la collection "Livres" affiche uniquement les articles de la collection "Livres" principale, pas ceux de la sous-collection "Romans". Mais par défaut, WordPress inclut des messages dans "subcollections" dans la requête pour une taxonomie. Comment puis-je exclure des publications dans des termes enfants de ma requête de taxonomie? C'est facile avec les catégories, mais il semble qu'il n'y a pas de façon intégrée de le faire avec des taxonomies personnalisées.Wordpress: Comment puis-je exclure des publications dans des taxonomies enfants à partir d'une requête de taxonomie personnalisée?


Mise à jour: solution de Jan a parfaitement fonctionné. Voici le code je, placé au-dessus de la boucle dans index.php:

// if is taxonomy query for 'collections' taxonomy, modify query so only posts in that collection (not posts in subcollections) are shown. 
if (is_tax()) { 
if (get_query_var('collection')) { 
    $taxonomy_term_id = $wp_query->queried_object_id; 
    $taxonomy = 'collection'; 
    $unwanted_children = get_term_children($taxonomy_term_id, $taxonomy); 
    $unwanted_post_ids = get_objects_in_term($unwanted_children, $taxonomy); 

    // merge with original query to preserve pagination, etc. 
    query_posts(array_merge(array('post__not_in' => $unwanted_post_ids), $wp_query->query)); 
} 
} 

Répondre

3

Il semble que la classe WP_Query always includes all items of hierarchical taxonomies. Si vous voulez contrer cela, vous pouvez utiliser la même astuce qu'ils utilisent: obtenir tous les sous-éléments de votre article de taxonomie, puis obtenir tous les postes id dans ces sous-éléments, puis les mettre dans le paramètre post__not_in:

$unwanted_children = get_term_children($taxonomy_term_id, $taxonomy); 
$unwanted_post_ids = get_objects_in_term($unwanted_children, $taxonomy); 

Cela se traduira par une requête qui a AND posts.ID IN (1, 2, 3) AND posts.ID NOT IN (2, 3), qui ne renverra que ce message avec l'ID 1. Très peu élégant, mais cela fonctionne.

Bien sûr, si vous suivez cette route, vous pourriez aussi simplement passer l'identifiant de publication que vous voulez, et ne rien dire à la requête sur la taxonomie.

Comment faites-vous cela pour les catégories? The query code seems to include children there too.

+1

Merci, cela a parfaitement fonctionné! Avec les catégories, vous pouvez utiliser le paramètre "category__in", qui n'inclut pas les publications dans les catégories enfants. Malheureusement, Wordpress n'a pas encore de paramètre équivalent pour les taxonomies personnalisées hiérarchiques. – shipshape