WordPressをカスタマイズするなら絶対覚えておきたい条件分岐やカスタム投稿タイプなどいろいろ

Posted under - WordPress

57

WordPress をカスタマイズするなら覚えておきたい条件分岐タグと、カスタマイズにとっても便利なカスタム投稿タイプについて、簡単にまとめてみました。

WordPress Conditional Tag

WordPress をカスタマイズするなら、必ずと言っていいほど使うのが条件分岐タグ。ブログとして Webサイトを構築するなら、とってもよく使う … というほどではないかもしれませんが、一般的な Webサイトを WordPress で構築していくとなると、動的な Webサイトであればあるほど、条件分岐タグはよく使います。

また、話は変わっちゃいますけど、WordPress 3.0 から本格的に採用された新機能、カスタム投稿タイプも、WordPress でのサイト構築にはかなり便利です。おなじみの条件分岐タグから、カスタム投稿タイプ、タクソノミーまでを、メモっぽくまとめてみました。

WordPress サイト構築 Tips 目次

  1. WordPressの 条件分岐タグ
  2. カスタム投稿タイプを使ってみよう
  3. カスタム分類(タクソノミー)とは?
  1. もうちょっと実用的にカスタマイズ
  2. カスタム投稿を表示する

1. WordPress の条件分岐タグ

WordPress は条件分岐タグ(Conditional Tag)という便利なタグのおかげで、いろんな条件によって処理を分岐させることが簡単にできるようになっています。普通のブログを作るくらいだと、めちゃめちゃ使う … という程でもないかもしれませんが、覚えておくととっても便利なタグですね!

条件分岐をうまく使えば、無駄にテンプレートファイルばかり増やさずに済みますよねー。 header.php が 3つも 4つもあるー … なんて事にならないように、条件分岐を使いこなしましょう!

1.1. メインページかどうかを判断する

is_home()

ブログのメインページが表示されているかどうか … という条件分岐には、if(is_home()): を使います。

ex – header.php
<?php if(is_home()): ?>
    ここはブログのメインページです!
<?php endif; ?>

でも、これにはちょっと注意が必要です。例えば、「古い記事へ」「新しい記事へ」で移動した、2ページ目や3ページ目も、is_home() では true が返ってきてしまいます。なので純粋にドメインにアクセスした時のトップページだけに絞りたい … という場合には、 !is_paged() を一緒に使います。

if(is_home() && !is_paged()):

ex – header.php
<?php if(is_home() && !is_paged()): ?>
    ブログのトップページです!
    2ページ目、3ページ目などの複数ページは含みません。
<?php endif; ?>

1.2. フロントページかどうかを判断する

if(is_front_page()):

is_home() と同じ?と思う人もいるかもしれませんが、同じじゃないんです。もし ダッシュボード → 設定 → 表示設定 で、フロントページの表示を最新の投稿ではなく、固定ページにしている場合、トップページかどうかを判断するのに is_home() を使うと、false が返ってきてしまいます。is_home() は、あくまでブログのメインページかどうかを判断する条件分岐タグ。なので固定ページなどをトップにしているばあいは、 is_front_page() を使います。

もちろんフロントページの表示を最新の投稿にしてある場合でも、is_front_page()true を返します。ちょっとややこしいですけど、固定ページなど、ブログ以外のものをトップページにした場合に使う感じですね!

ex – header.php
<?php if(is_front_page()): ?>
    ここはフロントページです!
<?php endif; ?>

1.3. 個別投稿ページ(シングルページ)かどうかを判断する

if(is_single()):

各記事の個別ページ(シングルページ)かどうかを判断する条件分岐タグ。パラメータを渡してあげると、もっと細かく条件を付ける事もできます。

ex – header.php
<?php if(is_single('17')) : ?>
    この記事のページIDは"17"です!
<?php elseif(is_single(array(18, 19, 1, 11))) : ?>
    この記事のページIDは"18, 19, 1, 11"のうちのどれかです!
<?php endif ?>

