web-dev-qa-db-ja.com

wp_list_categories:カテゴリの最新のfeatured_imageを取得する

サイドバーにカテゴリを表示するためのもっと良い方法を考えていました。普通のリストスタイルではなく、画像やサムネイルも表示したいです。

現在私は以下を使っています:

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

各カテゴリの名前/リンク+投稿数を表示するだけです。それを維持したいのですが、それにサムネイルも追加したいのです。

私はこのボードを見て答えを探し、またその方法を考えましたが、まだ解決策を見つけることができませんでした。

そのカテゴリの最新の投稿の特集画像を取得する関数を作成する必要があると思います。投稿にさらにカテゴリがある場合でも、問題は発生しません。

そのカテゴリ内に1つの投稿のみを含むループを作成してサムネイルのみを出力することはオプションですが、サムネイルとカテゴリの一致が面倒になるように設定することをお勧めします。もっと良い方法があるはずです。

私はプラグインを探しているのではないので(私はそれがあると確信しているので)、私はそれをハードコーディングしたいです。

誰かがこれに近づくための良いアイデアやアドバイスをお持ちの場合は、私を助けてください。

どうもありがとうございました!

1
japanworm

あなたはカスタム ウォーカー を使うことができます。あなたの場合はそのうち最も簡単なものはWalker_Categoryであり、それを以下のように拡張します。

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

これであなたのwp_list_categoriesはそのような追加のwalker引数を与えることによってそのウォーカーを利用することができます:

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

ご覧のとおり、カテゴリごとに2つのクエリが追加されています。1つは最新の投稿を取得するためのもの、もう1つはその注目画像を取得するためのものです。

さらに出力をカスタマイズしたい場合は、end_elクラスのstart_elまたはWalker_Categoryのすべての機能をオーバーライドする必要があります。

重複

重複した画像が表示されないようにするには、次のことを行う必要があります。

  • 表示されている画像を配列に格納する
  • それが配列の中に存在するかどうか、すべての新しい画像でチェックする
  • 存在する場合 - 次の投稿を取得してその画像を確認します
  • 存在しない場合は配列に追加して出力する
  • 自分のしていること、それがどのように機能するのか、そしてあなたの文脈でどのようにして実用的なコードに変換するのかを理解する(ドキュメントを読み、PHPとWordPressについてもっと学ぶことによって)

そのため、コードは次のようになります。

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

私はあなたがあなたがプラグインを使用したくないと言ったことを知っています、しかし、私はまだこれを推薦するつもりです: 分類法イメージ

あなたはいつでもあなたの関数ファイルにそれをハードコードすることができます。それは各カテゴリに特定の画像を追加するためのカテゴリに素晴らしい小さなインターフェースを追加し、あなたのページにその画像を得るためのいくつかの簡単な方法を提供します。カスタム分類法でも問題なく機能します。

私が取り組んでいるプロジェクトのために私があなたの最初のアプローチを試みていたのでそのプラグインについて言及します(ただそのカテゴリーの最新の投稿の特集画像を見せるために)しかし特定の投稿が複数のカテゴリーにあったとき何度も繰り返しファンキーに見えた。

各カテゴリの画像を持つことで、一貫した外観が保たれました。プラグインは使いやすいので、クライアントは問題なく画像を変更できます。私はまた、クライアントが新しいカテゴリーを作成したが、そのカテゴリーの最新の投稿のサムネイルを使用するように画像を追加できなかった場合のちょっとしたif文を書きました(ちょっと長めですがあなたはポイントを得ます)。 :

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