WordPressカスタマイズ事例

サイト運用途中で追加したカスタムフィールドを条件にして絞り込みをする方法

サイトを運用していて、追加の要望が生まれたとします。
 
たとえば、
「今は日付の最新順で5件表示してもらってるお知らせ欄ですが、重要なお知らせ事項が発生して、これだけずっと固定で表示させておきたいんだけど、できますか?」
 
という要望。
この場合は、お知らせ投稿に「TOP固定」というチェックボックスを設けて、それにチェックがある記事について、TOPに固定するように処理を入れればいいわけです。
カスタムフィールドでフィールドタイプを「真/偽」にして、以下のように記述すればいけるはず。

$count=6; //表示件数

$posts_news = get_posts( array(
	'post_status' => 'publish',
	'category' => '1',
	'numberposts' => $count,
	'orderby' => 'desc',
	'meta_query' => array(
		array(
			'key'=>'fix_top', //TOP固定
			'value'=>'1',
			'compare'=>'=='
		),
		'relation'=>'AND',
	)
));

$fix_count=count($posts_news);
if($fix_count<$count){
	$add_posts_news = get_posts( array(
		'post_status' => 'publish',
		'category' => '1',
		'numberposts' => $count-$fix_count,
		'orderby'	=>	'desc',
		'meta_query' => array(
			array(
				'key'=>'fix_top',
				'value'=>'1',
				'compare'=>'!='
			),
			'relation' => 'AND',
		)
	));
}
$posts_news = array_merge($posts_news,$add_posts_news);

if($posts_news){
	foreach( $posts_news as $p ){

		/* 省略 */

	}
}

ところが、これですと、「TOP固定」でない記事はまったく表示されません。
20行目から33行目でTOP固定じゃない記事を取得しようとしているんですが、カスタムフィールドのキー自体が存在しない記事に関しては完全スルーになってしまうんです。
つまり、過去の記事については、さっき新規で追加したカスタムフィールド自体が存在しないので、絞り込み条件対象外となり完全にスルーされてしまうと、そういうことです。

だったら、「存在しない」という条件も追加すればいい、ということになります。

答えはこちら。

$count=6;

$posts_news = get_posts( array(
	'post_status' => 'publish',
	'category' => '1',
	'numberposts' => $count,
	'orderby' => 'desc',
	'meta_query' => array(
		array(
			'key'=>'fix_top',
			'value'=>'1',
			'compare'=>'=='
		),
		'relation'=>'AND',
	)
));

$fix_count=count($posts_news);
if($fix_count<$count){
	$add_posts_news = get_posts( array(
		'post_status' => 'publish',
		'category' => '1',
		'numberposts' => $count-$fix_count,
		'orderby'	=>	'desc',
		'meta_query' => array(
			array(
				'key'=>'fix_top',
				'value'=>'1',
				'compare'=>'!='
			),
			array(
				'key' => 'fix_top',
				'compare' => 'NOT EXISTS'
			),
			'relation' => 'OR',
		)
	));
}
$posts_news = array_merge($posts_news,$add_posts_news);

if($posts_news){
	foreach( $posts_news as $p ){

		/* 省略 */

	}
}

31-34行目で、 ’compare’ => ‘NOT EXISTS’ と記述し、’relation’ => ‘OR’ にすることで、カスタムフィールドのキー自体が存在していない記事についても条件合致で拾ってくれるようになります。

カスタムフィールドの運用途中での追加って結構あると思います。
憶えておくと便利です。


関連するWordPressカスタマイズ事例