パラメータには、ページの ID の他にも、記事タイトル投稿スラッグを指定する事もできます。パラメータについては詳しく知りたい人は、WordPress Codex を参照してみてくださいね!

1.4. 固定ページかどうか判断する

if(is_page()):

固定ページというのは、ブログの投稿ではなくて、ダッシュボード → 固定ページ で作成したページのこと。WordPress に馴染みのない人には、ちょっと分かりにくい呼び方ですよね。ブログ記事とは別に、個別に作れるページの事です。

その固定ページかどうかを判断する条件分岐が、is_page() です。前述の is_paged とスペルが似ているので、間違えないように注意してくださいね。is_page もパラメータを渡すことで、細かく条件分岐して使う事ができます。

ex – header.php
<?php if(is_page('42')): ?>
    このページはページIDは"42"です!
<?php elseif(is_page('About Me')): ?> 
    このページのタイトルは"About Me"です!
<?php elseif(is_page('about-me')): ?> 
    このページの投稿スラッグは"about-me"です!
<?php endif; ?>

1.5. 子ページかどうかをチェックする

WordPress の固定ページには、親ページ、子ページといった階層を付ける事ができます。でも残念ながら、子ページかどうかを判断する条件分岐タグはありません。でも、WordPress Codex にスニペットが掲載されているのでご紹介します。

functions.php
function is_subpage() {
    global $post; // $post には現在の固定ページの情報があります
	if ( is_page() && $post->post_parent ){ // 現在の固定ページが親ページを持つかどうかをチェックします
		$parentID = $post->post_parent; // 親ページの ID を取得します
		return $parentID; // 親ページの ID を返します
	} else { // 親ページを持っていない場合
		return false; // false を返します
	};
};

これで is_subpage() を使えば、サブページかどうかを判断できるようになりました!functions.php で関数を作っておけば楽ちんですね!

1.6. カテゴリーに関する条件分岐

if(is_category()): / if(in_category(‘slug’)):

カテゴリーのアーカイブページが表示されているかどうかを判断するには、is_category() を使います。パラメータを指定する事で、もっと細かく条件分岐することもできます!

ex – header.php
<?php if(is_category('9')): ?>
カテゴリーIDが"9"の記事を表示します。
<?php elseif(is_category('Stinky Cheeses')): ?>
	カテゴリーの名前が"Stinky Cheeses"の記事を表示します。
<?php elseif(is_category('blue-cheese')): ?>
	カテゴリースラッグが"blue-cheese"の記事を表示します。
<?php elseif(in_category( array( 1,2,3 ) )): ?>
	カテゴリーIDが "1, 2, 3 "の記事を表示します。
<?php elseif(!in_category( array( 4,5,6 ) )): ?>
	カテゴリーIDが" 4, 5, 6 "意外の記事を表示します。
<?php endif; ?>

ブログの個別記事で、特定のカテゴリー内の記事かどうかを判断するのには、in_category を使います。パラメータには、カテゴリーID や、カテゴリー名、スラッグを指定します。特定のカテゴリーに属しているかどうかを判断するので、パラメータは必須です。

ex – header.php
<?php if(in_category(5)): ?>
	これはカテゴリーID 5 の記事です。 
<?php elseif(in_category( array( 1,2,3 ) ) ): ?>
	これはカテゴリーID 1,2,3 のどれかの記事です。
<?php elseif(in_category('webdesign')): ?>
	これはカテゴリースラッグ 'webdesign'の記事です。
<?php endif; ?>

1.6. タグに関する条件分岐

is_tag() / has_tag(‘slug’)

is_tag() と、has_tag() は、タグに関する条件分岐。is_tag()is_category のタグ版、has_tag() は、in_category のタグ版といった感じです。

is_tag()は、タグのアーカイブページが表示されているかどうかを判断します。

ex – header.php
<?php if(is_tag('mild')): ?>
	"mild"タグのついた記事を表示しています。
