web-dev-qa-db-fra.com

Comment afficher les articles liés par sous-catégorie et non par catégorie

J'essaie de trouver un moyen d'afficher les publications associées qui appartiennent à une sous-catégorie d'une catégorie parente spécifique en fonction de la sous-catégorie de la publication actuelle. La publication actuelle peut être affectée à plusieurs catégories parentes, mais je souhaite uniquement afficher les publications associées d'une des sous-catégories de la catégorie parente.

Ainsi, par exemple, une publication peut être affectée aux catégories A, B et C, mais je souhaite afficher les publications associées en fonction de la sous-catégorie B de la publication actuelle et ne pas afficher toutes les publications de A, B ou C. Désolé , cette question/problème est difficile à expliquer.

J'utilise ce code pour afficher le nom de la catégorie et les publications, mais je ne sais pas comment en exclure les catégories parent, de sorte que seules les publications de sous-catégorie s'affichent.

More in 
    <?php $category = get_the_category(); 
        if ( in_category(52) || in_category(56) || in_category(57) || in_category(99) || in_category(28) ) {
            echo $category[1]->cat_name; 
        } else {echo $category[0]->cat_name;}
    ?>

<?php if (have_posts() && !(in_category('32'))) : ?>    
    <?php $i = 1; while (have_posts() && $i <= 1) : the_post(); ?>
        <?php $related = get_posts(array('category__in' => wp_get_post_categories($post->ID), 'numberposts' => 1, 'post__not_in' => array($post->ID)));
if($related) foreach( $related as $post) {
        setup_postdata($post); ?>
        <?php the_post_thumbnail('medium'); ?>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                <a href="<?php the_permalink(); ?>"><?php the_excerpt(''); ?></a>
                <?php the_author(); ?></div>    
            <?php } wp_reset_postdata(); ?>
    <?php $i++; endwhile; ?>
<?php endif; ?>

Merci!

1
Sean Henderson

Il existe en effet un moyen beaucoup plus simple de le faire.

Tout d'abord, pour obtenir la catégorie enfant, vérifiez simplement la valeur du parent de chaque catégorie. S'il s'agit d'une catégorie de niveau supérieur, le parent sera 0. La catégorie enfant réussira le test if( 0 != $category->parent ):

$categories = get_the_category();
foreach( $categories as $category ){
    if( 0 != $category->parent )
        $child_cat = $category;
}

Ensuite, recherchez vos publications en utilisant cet ID de catégorie en tant qu'argument cat. Pour afficher une miniature uniquement pour le premier message, vérifiez simplement si le current_post de votre objet de requête est 0. Ce nombre est automatiquement incrémenté pour chaque message de votre boucle, à partir de 0:

if( isset( $child_cat ) ){  
    echo 'More in ' . $child_cat->name;
    $args = array(
        'cat' => $child_cat->term_id,
        'post__not_in' => array( get_the_ID() )
    );
    $related = new WP_Query( $args );
    if( $related->have_posts() ){
        while( $related->have_posts() ){
            $related->the_post();
            if( 0 == $related->current_post ){
                the_post_thumbnail('medium');
            }
            // your template tags, etc..
            the_title();
        }
        wp_reset_postdata();
    }
}

Notez également qu'il n'est jamais nécessaire d'utiliser wp_reset_query() à moins d'écraser le $wp_query global, ce qui ne se produit pas ici.

2
Milo

Alors voici ce que je suis venu avec. Je ne pense pas que ce soit le moyen idéal de coder cela, mais il fait exactement ce dont j'ai besoin.

Cela m’a donné l’étiquette de la section sous-catégorie des articles connexes dans la barre latérale en excluant les catégories parentes:

More in 
    <?php 
        $category = get_the_category();
        $catname = $category[0]->cat_name;
        if ($catname == 'News' || $catname == 'Featured' || $catname == 'Nav Bar News') {
            $catname = $category[1]->cat_name;
                if ($catname == 'News' || $catname == 'Featured' || $catname == 'Nav Bar News') {
                    $catname = $category[2]->cat_name;
                    if ($catname == 'News' || $catname == 'Featured' || $catname == 'Nav Bar News') {
                        $catname = $category[3]->cat_name;
                    }
                }
            } else {
                $catname = $category[0]->cat_name;
            }
            echo $catname;
        ?>

C'est là que ça devient un peu brouillon, mais le code fonctionne pour ce que j'avais besoin de réaliser. J'ai exclu les catégories parentes puis j'ai utilisé la boucle pour afficher les publications de la sous-catégorie associée:

        wp_reset_query();
        $this_post = $post->ID;
        $category = get_the_category($post->ID);
        $category = $category[0]->cat_ID;
        if ($category == '30' || $category == '28' || $category == '99') {
            $category = $category[1]->cat_ID;
            if ($category == '30' || $category == '28' || $category == '99') {
                $category = $category[2]->cat_ID;
                if ($category == '30' || $category == '28' || $category == '99') {
                    $category = $category[3]->cat_ID;
                } 
            }
        } 
        $args = array(
            'category__in' => array($category),
            'post__not_in' => array($this_post)
        );
        $the_query = new WP_Query($args);

        if ( $the_query->have_posts() && !(in_category('32'))) {
            $i = 0; while ( $the_query->have_posts() && $i < 1) {
                $the_query->the_post(); ?>
                        <?php the_post_thumbnail('medium'); ?>
                        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                            <a href="<?php the_permalink(); ?>"><?php echo excerpt(30); ?></a>
                            <?php the_author(); ?>
            <?php $i++; } 
        } else {
            //echo 'no posts';
        }
        wp_reset_postdata();

        wp_reset_query();
        $this_post = $post->ID;
        $category = get_the_category($post->ID);
        $category = $category[0]->cat_ID;
        if ($category == '30' || $category == '28' || $category == '99') {
            $category = $category[1]->cat_ID;
            if ($category == '30' || $category == '28' || $category == '99') {
                $category = $category[2]->cat_ID;
                if ($category == '30' || $category == '28' || $category == '99') {
                    $category = $category[3]->cat_ID;
                } 
            }
        } 
        $args = array(
            'category__in' => array($category),
            'post__not_in' => array($this_post),
            'offset' => 1
        );
        $the_query = new WP_Query($args);

        if ( $the_query->have_posts() && !(in_category('32'))) {
            $i = 0; while ( $the_query->have_posts() && $i < 3) {
                $the_query->the_post(); ?>
                        <a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a>
                    <?php if ($i < 2) { ?>
                        <hr style="width: 92%;">
                    <?php } ?>
            <?php $i++; } 
        } else {
            //echo 'no posts';
        }
        wp_reset_postdata();

J'ai essayé de tout faire en une boucle, mais je ne pouvais pas trouver un moyen d'afficher l'image sélectionnée uniquement pour le premier message, puis d'exclure ce message de nouveau. Si quelqu'un a une façon plus propre d'écrire cela, s'il vous plaît faites le moi savoir.

0
Sean Henderson