web-dev-qa-db-fra.com

Modèle de taxonomie personnalisé ne respectant pas 'include_children' => 'false'

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é?

3
CalvT

Essaye ça:

  1. Comme @gdaniel l'a dit, vous donnez une chaîne à la place de la valeur booléenne. Remplacer 'include_children' => 'false' par 'include_children' => false (supprimer la citation de false)
  2. Vous pouvez vous connecter au 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' );
1
hkchakladar

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;
0
cjbj

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 );
0
Jesse Sutherland