<?php elseif(is_tag(array('sharp','hard','extreme'))): ?>
	"sharp", "hard", "extreme" タグのついた記事を表示しています。
<?php endif; ?>

has_tag() は、記事がタグを持っているかどうか、または特定のタグを使ってるかどうかを判断できます。

ex – header.php
<?php if(has_tag('mild')): ?>
	この記事には "mild" タグがついています。
<?php elseif(has_tag(array('sharp','hard','extreme'))):
	この記事には "mild, hard ,extreme"のいずれかのタグがついています。
<?php elseif(has_tag()): ?>
	この記事には何かしらタグがついています。
<?php endif; ?>

1.7. 検索結果ページが表示されているかどうかを判断する

is_search()

現在のページが、検索結果を表示しているかどうかを判断する条件分岐タグ。下のコードでは、検索クエリ(検索したキーワード)と検索結果数も表示しています。

<?php if (is_search()): ?>
<?php
    global $query_string;
    query_posts($query_string . "&post_type=post");
    global $wp_query;
    $total_results = $wp_query->found_posts;
?>
<p>&quot;<?php the_search_query(); ?>&quot; で検索した結果:<?php echo $total_results; ?>件</p>

1.8. 複数にわたるページ(2ページ目、3ページ目など)かどうか判断する

if(is_paged()):

is_home() のところで紹介しましたが、「次のページ」「前のページ」など、複数にわたるページの 2ページ目以降かどうかを判断します。メインページやアーカイブページで使ったりします。

ex – header.php
<?php if(is_paged()): ?>
    このページは2ページ目以降です。
<?php endif; ?>

1.9. トップページなどで、最新の記事かどうか判断する

デザインによっては、最新の記事(1番最初の記事)だけレイアウトを変更して目立たせたい!っていうこともあると思います。でも、デフォルトでは 1番最初の記事かどうかを判断するタグはないので、functions.php に以下を記述して、is_first という関数を作ります。

functions.php
function is_first(){
    global $wp_query;
    return ($wp_query -> current_post === 0);
}

あとは index.php などで、is_first() で取得します。

1.10. 奇数番目、偶数番目の記事を判断する

今度は奇数番目の記事、偶数番目の記事かどうかの条件分岐です。is_first の時みたいに、functions.php に関数を定義して作ります。

functions.php
/* 奇数 */
function is_odd(){
    global $wp_query;
    return ((($wp_query->current_post+1) % 2) === 1);
}
/* 偶数 */
function is_even(){
    global $wp_query;
    return ((($wp_query->current_post+1) % 2) === 0);
}

is_odd() が奇数、is_even() が偶数です!

2. WordPress 3.0 からの新機能 – カスタム投稿タイプ

WordPress 3.0 から、カスタム投稿タイプという新しい機能がつきました。従来の WordPress では、ブログ記事(post)と固定ページ(page)という、ふたつの投稿タイプがありました。カスタム投稿タイプを使えば、この投稿タイプを自分で追加できるようになったんです。

どういう事かというと、今まで WordPress で一般的な Webサイトを構築するときには、ブログのカテゴリーを使って、コンテンツを分類してたりしました。別にそれでもいいんじゃない? … なんですけど、その Webサイト内に、ビジネスブログなど、通常の「ブログ」を運営したい場合、カテゴリーがぐちゃぐちゃになりがちだったんです。

でもカスタム投稿タイプを使えば、自分で好きな投稿タイプを追加できるので、コンテンツの入力や管理がとっても楽になるし、投稿タイプごとにデザインを変更したりすることだってできちゃうんです。

カスタム投稿タイプは、ぜひ使いこなしたい新機能。早速いろいろ試してみたので、簡単にご紹介します。カスタム投稿タイプを使うには、まずカスタム投稿タイプを作らなければなりません。そのためには、以下のように functions.php にコードを記述していきます。

2.1. カスタム投稿タイプの追加

まずは functions.php に以下を追加してみます。

