WordPressのget_postsでアイキャッチがある記事だけのリストをつくる

WordPressのget_postsでアイキャッチがある記事だけのリストをつくる

アイキャッチの設定してある記事だけを、指定数リストに出力する方法をいろいろ試してみました。おまけとして、アイキャッチの「無い」記事だけを取得する方法もあります!


代替画像のない記事リストを出したい

ちょっと前にフッターのレイアウトを変えまして、そこで出している「ピックアップ」という名のランダム記事リンクに、アイキャッチを一緒に表示させることにしました(以前はテキストだけでした)。

160713-1

このブログを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とすると、全件取得してくれます。

以上です! どなたかのお役に立てたら幸いです!

公開日:2016/07/13

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)