J'ai créé une taxonomie personnalisée, pour un type d'article personnalisé, et créé une page personnalisée pour celle-ci, comme d'habitude, etc.
Le problème est que je veux uniquement afficher les publications personnalisées qui font partie de la catégorie et non les publications des sous-catégories. J'ai donc écrit la requête suivante pour la boucle:
<?php global $wp_query;
$args = array_merge( $wp_query->query_vars, array( 'post_type' => 'product', 'include_children' => 'false' ) );
query_posts( $args );
if(have_posts()) : while(have_posts()) : the_post(); ?>
Bien que 'include_children' => 'false'
soit inclus dans le $args
, il affiche toujours les produits des sous-catégories. J'ai essayé de le changer pour 'post_parent' => 0
et de les utiliser tous les deux en même temps, mais en vain.
Voici le code de ma taxonomie:
function productcat_taxonomy() {
$labels = array(
'name' => _x( 'Product Categories', 'taxonomy general name' ),
'singular_name' => _x( 'Product Category', 'taxonomy singular name' ),
'search_items' => __( 'Search Product Categories' ),
'all_items' => __( 'All Product Categories' ),
'parent_item' => __( 'Parent Product Category' ),
'parent_item_colon' => __( 'Parent Product Category:' ),
'edit_item' => __( 'Edit Product Category' ),
'update_item' => __( 'Update Product Category' ),
'add_new_item' => __( 'Add New Product Category' ),
'new_item_name' => __( 'New Product Category Name' ),
'menu_name' => __( 'Product Categories' ),
);
register_taxonomy('product-category',array('product'), array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'product-category' ),
));
}
add_action( 'init', 'productcat_taxonomy', 0 );
Où est-ce que je me suis trompé?
Essaye ça:
'include_children' => 'false'
par 'include_children' => false
(supprimer la citation de false
)pre_get_posts
pour changer les vars de requête avant d’obtenir les publications. Et lorsque vous vous trouvez sur la page de modèle de taxonomie personnalisée, incluez votre requête personnalisée dans la requête globale. Cela va aux thèmes functions.php
function wpse239243_exclude_child( $query ) {
//if on frontend custom taxonomy template
if( $query->is_tax( 'product-category' ) && $query->is_main_query() && !is_admin() ) {
$tax_query = array( array(
'taxonomy' => 'product-category',
'terms' => $query->get( 'product-category' ),
'include_children' => false
) );
$query->set( 'tax_query', $tax_query );
}
}
add_action( 'pre_get_posts', 'wpse239243_exclude_child' );
Vous avez utilisé 'include_children' => 'false'
, mais vous n'avez pas indiqué à WordPress de quelle taxonomie il s'agit et pas plus que la catégorie de base que vous ne voulez pas des enfants. Vous feriez cela comme suit:
array(
'post_type' => 'product',
'tax_query' => array( array(
'taxonomy' => 'product-category',
'include_children' => 'false'
'terms' => 'base-category-ID',
) ),
);
Au lieu d'un base-category-ID
fixe, vous pouvez bien entendu utiliser une variable contenant le nom de la première catégorie de la publication en cours:
$categories = get_the_category();
$category_id = $categories[0]->cat_ID;
Il y avait beaucoup de codage difficile en cours dans un certain nombre de réponses qui, à mon avis, pourrait avoir des inconvénients plus tard. Voici une approche qui prend le tax_query existant et remplace l'argument "include_children".
En passant, je n'ai pas eu la chance de mettre "include_children" à false dans ce cas. J'ai seulement trouvé un zéro pour travailler.
function wpse239243_exclude_child_taxonomies( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
if (is_tax('product-category')) {
$tax_query = $query->tax_query->queries;
$tax_query[0]['include_children'] = 0;
$query->set( 'tax_query', $tax_query );
}
}
return;
}
add_action( 'pre_get_posts', 'wpse239243_exclude_child_taxonomies', 1 );