Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

【WordPressで特定のカテゴリの記事「だけ」に特定の要素(バナーやテキストリンクなど)を表示する方法】

例えばですが、特定のカテゴリの記事を見てくれた方に、特定のリンクとかバナーとかを表示させたいときが私はあります。「他のカテゴリーでは見えないけど、このカテゴリーの記事を見てくれた方には、ピンポイントでこのリンクも参考として見てほしいです。ぜひこれも!」みたいな。

同じカテゴリの最新記事とか、関連記事とか、そういうコンテンツとはまた別の位置づけで私は結構よく使います。特に、「他のカテゴリでは見えないけど」ってところをやりたい。

そんなときは、WordPressでは便利な方法がありますので、ご紹介します~。もし興味がございましたら、ご覧くださいませ。

「in_category」を使います

テンプレートタグ/in category – WordPress Codex 日本語版」を参考に、サンプルコードを引用いたします~。

サンプルコード

<?php if ( in_category( $category, $_post ) ): ?>
  // ここにカテゴリ特有の PHP/HTML を書く
<?php endif; ?>

パラメーター

「in_category( $category, $_post )」の「$category」「$_post」に値を指定するんですが、下の様ようなルールがあります。

$category

mixed) (必須) ID (整数)、名前またはスラッグ (文字列)、あるいはそれらの配列で指定されるカテゴリー

初期値: なし

IDは、整数むき出しでも文字列として書いてもどちらでも構いません。

in_category(5)
in_category(‘5’)

$_post

mixed) (オプション) 投稿 (整数 ID あるいはオブジェクト)。デフォルトは Loop の現在の投稿あるいは主クエリの投稿。

初期値: なし

Codexの和訳がわかりやすかったので、そのまま引用しました。が、それでもわけがわからない方も多くいらっしゃると思います。

ここは、具体的にいってみよう

「in_category」を使って、私のブログを例にします~。

「『作ったプラグイン』カテゴリーに入っている記事を表示した場合は、最近作ったプラグイン専用のFacebookページを紹介させたい」と思いました。他のカテゴリーに表示させるのはちょっと・・・(食べ物とか旅行とかのカテゴリーには、表示させてもあんまり意味がないかなと思いまして)というわけで、下の3パターンのどの方法でも同じ結果が得られます。お好みで使いましょう~。

1.特定のカテゴリの「ID」を入れる

カテゴリのIDを調べる方法は、こちらの記事「【WordPressの管理画面からカテゴリーのIDを調べる方法】」で書きましたので、ご参考くださいませ。

<?php if( in_category( '155' ) ) { ?>
Facebookページ作りました~
<?php } ?>

2.特定のカテゴリの「名前」を入れる

カテゴリ名は「作ったプラグイン」です。

<?php if( in_category( '作ったプラグイン' ) ) { ?>
Facebookページ作りました~
<?php } ?>

3.特定のカテゴリの「スラッグ」を入れる

スラッグは「dev-plugin」です。

<?php if( in_category( 'dev-plugin' ) ) { ?>
Facebookページ作りました~
<?php } ?>

複数のカテゴリも指定できる

配列を使って、複数のカテゴリを指定できます。具体的には下のようにします。

<?php if( in_category( array( 'WordPress', '作ったプラグイン' ) ) ) { ?>
Facebookページ作りました~
<?php } ?>

上のコードは、「『WordPress』と『作ったプラグイン』のカテゴリ名に入っている記事を見てくれた方に、Facebookページを表示」させています。

指定するカテゴリーには、こんなルールがあるんですって

codexによると、カテゴリーについて以下のように説明されています。

in_category() は、投稿に直接割り当てられているカテゴリー(新規投稿/編集でチェックしたカテゴリー)のみを考慮します。そのカテゴリーの親は考慮しません(Testing if a post is in a descendant category も参考にしてください)。

えっと・・・?つまりこういうことかな。。

「WordPress」カテゴリにチェック

in_category( array( 'WordPress', '作ったプラグイン' ) ) → true
in_category( 'WordPress' ) → true
in_category( '作ったプラグイン' ) → false

「WordPress」と「作ったプラグイン」にチェック

in_category( array( 'WordPress', '作ったプラグイン' ) ) → true
in_category( 'WordPress' ) → true
in_category( '作ったプラグイン' ) → true

「作ったプラグイン」にチェック

in_category( array( 'WordPress', '作ったプラグイン' ) ) → true
in_category( 'WordPress' ) → false
in_category( '作ったプラグイン' ) → true

特定のカテゴリーの子カテゴリーを効率よく全部対象にしたい場合

カテゴリー指定のルールも理解したところで、例えば「WordPress」の子カテゴリーが今後どんどん増えていくとして、その度に「in_category」に増えた子カテゴリも追記していく運用ってのは、面倒っすね。なので、codexにはもう一つ別の関数を使ってやるといいよ!って書いてあると思います。それが、「post_is_in_descendant_category」関数らしいです。下のコードはcodexのものをそのまんま掲載してます。

post_is_in_descendant_category」関数

<?php
/**
 * Tests if any of a post's assigned categories are descendants of target categories
 *
 * @param int|array $cats The target categories. Integer ID or array of integer IDs
 * @param int|object $_post The post. Omit to test the current post in the Loop or main query
 * @return bool True if at least 1 of the post's categories is a descendant of any of the target categories
 * @see get_term_by() You can get a category by name or slug, then pass ID to this function
 * @uses get_term_children() Passes $cats
 * @uses in_category() Passes $_post (can be empty)
 * @version 2.7
 * @link http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category
 */
function post_is_in_descendant_category( $cats, $_post = null )
{
	foreach ( (array) $cats as $cat ) {
		// get_term_children() accepts integer ID only
		$descendants = get_term_children( (int) $cat, 'category');
		if ( $descendants && in_category( $descendants, $_post ) )
			return true;
	}
	return false;
}
?>

上のコードは、「functions.php」などにあらかじめ追記をしておけばいいですね。それで、私のブログでは「WordPress」カテゴリのIDは「10」なので、以下のように書きます。

「WordPress」カテゴリー配下の子カテゴリーすべてのカテゴリに適用させる

<?php if ( in_category( 'WordPress' ) || post_is_in_descendant_category( 10 ) ) { ?>
Facebookページ作りました~
<?php } ?>

あと、この「in_category」は、メインクエリ以外、ループ外にも使えるとのことです。また、全体を通してcodexの内容を端折った部分もいくつかありますので、詳細は、「テンプレートタグ/in category – WordPress Codex 日本語版」でご確認ください。

何かのご参考となりましたら幸いです。

著者:bouya Imamura

このページについてコメントする

コメントを残す

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

お名前,メールアドレスが仮のものですとコメントが反映されない場合があります