WordPress Logo

今日はWordPressの基本的なループ処理を使って、カスタム投稿タイプの一覧を表示する際に、特定のタクソノミーに属する記事を除外する方法を紹介します。

カスタム投稿タイプの利用方法は他の記事でも紹介しているので、ここでは割愛して、プラグインJetpack経由でカスタム投稿タイプの機能を有効化したと仮定して説明を続けます。

通常、カスタム投稿タイプの記事を一覧で表示させるときは以下のようなコードを使います。

<ul>
<?php
$args = array(
	'post_type' => 'jetpack-portfolio'
);
$the_query = new WP_Query( $args );
if($the_query->have_posts()): while($the_query->have_posts()) : $the_query->the_post();
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
</ul>

これは以下のリンク先の記事でも紹介しているとおり。

【WordPress】新機能「カスタム コンテンツ タイプ」の一覧を表示する方法。

このあたりまでは簡単にできるかと思います。

ここからさらに「特定のタクソノミーを除外する」ためのコードを追加します。

Jetpack経由でカスタム投稿タイプを有効化すると、「プロジェクトタイプ」と「プロジェクトタグ」というタクソノミーがデフォルトで設定されるようになります。

例えば、「プロジェクトタイプ」というタクソノミー内に、スラッグが「sample-01」というタームが存在するとしましょう。

この「sample-01」に該当する記事を一覧から除外するためのコードは以下のようになります。

<ul>
<?php
$args = array(
	'post_type' => 'jetpack-portfolio',
	'tax_query' => array(
		array(
			'taxonomy' => 'jetpack-portfolio-type',
			'field' => 'slug',
			'terms' => 'sample-01',
			'operator'  => 'NOT IN'
		)
	)
);
$the_query = new WP_Query( $args );
if($the_query->have_posts()): while($the_query->have_posts()) : $the_query->the_post();
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
</ul>

キモとなるのは「tax_query」内に配列で記述している「taxonomy」「field」「terms」「operator」のそれぞれの値です。

  • 「taxonomy」は、この場合「プロジェクトタイプ」を指しますが、プログラム内ではスラッグが「jetpack-portfolio-type」として処理されていますので、ここでは'taxonomy' => 'jetpack-portfolio-type'になっています。
  • 「field」は、今回はスラッグ名で除外するタームを指定するので値を「slug」にしています。
    初期値は「term_id」で、他にターム名を意味する「name」を指定できます。
  • 「terms」は、除外するタームのIDやスラッグ名を指定します。
    ここでは「sample-01」というスラッグを指定していますね。
  • 「operator」は、今回最も重要なパラメーターで、ここで「NOT IN」を指定することで、所謂「除外」の処理を行うことになります。

これらの使い方は WordPress Codex の「WP_Query」を説明するページでより詳しく紹介されています。
合わせてご覧ください。

http://wpdocs.osdn.jp/関数リファレンス/WP_Query