WordPressのget_postsでアイキャッチがある記事だけのリストをつくる
アイキャッチの設定してある記事だけを、指定数リストに出力する方法をいろいろ試してみました。おまけとして、アイキャッチの「無い」記事だけを取得する方法もあります!
代替画像のない記事リストを出したい
ちょっと前にフッターのレイアウトを変えまして、そこで出している「ピックアップ」という名のランダム記事リンクに、アイキャッチを一緒に表示させることにしました(以前はテキストだけでした)。
このブログをWordPressで始めてからは毎回アイキャッチを設定しているので、新着記事などでは問題ないんですが、WPに移行する前の記事もインポートしてあって、ランダムだとそれも出てきちゃうんですよね。
アイキャッチが設定されてない記事にはnoimageのような代替画像を出す、という手法でももちろんいいんでしょうが、なんというか見栄えがなー、びみょうだなー、と思ってしまいまして。
過去記事のすべてがアイキャッチ無しなら、日付を指定してそれ以降の記事だけ、ということもできるけど、全部じゃない…w あったりなかったり…。。
ということで、「アイキャッチが設定してある記事だけ」を取得してリストにする方法をいろいろ試してみました。
サンプルコード
以下はすべて、functions.phpとかではなく、リストを出したい任意の場所(sideber.phpとかfooter.phpとか)に書くコードです。ランダムで5件出力します。
アイキャッチがない場合、代替画像を表示する方法
せっかくなので、最初にやったnoimage画像を出す方法から。
<?php global $post; $args = array('numberposts' => 5, 'orderby' => 'rand'); $myposts = get_posts( $args ); foreach( $myposts as $post ) { setup_postdata( $post ); if( has_post_thumbnail() ) { //アイキャッチの有無で切替 $rand_img = get_the_post_thumbnail( $post->ID, array(100, 100), array('alt'=>get_the_title()) ); } else { $rand_img = '<img src="noimage.png" width="100" height="100" />'; //代替画像 } ?> <li><?php echo $rand_img; ?><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php } wp_reset_postdata(); ?>
3行目ではランダムで5件を指定しているのだけなので、アイキャッチの有無は関係なく5件取得します。
取得した5件をループさせて、アイキャッチを持っていたら8行目で取得、なかったら10行目で代替画像を取得して、13行目で画像とリンクテキストを出力します。
多めに取得してアイキャッチ有り記事だけカウントして使う方法
<?php global $post; $args = array('numberposts' => 20, 'orderby' => 'rand'); $myposts = get_posts( $args ); $i = 0; //カウント初期値 foreach( $myposts as $post ) { setup_postdata( $post ); if( has_post_thumbnail() ) { //アイキャッチがあったときだけ ?> <li><?php the_post_thumbnail(array(100,100), array('alt'=>get_the_title())); ?><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php $i++; //カウントアップ if ( $i >= 5 ) { break; } //指定数を超えたら終了 } } wp_reset_postdata(); ?>
やっぱり代替画像は見栄えがな…、と思って書いてみたコード。
3行目で、多めに20件くらいランダム記事を取得しておいて、アイキャッチを持っていた時だけ出力し、出力数をカウントしていって5件を超えたらループを抜ける、というもの。
meta_key指定でアイキャッチ有り記事だけ取得する方法
一応目的の実装はできたけどなー、とか思いながら更に調べていたら!
'meta_key' => '_thumbnail_id'
で指定できるんですね…! ありがとうございます!!! 参考にさせていただいて改善したコードがこちら。
<?php global $post; $args = array('numberposts' => 5, 'orderby' => 'rand', 'meta_key' => '_thumbnail_id'); $myposts = get_posts( $args ); foreach( $myposts as $post ) { setup_postdata( $post ); ?> <li><?php the_post_thumbnail(array(100, 100), array('alt'=>get_the_title())); ?><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php } wp_reset_postdata(); ?>
スマート!
わざわざ多めに取得しなくても、アイキャッチ有り記事だけきっちり5件取得してくれます! 最初からこうすればよかった…!!
おまけ:アイキャッチ無し記事だけ取得する方法
上記の方法でアイキャッチ「有り」は簡単に取得できるんですが、「無し」について一発で持ってこれる引数はない模様…。参考の記事もそちらの方法を模索しておられたようです。さきほどの「多めに取得してカウント」という方法が使えそうな気がしたので、わたしも書いてみました。
<?php global $post; $args = array('numberposts' => 20, 'orderby' => 'rand'); $myposts = get_posts( $args ); $i = 0; //カウント初期値 foreach( $myposts as $post ) { setup_postdata( $post ); if( !has_post_thumbnail() ) { //アイキャッチがないときだけ ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php $i++; //カウントアップ if ( $i >= 5 ) { break; } //指定数を超えたら終了 } } wp_reset_postdata(); ?>
3行目で、多めにランダム記事を取得しておいて、アイキャッチを持たない時だけ出力していく、というもの。
ちなみに、総記事数に対してアイキャッチ無し記事の割合が少ないと、20件取得してもその中に5件も出てこないかもしれません。そんなときは3行目の'numberposts'
の数をもっと増やすか、-1
とすると、全件取得してくれます。
以上です! どなたかのお役に立てたら幸いです!
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。