functions.php
/* カスタム投稿タイプの追加 */
add_action( 'init', 'create_post_type' );
function create_post_type() {
	register_post_type( 'books', /* post-type */
		array(
			'labels' => array(
			'name' => __( '本' ),
			'singular_name' => __( '本' )
		),
		'public' => true,
		'menu_position' =>5,
    	)
	);
}

上記のコードでは、booksというカスタム投稿タイプを作成しています。次に管理画面を見てみると、「本」というカスタム投稿が表示されているはずです!

「本」というカスタム投稿タイプ

「本」というカスタム投稿タイプが追加されました!

「本」というカスタム投稿タイプが追加されました!

こうすれば、ブログ記事と完全に分けて、「本」という投稿を追加、編集できるようになるんですね!これは Webサイトを構築して行く上ではとっても便利。コンテンツごとにカスタム投稿タイプを作ってしまえば、あとは条件分岐などで記事を取捨選択できるので、アイデア次第で色んな事ができますね!

でもこのままでは、カスタム投稿タイプの中で、カテゴリーの様なコンテンツの分類、細分化ができてません。これができないと、あんまり実用的ではありませんよねー。そこで「本」というカスタム投稿タイプの中に、WebデザインPhotoshopPHP という分類をつくってみましょう。

3. カスタムタクソノミー ってなに?

カテゴリー分け、分類なんて言い方をしてましたが、WordPress では、これをカスタムタクソノミーって呼んでます。この分かりにくい呼び方で、ちょっと難解なイメージがありますけど、簡単にいってしまえば … カスタム分類です。このカスタム分類はブログでいうと、カテゴリー分けみたいなものなので、何にも難しくないですね!

それではカスタム分類(タクソノミー)をつかって、「本」というカスタム投稿をもっと細かく分類してみます。functions.php の先ほど書いたコードに、以下の追加部分を書き足します。

functions.php
/* カスタム投稿タイプ */
add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'books', /* post-type */
    array(
      'labels' => array(
        'name' => __( '本' ),
        'singular_name' => __( '本' )
      ),
      'public' => true,
      'menu_position' => 5,
    )
  );
  
/* ここから */
  register_taxonomy(
    'bookcat', /* タクソノミーの名前 */
    'books', /* books投稿で設定する */
    array(
      'hierarchical' => true, /* 親子関係が必要なければ false */
      'update_count_callback' => '_update_post_term_count',
      'label' => '本のカテゴリー',
      'singular_label' => '本のカテゴリー',
      'public' => true,
      'show_ui' => true
    )
  );
/* ここまでを追加 */
}

すると、さっきはなかった、「本のカテゴリー」というメニューが出現します!

「本のカテゴリー」というカスタム分類

「本のカテゴリー」というカスタム分類

「本のカテゴリー」というカスタム分類が追加されました!

ブログのカテゴリー分けと全く変りませんねー。もちろんブログのカテゴリーのときと同じように、親子関係も付けられます!とっても簡単ですね!

4. もうちょっと実用的にカスタマイズ

これでブログとは別に、カテゴリー分け(タクソノミー)できるカスタム投稿ができました。でももうちょっと色々できるようにカスタマイズしてみます。何をするかというと … アイキャッチ画像カスタムフィールドなども、使えるようにしておきましょう!

先ほど書いた functions.php のコードの最初の方、register_post_type 関数の中に、以下の追加部分を書き足します。

/* カスタム投稿タイプ */
add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'books',
    array(
      'labels' => array(
        'name' => __( '本' ),
        'singular_name' => __( '本' )
      ),
      'public' => true,
      'menu_position' => 5,
      /* ここから */
      'supports' => array('title','editor','thumbnail',
      'custom-fields','excerpt','author','trackbacks',
      'comments','revisions','page-attributes')
      /* ここまで */
    )
  );
}

するとカスタム投稿画面に、抜粋、カスタムフィールド、アイキャッチ画像の設定などが追加されます。

アイキャッチ画像やカスタムフィールドを追加

アイキャッチ画像やカスタムフィールドを追加

