J'ai un problème.
<?php query_posts('category_name=events&posts_per_page=2&offset=1'); ?>
<?php while (have_posts()) : the_post(); ?>
<div>
<?php $children = get_categories('child_of=3');
foreach ($children as $child) {
$child = get_category($child);
echo $child->cat_name;
}; ?>
</div>
<?php endif; ?>
<?php endwhile; ?>
J'aimerais afficher le nom actuel de la sous-catégorie de toute catégorie parente.
Avec cela, je n'arrive à sortir que tous les noms de sous-catégories du parent spécifié ...
Je n'ai pas utilisé the_category()
car il génère les noms de sous-locataires encapsulés dans une liste et j'aimerais qu'ils soient dépourvus de balises.
Je soupçonne que vous êtes tombé dans un malentendu auquel beaucoup de nouveaux utilisateurs sont confrontés, mais que vous réalisez rarement.
Je suppose que vous avez fait ceci:
C'est mauvais et suggère un manque de compréhension sur le fonctionnement des catégories. Cela causera également des problèmes dans votre code lorsque vos hypothèses ne correspondent pas à la réalité. Mais ne vous inquiétez pas, tout le monde commet cette erreur (moi-même inclus).
Par exemple, nous ne disons pas aux gens qu’une maison est aussi un bâtiment, ils savent déjà que les maisons sont un type de bâtiment, et nous n’avons pas à dire aux gens que les chats et les chiens sont des animaux qu’ils connaissent, de la même manière que vous n'avez pas besoin de dire à WordPress que votre message est dans la catégorie "événement" s'il est déjà dans la sous-catégorie "conférence" ou "groupe d'intérêt", car il sait déjà que la catégorie "événement" contient ces informations. .
Ce qui aurait dû être fait est ceci:
Ici, même si je n'ai coché que la catégorie enfant, toutes les publications sous enfant apparaîtront également dans les archives de la catégorie parent, car "parent" contient "enfant" .
Les catégories enfants ne sont pas des descendants des catégories parent. Les catégories enfants sont contenues par catégories parentales.
Ainsi, dans votre cas, vous saisissez la catégorie actuelle de la publication et rencontrez les problèmes suivants:
Qu'as tu besoin de faire:
query_posts
, sérieusement, forcez votre éditeur à hurler klingon quand vous le tapez, ayez un missile USB en mousse jouet, faites de votre fond d'écran un bassin de sang, ne l'utilisez jamais . Vous n'avez aucune excuse pour l'utiliser. Aucun.C'est votre code actuel:
$children = get_categories('child_of=3');
foreach ($children as $child) {
$child = get_category($child);
echo $child->cat_name;
}
Cela listera tous les noms de catégories. Dans notre exemple avec les catégories parent et enfant cochées, ceci affichera ceci:
parentchild
Premièrement, utilisons une meilleure fonction, plus générique, et gérons les balises et les taxonomies personnalisées:
$categories = wp_get_object_terms( get_the_ID(), 'cat');
Ensuite, vous devez vérifier que le message a bien des catégories:
if(!empty($categories)){
Et que ce n'était pas une erreur:
if(!is_wp_error( $categories )){
Alors passez en boucle sur vos termes, mettons-les dans une liste de Nice:
echo '<ul>';
foreach($product_terms as $term){
Imprimez-les:
echo '<li><a href="'.get_term_link($term->slug, 'product').'">'.$term->name.'</a></li>';
et fermez la boucle:
}
echo '</ul>';
}
}
Cela vous donne une liste complète de toutes les catégories sur un post. Maintenant, pour la partie avec laquelle vous rencontrez des problèmes. Vous voulez seulement afficher les sous catégories. Nous devons donc vérifier si la catégorie est une sous-catégorie avant de l'afficher, ce que vous ne faites pas.
Alors:
echo the term
Devient:
if the term has no parent
echo the term
Vous pouvez vérifier si un terme a un parent en faisant:
if ( $term->parent != 0 ) {
Vous avez également un problème que vous ignorez, que se passe-t-il si j'ai 3 niveaux de catégories plutôt que 2? Qu'en est-il des sous-sous-catégories? Pour gérer cela, vous souhaitez peut-être uniquement afficher le niveau le plus bas, ou uniquement les sous-catégories et non les sous-sous-catégories. Pour ce faire, vous devez savoir si un terme de catégorie a des enfants.
Vous pouvez également vérifier si un terme a des enfants en faisant:
if ( !empty( $term->children ) ) {
Je laisse l'assemblage du code final comme une tâche pour le lecteur, mais si vous comprenez ce qui a été dit, vous comprendrez ce qui doit être fait (et les lignes à copier où coller).
Cela ne corrigera pas les utilisateurs vérifiant les deux catégories, vous devez donc faire attention à cela. Les moyens de contourner ce problème incluent d'empêcher les utilisateurs de vérifier la catégorie parent en utilisant une interface utilisateur de boîte radio personnalisée au lieu de l'interface utilisateur de case à cocher standard.
C'est également pourquoi une archive de catégorie contient également tous les articles des sous-catégories.
Tout d’abord, vous ne devriez pas utilisez query_posts
pour exécuter des requêtes personnalisées. Du codex lui-même
Remarque: Cette fonction n'est pas destinée à être utilisée par des plugins ou des thèmes. Comme expliqué plus tard, il existe de meilleures options plus performantes pour modifier la requête principale. query_posts () est une façon trop simpliste et problématique de modifier la requête principale d'une page en la remplaçant par une nouvelle instance de la requête. Il est inefficace (ré-exécute les requêtes SQL) et échouera carrément dans certaines circonstances (particulièrement lorsqu'il s'agit de pagination de publications). Tout code WP moderne devrait utiliser des méthodes plus fiables, telles que l'utilisation du hook pre_get_posts, à cette fin.
Vous devriez utiliser WP_Query
pour cette requête personnalisée
$args = array(
'category_name' => 'events',
'posts_per_page' => 2,
'offset' => 1
);
$myquery = new WP_Query( $args );
while ($myquery->have_posts()) : $myquery->the_post();
<-----YOUR LOOP CONTENTS----->
endwhile;
wp_reset_postdata();
EDIT 1 & EDIT 2
--SCRAPPED--
EDIT 3
Voici un travail autour du code de wp_list_categories()
.
Vous devez d’abord obtenir l’ID de la catégorie parente à l’aide de get_the_category()
$categories = get_the_category();
$parentid = $categories[0]->category_parent;
Cet ID parent peut ensuite être retransféré à wp_list_categories()
pour afficher uniquement les catégories enfants de ce parent spécifique. Si aucune catégorie enfant n'existe, le nom de la catégorie parent sera renvoyé. Sinon, si le parent a des enfants, les catégories enfants seront renvoyées.
Voici la fonction complète
<?php
$taxonomy = 'category';
// get the term IDs assigned to post.
$post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
// separator between links
$separator = ', ';
$categories = get_the_category();
$parentid = $categories[0]->category_parent;
if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {
$term_ids = implode( ',' , $post_terms );
$terms = wp_list_categories( 'title_li=&style=none&echo=0&child_of=' . $parentid . '&taxonomy=' . $taxonomy . '&include=' . $term_ids );
$terms = rtrim( trim( str_replace( '<br />', $separator, $terms ) ), $separator );
// display post categories
echo $terms;
}
?>