it-swarm.com.de

wp_list_categories: Liefert das aktuellste Bild der Kategorie

Ich habe mir überlegt, wie ich die Kategorien in meiner Seitenleiste besser darstellen kann. Anstelle eines einfachen Listenstils möchte ich auch Bilder/Miniaturansichten anzeigen.

Derzeit verwende ich Folgendes:

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

Einfach den Namen/Link + Beitragsanzahl jeder Kategorie anzeigen. Ich möchte behalten, dass aber auch ein Thumbnail dazukommt.

Ich habe in diesem Forum nach Antworten gesucht und darüber nachgedacht, wie es geht, aber ich konnte noch keine Lösung finden.

Ich denke, ich muss eine Funktion erstellen, die das vorgestellte Bild des neuesten Beitrags in dieser Kategorie abruft. Wenn ein Post mehr Kategorien hat, sollte das auch keine Probleme bereiten.

Es wäre eine Option, eine Schleife mit nur einem Beitrag in dieser Kategorie zu erstellen und nur das Miniaturbild auszugeben. Sie sollten diese Option jedoch so einstellen, dass die Übereinstimmung von Miniaturbild und Kategorie problematisch ist. Ich bin mir sicher, dass es einen besseren Weg geben muss.

Ich suche kein Plugin (da ich mir sicher bin, dass es welche gibt), ich möchte es fest codieren.

Wenn jemand eine gute Idee oder einen Rat hat, wie man das angeht, dann helft mir bitte.

Vielen Dank!

1
japanworm

Sie können einen benutzerdefinierten Walker verwenden. Der einfachste davon ist in Ihrem Fall der Walker_Category und kann folgendermaßen erweitert werden:

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;
        }
    }
}

Jetzt kann Ihr wp_list_categories diesen Walker verwenden, indem Sie ein zusätzliches walker-Argument wie das folgende angeben:

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

Wie Sie sehen können, haben wir zwei zusätzliche Abfragen für jede Kategorie, eine, um den neuesten Beitrag zu erhalten, und eine, um das entsprechende Bild zu erhalten. Stellen Sie also sicher, dass dieser Aufwand berücksichtigt wird.

Wenn Sie die Ausgabe weiter anpassen möchten, müssen Sie die gesamte Funktionalität von end_el oder start_el für die Klasse Walker_Category überschreiben.

Duplikate

Um sicherzustellen, dass keine doppelten Bilder angezeigt werden, müssen Sie die folgenden Schritte ausführen:

  • speichern Sie das angezeigte Bild in einem Array
  • prüfen Sie bei jedem neuen Bild, ob es im Array vorhanden ist
  • wenn es existiert - nimm den nächsten Beitrag und überprüfe sein Image
  • wenn es nicht vorhanden ist, fügen Sie es dem Array hinzu und geben Sie es aus
  • verstehe, was du tust, wie es funktionieren wird und wie du in deinem Kontext zu Arbeitscode wirst (indem du die Dokumente liest und mehr über PHP und WordPress erfährst)

Der Code würde also ungefähr so ​​aussehen:

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

Ich weiß, dass Sie sagten, Sie wollten kein Plugin verwenden, aber ich werde dies trotzdem empfehlen: Taxonomy Images

Sie können es jederzeit einfach in Ihre Funktionsdatei einprogrammieren. Es fügt den Kategorien eine nette kleine Oberfläche hinzu, um jeder Kategorie ein bestimmtes Bild hinzuzufügen, und bietet einige einfache Möglichkeiten, um dieses Bild auf Ihre Seiten zu bringen. Es funktioniert auch problemlos mit benutzerdefinierten Taxonomien.

Ich erwähne das Plugin, weil ich bei einem Projekt, an dem ich gearbeitet habe, versucht habe, Ihren ersten Ansatz zu verfolgen (um nur das vorgestellte Bild des letzten Beitrags in dieser Kategorie anzuzeigen), aber wenn ein bestimmter Beitrag in mehr als einer Kategorie war, war es dasselbe Bild mehrmals wiederholt und funky aussah.

Ein Bild für jede Kategorie zu haben, hat ein konsistentes Aussehen. Das Plugin ist einfach zu bedienen, sodass der Client das Image problemlos ändern kann. Ich habe auch eine kleine if-Anweisung für den Fall geschrieben, dass der Kunde eine neue Kategorie erstellt hat, aber kein Bild hinzugefügt hat, sodass anschließend die Miniaturansicht des neuesten Posts für diese Kategorie verwendet wird (ziemlich umständlich, aber Sie haben es verstanden). :

 <?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