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;
?>
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,
));
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
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
?>