web-dev-qa-db-fra.com

wp_list_categories: obtenir les dernières vedettes_image de la catégorie

Je pensais à un moyen plus agréable d'afficher les catégories dans ma barre latérale. Au lieu d'un style de liste simple, j'aimerais que des images/vignettes apparaissent également.

Actuellement, j'utilise les éléments suivants:

<?php wp_list_categories('show_last_updated=1&show_count=1&title_li='); ?> 

Il suffit d'afficher le nom/lien + nombre de postes de chaque catégorie. Je veux garder cela, mais aussi y ajouter une vignette.

J'ai parcouru ce forum pour trouver des réponses et j'ai également réfléchi à la façon de le faire, mais je n'ai pas encore trouvé de solution.

Je suppose que je dois créer une fonction qui récupère l'image sélectionnée du dernier message de cette catégorie. Si un article a plus de catégories, cela ne devrait pas non plus causer de problèmes.

Créer une boucle avec une seule publication dans cette catégorie et ne générer que la vignette serait une option, mais il serait préférable de la définir de manière à ce que la correspondance entre la vignette et la catégorie puisse être compliquée. Je suis sûr qu'il doit y avoir une meilleure façon de le faire.

Je ne cherche pas de plugin (car j'en suis sûr, il y en a), je veux le coder en dur.

Si quelqu'un a une bonne idée ou des conseils sur la façon de procéder, aidez-moi, s'il vous plaît.

Merci beaucoup!

1
japanworm

Vous pouvez utiliser un Walker personnalisé , le plus simple étant dans votre cas le Walker_Category et l'étendre de la manière suivante:

class CategoryThumbnail_Walker extends Walker_Category {
    // A new element has been stumbled upon and has ended
    function end_el( &$output, $category, $depth, $args ) {
        // Output the standard link ending
        parent::end_el( &$output, $category, $depth, $args );

        // Get one post
        $posts = get_posts( array(
            // ...from this category
            'category' => $category->cat_ID,
            'numberposts' => 1
        ) );
        // If a post has been found
        if ( isset($posts[0]) ) {
            // Get its thumbnail and append it to the output
            $featured = get_the_post_thumbnail( $posts[0]->ID, 'thumbnail', null );
            $output .= $featured;
        }
    }
}

Désormais, votre wp_list_categories peut utiliser ce programme en fournissant un argument supplémentaire walker comme ceci:

wp_list_categories( array('walker' => new CategoryThumbnail_Walker()) );

Comme vous pouvez le constater, nous avons deux requêtes supplémentaires pour chaque catégorie, une pour obtenir le dernier message et l'autre pour obtenir son image en vedette. Assurez-vous donc que cette surcharge est bien prise en compte.

Si vous souhaitez personnaliser davantage la sortie, vous devez remplacer toutes les fonctionnalités de end_el ou start_el pour la classe Walker_Category.

Les doublons

Pour vous assurer qu’aucune image en double n’est affichée, vous devez procéder comme suit:

  • stocker l'image affichée dans un tableau
  • vérifier avec chaque nouvelle image si elle existe dans le tableau
  • s'il existe - obtenir le prochain message et vérifier son image
  • s'il n'existe pas, ajoutez-le au tableau et à la sortie
  • comprendre ce que vous faites, comment cela fonctionnera et comment vous transformer en code fonctionnel dans votre contexte (en lisant la documentation et en apprenant plus sur PHP et WordPress)

Donc, le code ressemblerait à quelque chose comme ça:

class CategoryThumbnail_Walker extends Walker_Category {

    // A new element has been stumbled upon and has ended
    function end_el( &$output, $category, $depth, $args ) {
        // Output the standard link ending
        parent::end_el( &$output, $category, $depth, $args );

        // Get one post
        $posts = get_posts( array(
            // ...from this category
            'category' => $category->cat_ID,
            'numberposts' => 10
        ) );

        // we'll record the seen images here
        if ( !isset($this->images_seen) ) $this->images_seen = array();

        foreach ( $posts as $post ) {
            // Get its thumbnail and append it to the output
            $featured = get_the_post_thumbnail( $post->ID, 'thumbnail', null );
            // have we already seen this image?
            if ( in_array($featured, $this->images_seen) ) continue;
            else {
                $this->images_seen []= $featured;
                $output .= $featured;
                break;
            }
        }
    }
}
1
soulseekah

Je sais que vous avez dit que vous ne souhaitiez pas utiliser de plug-in, mais je vais quand même recommander ceci: Taxonomie des images

Vous pouvez toujours le coder en dur dans votre fichier de fonctions. Il ajoute une petite interface agréable aux catégories pour ajouter une image spécifique à chaque catégorie, et fournit quelques moyens simples d’obtenir cette image sur vos pages. Cela fonctionne également sur les taxonomies personnalisées sans aucun problème.

Je mentionne le plugin parce que, pour un projet sur lequel je travaillais, j’essayais de votre première approche (montrer uniquement l’image sélectionnée du dernier message de cette catégorie), mais quand un message en particulier appartenait à plus d’une catégorie, la même image était affichée. répété plusieurs fois et avait l'air génial.

Avoir une image pour chaque catégorie a gardé une apparence cohérente. Le plugin est facile à utiliser, le client peut donc changer l’image sans aucun problème. J'ai aussi écrit une petite déclaration if au cas où le client aurait créé une nouvelle catégorie mais n'a pas réussi à ajouter une image, de sorte qu'il a ensuite utilisé la vignette du dernier message de cette catégorie (une sorte de longue haleine mais vous obtenez le point) :

 <?php
      while ($my_query->have_posts()) : $my_query->the_post(); ?>
        <!--thumbnail -->
<? /*asks if the category has an image...else use the post Thumbnail...then  if not use the wedding.jpg  */ ?>
<span  class="lighten"><a href="<?= add_query_arg('t', strtolower($term->name), home_url( '/videos/' )); ?>">

    <?php 
    $image_link =  "<a href=".home_url( '/' ).(strtolower($term->name)).">";
    $image = apply_filters( 'taxonomy-images-list-the-terms', '', array(
        'taxonomy'     => 'video_types',
        'image_size' => 'detail',
        'after'        => '',
        'after_image'  => '',
        'before'       => '',
        'before_image' => ''
         )
    );


    if ( ! empty( $image ) ) {print $image;}

            elseif ( has_post_thumbnail() ) {the_post_thumbnail(); } 
             else { ?>
    <img src="<?php bloginfo('template_directory'); ?>/images/weddings.jpg" alt="<?php echo $term->name;?>" />
    <?php } ?></a></span><!--#lighten -->
        </div><!--#thumb -->
           <?php
          endwhile;
          ?>
      <?php
        }
      }
    }
    wp_reset_query();  // Restore global post data stomped by the_post().
    ?>
2
endle.winters