web-dev-qa-db-fra.com

Affichage de la sous-catégorie actuelle

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.

2
user52339

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:

a screenshot with the parent and child categories selected at the same time

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:

a screenshot showing only the child category

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:

  • Vous mentionnez la catégorie dans laquelle se trouve l'article, mais un article peut appartenir à plusieurs catégories, pas à une seule catégorie.
  • Vous supposez que la catégorie que vous avez saisie est la catégorie enfant, mais vous avez également coché la catégorie parent; il s'agit donc probablement de la catégorie parent que vous avez sélectionnée; la catégorie enfant est la suivante.
  • Vous avez supposé que c'était la catégorie des enfants, mais ce n'est pas le cas, et maintenant vous essayez de trouver la catégorie des parents et vous échouez car il n'y en a pas.

Qu'as tu besoin de faire:

  • Arrêtez d'utiliser 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.
  • Arrêtez de vérifier chaque terme de la hiérarchie, cochez simplement la sous-catégorie souhaitée. Les catégories contiennent toutes leurs sous-catégories, pas seulement celles qui ont coché cette case.
  • Les articles ont plusieurs catégories, même sans élément parent/sous-catégorie, soyez prudent
  • les boucles foreach ne nécessitent pas de point-virgule à la fin

Donc le code

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.

Glossaire

  • Taxonomie - un système de classification des objets, par ex. catégorie, étiquette, couleur, caste, forme
  • Terme - un classificateur dans une taxonomie, par ex. 'rouge' est un terme dans la taxonomie 'couleur', 'pantalon' est un terme dans une taxonomie 'habillement', 'chat' est un terme dans une taxonomie 'animal', ou 'pop' est un terme dans la 'musique taxonomie du genre. Notez qu'un terme n'est pas une chose en soi, par exemple, les chansons pop appartiennent au terme "pop" de la taxonomie du "genre musical"
  • Catégorie et balises - deux taxonomies intégrées fournies avec WordPress
  • Object - quelque chose qui entre dans un terme de taxonomie, normalement écrit, mais les utilisateurs et les commentaires peuvent également être placés dans des termes et des taxonomies
  • -
5
Tom J Nowell

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;
}
?>
4
Pieter Goosen