web-dev-qa-db-fra.com

Les messages de toutes les catégories sont affichés à la place d'une catégorie particulière

Créé un type de message personnalisé Menu il a Categories et Sub-Categories.

J'ai réussi à récupérer des sous-catégories de la publication à l'aide de ce code.

<?php
    $wcatTerms = get_terms('menu-items', array('hide_empty' => 0, 'orderby' => 'ASC',  'parent' =>0));
    foreach($wcatTerms as $wcatTerm) : 
        //echo $wcatTerm->name;
        $wsubargs = array('hierarchical'=>1,'show_option_none'=>'','hide_empty'=>0,'parent'=>$wcatTerm->term_id,'taxonomy'=>'menu-items');
        $wsubcats = get_categories($wsubargs);
        foreach ($wsubcats as $wsc):
           $childcat = $wsc->name; ?>
            <h2><?php echo $childcat; ?></h2>

        endforeach;
    endforeach; 

Plus tard, selon mes besoins, je souhaite afficher le message en fonction de sub-category pour avoir utilisé cette query

<?php 
        $posts = get_posts(array(
              'post_type' => 'menu',
              'orderby' => 'name',
              'order' =>  'DESC',
              'taxonomy' => $wcatTerm->taxonomy,
              'term'  => $wcatTerm->slug,
              'category' => '$childcat',
              'nopaging' => true,
              ));
              foreach($posts as $post) {
                  //echo $wsc->name;
              setup_postdata($post); ////set up post data for use in the loop (enables the_title(), etc without specifying a post ID--as referenced in the stackoverflow link above)
            ?>

Mais ce que je reçois, c’est que les catégories sont répertoriées comme elles le devraient, mais ALL les messages sont répétés pour chaque sous-catégorie.

Comme vous pouvez le voir dans la requête, j'ai déjà ajouté 'category' => '$childcat', mais je ne suis toujours pas appliqué par le filtre. S'il vous plaît, aidez-moi à l'obtenir.

Code complet

<?php
$wcatTerms = get_terms('menu-items', array('hide_empty' => 0, 'orderby' => 'ASC',  'parent' =>0));
foreach($wcatTerms as $wcatTerm) : 
    //echo $wcatTerm->name;
    $wsubargs = array('hierarchical'=>1,'show_option_none'=>'','hide_empty'=>0,'parent'=>$wcatTerm->term_id,'taxonomy'=>'menu-items');
    $wsubcats = get_categories($wsubargs);
    foreach ($wsubcats as $wsc):
        ?><h2><?php //echo $wsc->name; ?></h2>
        <?php $childcat = $wsc->name; 
                $childid = $wsc->ID;
        ?>
        <h2><?php echo $childcat; ?></h2>
        <?php 
        $posts = get_posts(array(
      'post_type' => 'menu',
      'orderby' => 'name',
      'order' =>  'DESC',

      'tax_query' => array(
          array(
              'taxonomy' => $wsc->taxonomy,
              'term'  => $wsc->term_id,
              'include_children' => false,
          )
      ),
      'nopaging' => true,
      ));?>
                         <div class="menu-title"><?php the_title(); ?></div>
                         <div class="menu-title"><?php the_content(); ?></div>
                        <?php //endwhile; ?>
            <?php

    endforeach;
endforeach; 
?>
1
dh47

Juste une note avant de commencer, vous ne devez pas appeler votre type de message menu, menu est un terme réservé. Vous risquez donc de rencontrer des problèmes avec les fonctionnalités intégrées par défaut. Vous pouvez toutefois utiliser la forme plurielle menus sans avoir à vous soucier des problèmes liés aux conflits ragard

En ce qui concerne votre code, vous utilisez des paramètres non valides, ce qui est simplement ignoré par WP_Query, qui est à son tour la raison pour laquelle vous récupérez tous les articles indépendamment. Pour les taxonomies personnalisées, vous devez utiliser un tax_query pour interroger les publications appartenant à des termes de taxonomie personnalisés.

Les éléments suivants devraient fonctionner: ( Remarque: il vous suffit de saisir le nom de taxonomie et le terme correct ID dans le tax_query pour votre cas d'utilisation spécifique )

$posts = get_posts(array(
      'post_type' => 'menu',
      'orderby' => 'name',
      'order' =>  'DESC',
      'tax_query' => array(
          array(
              'taxonomy' => $wcatTerm->taxonomy,
              'terms'  => $wcatTerm->term_id,
              'include_children' => false,
          )
      ),
      'nopaging' => true,
      ));

MODIFIER

Les paramètres de catégorie fonctionneront et non , car vous n'utilisez pas la taxonomie intégrée, category. Vous utilisez une taxonomie personnalisée. Par conséquent, pour interroger les publications d'un terme spécifique ou de termes d'une taxonomie personnalisée, vous devez utiliser un tax_query comme dans mon exemple de code.

Comme je l'ai également indiqué, vous devez indiquer les paramètres corrects à votre tax_query car je ne connais pas votre configuration exacte. Le paramètre terms (par défaut) doit être une valeur entière ou un tableau de valeurs entières d'identifiants de terme, tenez-en compte.

Prenons un exemple de votre code

$wsubcats = get_categories($wsubargs);
    foreach ($wsubcats as $wsc):

Dans cette boucle foreach, vos valeurs tax_query seront les suivantes:

  • Votre valeur taxonomy sera $wsc->taxonomy

  • Votre valeur terms sera (int) $wsc->term_id

EDIT 2

En parcourant votre code, les erreurs sont nombreuses. J'ai corrigé toutes ces erreurs dans votre code et je les ai commentées à l'intérieur du code, assurez-vous donc de vérifier mes commentaires. Si j'ai indiqué supprimer , supprimez cette ligne de code spécifique car elle n'est pas nécessaire. De plus, je ne sais pas si vous avez vraiment besoin de termes vides, alors je l’ai laissée et je n’ai qu’à intégrer une protection pour éviter les bugs et les erreurs s’il existe des termes réellement vides.

<?php
$taxonomy = 'menu-items'; // Do not use hypens in taxonomy names, only use underscores
$term_args = array(
    'hide_empty' => 0, // Why do you need empty terms? 
    'orderby' => 'ASC',  
    'parent' => 0
);
$wcatTerms = get_terms(
    $taxonomy, // Taxonomy name
    $term_args // Array of arguments to get terms by
);
// To avoid bugs and errors, run this only if we have a valid array of terms
if (    !empty( $wcatTerms ) // Check that we do not have an empty array 
     && !is_wp_error( $wcatTerms ) // Check that we do not have a WP_Error object returned
) { 
    // If our conditional check passed, then only run the following code
    foreach($wcatTerms as $wcatTerm) { // Do not use : as it is hard to debug and to read, use old style curlies
        //echo $wcatTerm->name;
        $wsubargs = array(
            //'hierarchical'=>1, // This is default, not needed and can be removed
            //'show_option_none'=>'', // Invalid parameter, where do you get this from, to remove
            'hide_empty'=> 0, // Why do you need empty terms?
            'parent'=>$wcatTerm->term_id,
        );
        //$wsubcats = get_categories($wsubargs); // Why use get_categories, get_categories uses get_terms, to remove
        $wsubcats = get_terms( 
            $taxonomy, // We have set this earlier
            $wsubargs
        );
        foreach ( $wsubcats as $wsc ) { // Again, do not use : as it is hard to debug
            ?><h2><?php //echo $wsc->name; ?></h2>
            <?php $childcat = $wsc->name; ?>
            <h2><?php echo $childcat; ?></h2>
            <?php 
               //$posts = get_posts(array( // Do not mess with $posts global, rather use $posts_array, to remove
            $args = array(
                'post_type' => 'menu', // Really bad name, reserved name in Wordpress
                'orderby' => 'name',
                'order' =>  'DESC',
                'tax_query' => array(
                    array(
                        'taxonomy' => $taxonomy, // We have defined this already right at the start
                        'terms  => $wsc->term_id,
                        'include_children' => false,
                    )
                ),
                'nopaging' => true,
            );
            $posts_array = get_posts( $args );

            // You are missing the loop here, that is why you are getting the same stuff over and over again
            if ( $posts_array ) { // Only run this if we actually have posts, if we do not have posts, we will have bugs and errors
                foreach ( $posts_array as $post ) { // You were missing this
                    setup_postdata( $post ); // VERY VERY IMPORTANT, without this, the template tags like the_content will not work
                    ?>
                             <div class="menu-title"><?php the_title(); ?></div>
                             <div class="menu-title"><?php the_content(); ?></div>

                <?php } // endforeach $posts_array
                wp_reset_postdata(); // VERY IMPORTANT to reset the $post global to main query
            } // endif $posts_array
        } // endforeach $wsubcats
    } // endforeach $wcatTerms
} // endif check for valid array of terms
?>
1
Pieter Goosen