アイキャッチ画像やカスタムフィールドが追加されました。

これで今までのブログ投稿となんら遜色無く、「本」というカスタム投稿を追加したり、編集したりできるようになりました!これから WordPress で Webサイトを構築して行く場合は、こんな便利なカスタム投稿タイプを有効活用しない手はありませんね!

MEMO

アイキャッチ画像は、テーマ自体がアイキャッチに対応していないと表示されません。その場合は、functions.php に、add_theme_support('post-thumbnails'); と記述して、アイキャッチ機能を有効にしておきましょう。

5. カスタム投稿タイプを表示する

今度は投稿したカスタム投稿を表示してみましょう。

5.1. index.php に表示してみる

投稿したカスタム投稿は、そのままでは表示されません… X(まずは index.php にカスタム投稿を表示してみましょう。

index.php
<?php
/* カスタム投稿タイプを表示する */
$loop = new WP_Query( array( 'post_type' => 'books', 'posts_per_page' => 10 ) );
while ( $loop->have_posts() ) : $loop->the_post();
?>

<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>

/* カスタム分類を表示 */  		
<p class="taxonomies">
    <?php echo  get_the_term_list( $post->ID, 'books-cat', 'タクソノミー', ', ', '' ); ?>
</p>
/* コンテンツ */
<div class="custom-post-content">
    <?php the_content('続きを読む&raquo;'); ?>
</div>
<?php endwhile; ?>
  • 3. $loop = new WP_Query( array( 'post_type' => 'books', 'posts_per_page' => 10 ) );

上記では、WP_Query にカスタム投稿タイプ‘books’ をセットしています。また、表示件数は 10件としています。

  • 11. get_the_term_list( $post->ID, 'books-cat', 'タクソノミー', ', ', '' );

get_the_term_list では、ブログのカテゴリー表示と同じように、カスタム分類(タクソノミー)を取得して、echo で表示しています。パラメータは、以下のようになっています。

  • get_the_term_list( $post->ID, 'タクソノミーの名前', '前に表示する文字', '区切り文字', '後ろに表示する文字' )

日付などは、通常のブログと同じ関数で取得できますから、カスタム分類を表示する時だけ注意すればOKですね!

5.2. カスタム投稿をシングルで表示してみる

今度はカスタム投稿を、シングル … 個別記事としてで表示してみます。とはいっても、特に何もしなくても、カスタム投稿は single.php で表示されます。でもブログと同じデザインでは、カスタマイズする意味も半減しちゃうので、専用のテンプレートファイルを作って、ブログとは違うレイアウト・デザインのページにしてみましょう!

カスタム投稿専用のテンプレートファイルは、single-カスタム投稿の名前.php という風にします。このブログ記事では、「books」という名前だったので、single-books.php となります。

single-books.php という名前のファイルを作成すれば、WordPress が single.php よりも優先して読みにいってくれます。もし single-books.php が存在しなければ、WordPress は single.php で表示するって感じです。

5.3. カスタム分類をアーカイブで表示する

アーカイブページも、カスタム分類(カスタム投稿ではなく、カスタム分類です!)独自のものを作成することもできます。というのも、WordPress は次の順番でテンプレートファイルを探しにいくからなんですねー。

  1. taxonomy-{taxonomy}-{term}.php
    – 例えば分類名が “sometax”、スラッグが “someterm” の場合は taxonomy-sometax-someterm.php
  2. taxonomy-{taxonomy}.php
    – 例えば分類名が “sometax” の場合は taxonomy-sometax.php
  3. taxonomy.php
  4. archive.php
  5. index.php

こんな風に、特定のページを表示するために使われるファイルには優先順位があって、どのファイルも見つからない場合には index.php を使って表示される仕組みになっています。これをテンプレート階層って呼んでいます。

ちょっと駆け足気味でしたけど、WordPress でサイト構築をするのに、覚えておきたい条件分岐やカスタム投稿タイプをまとめてみました。

Comments

Thank you for the comment.