小金井にあるWEB制作会社の備忘録

MEMORANDUM

WordPress(ワードプレス)の「tax_query」と「meta_query」を併用して「OR」取得を実装

WordPress(ワードプレス)を使用して特定条件の記事のみ表示する際に、「tax_query」(カスタムタクソノミー)と「meta_query」(カスタムフィールド)を使用する場合が多いのだけれど、併用すると仕様上「両方の条件を満たす記事(AND)」にしかならないようので、「いずれかの条件を満たす記事(OR)」になるよう実装した方法をメモ。

PHP

<ul>
<?php
//tax_queryでの処理
$args1 = array(
    'post_type' => 'your_custom_post_type',
    'tax_query' => array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'your_taxonomy_1',
            'field'    => 'slug',
            'terms'    => 'your_term_1',
        ),
        array(
            'taxonomy' => 'your_taxonomy_2',
            'field'    => 'slug',
            'terms'    => 'your_term_2',
        ),
    ),
);

//meta_queryでの処理
$args2 = array(
    'post_type' => 'your_custom_post_type',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'your_custom_field_1',
            'value'   => 'your_value_1',
            'compare' => '=',
        ),
        array(
            'key'     => 'your_custom_field_2',
            'value'   => 'your_value_2',
            'compare' => '=',
        ),
    ),
);

$query1 = new WP_Query($args1);
$query2 = new WP_Query($args2);

//投稿まとめ用配列の生成
$postslist = array();

if($query1->have_posts()) {
	while($query1->have_posts()) {
		$query1->the_post();
		$postlist[] = array(
			'post_date' => strtotime(get_the_time()),
			'post_title' => get_the_title(),
			'post_link' => get_the_permalink()
		);
	}
}

if($query2->have_posts()) {
	while($query2->have_posts()) {
		$query2->the_post();
		$postlist[] = array(
			'post_date' => strtotime(get_the_time()),
			'post_title' => get_the_title(),
			'post_link' => get_the_permalink()
		);
	}
}

wp_reset_postdata();

// 重複を除外してユニークな投稿配列を取得する
$postlist = array_unique($postlist, SORT_REGULAR );

// 投稿配列を投稿日時でソートする
$sortArray = array_column($postlist, 'post_date');
array_multisort($sortArray, SORT_DESC, $postlist);


//出力
foreach($postlist as $val){
	echo('<li>
		<span class="home__newslist__item__date">'.date('Y年m月j日', $val['post_date']).'</span>
		<span class="home__newslist__item__hedding"><a href="'.$val['post_link'].'">'.$val['post_title'].'</a></span>
		</li>');
}
?>
</ul>

それぞれの条件で投稿リストを取得してから、「$postlist」にまとめ、そこから重複する投稿を削除、更に投稿日時で並び替えするという流れになります。

ランダムで取得する時も同様ですが、ページ送りで2ページ目以降に遷移することを考える場合は取得した配列データ($postlist)をセッションで保存しておいて、適切な範囲を呼び出すことになります。
並び替えの都合上、全ての投稿を取得する必要があり、投稿数が多いと処理が遅くなるのであまり実用的ではないかもしれません。

同一カテゴリーの記事