条件付きタグ

2020.04.02 2020.04.02

TOPICS

翻訳元記事はこちらです。

条件付きタグは、テンプレートファイルの中で使用することができ、現在のページがマッチする条件に応じてコンテンツの表示を変更することができます。
このタグは、特定の条件の下でどのコードを表示するかを WordPress に伝えます。条件付きタグは通常、PHP の if /else 条件文で動作します。

コードは、文がtrueかfalseかをチェックすることから始まります。文がtrueであることが判明した場合、最初のコードセットが実行されます。falseの場合、最初のコードセットはスキップされ、代わりに(elseの後の)2番目のコードセットが実行されます。

例えば、ユーザーがログインしているかどうかを確認して、その結果に応じて異なる文言を表示できます。

if ( is_user_logged_in() ):
    echo 'Welcome, registered user!';
else:
    echo 'Welcome, visitor!';
endif;

これらのタグはWordPressテンプレート階層と密接な関係があることに注意してください。追加するのか、削除するのか?

どこで条件付きタグを使用するのか?

条件付きタグがデータを修正するためには、情報はすでにデータベースから取得されていなければなりません。
データが存在する前に条件付きタグを使用した場合、if/else文に求めるものは何もありません。

ここで注意したいのは、WordPressはクエリを実行する前にfunctions.phpをロードするので、そのファイルに単純に条件付きタグを入れてもうまくいかないということです。

条件付きタグを実装するには2つの方法があります。

条件

以下に、条件文がtrueであることを証明する条件を列挙します。パラメータを受け付けることができるタグを記載しています。

メインページ

is_home()

この条件は、ブログのメインページ(通常は投稿日時の降順で表示されています)が表示されているとき、にtrueを返します。
ホームページが「固定ページ」に設定されている場合は、設定 > 表示設定で「投稿ページ」に設定したページでのみ有効になります。

フロントページ

is_front_page()

この条件は、投稿を表示するように設定されているか、固定ページを表示するように設定されているかに関わらず、サイトのフロントページが表示されたときにtrueを返します。

以下の場合に、trueを返します。

  1. メインのブログページが表示されている
  2. かつ、設定 > 表示設定 > ホームページの設定が「最新の投稿」になっている

または、

  1. 設定 > 表示設定 > ホームページの設定が、固定ページになっている
  2. かつ、ホームページが現在表示しているページと一致する

管理画面

is_admin()

この条件は、ダッシュボードまたは管理画面が表示されているときにtrueを返します。

個別投稿ページ

is_single()

個別投稿(または添付ファイル、またはカスタム投稿タイプ)が表示されている場合に true を返します。この条件は、固定ページを表示している場合は false を返します。

is_single( ’17’ )

is_single() は、特定の投稿を ID などのパラメータでチェックすることもできます。上記の例では、ID:17の投稿が個別投稿として表示されている場合にtrueを返します。

is_single( ‘Irish Stew’ )

パラメータには投稿のタイトルも含まれます。この場合、”Irish Stew “というタイトルの投稿が個別投稿として表示されている場合にtrueを返します。

is_single( ‘beef-stew’ )

スラッグ「beef-stew」が付いた投稿が個別投稿として表示されている場合にtrueを返します。

is_single( array( 17, ‘beef-stew’, ‘Irish Stew’ ) )

表示されている個別投稿が投稿 ID 17 であるか、投稿名が “befef-stew” であるか、投稿のタイトルが “Irish Stew” である場合に true を返します。

is_single( array( 17, 19, 1, 11 ) )

表示されている個別投稿が、投稿ID = 17、投稿ID = 19、投稿ID = 1、投稿ID = 11のいずれかである場合にtrueを返します。

is_single( array( ‘beef-stew’, ‘pea-soup’, ‘chilli’ ) )

表示されている個別投稿が、スラッグ “beef-stew”、 “pea-soup”、”chilli” のいずれかである場合に true を返します。

is_single( array( ‘Beef Stew’, ‘Pea Soup’, ‘Chilli’ ) )

表示されている個別投稿の タイトル が “Beef Stew”、タイトル が “Pea Soup”、タイトル が “Chilli” のいずれかである場合に true を返します。

注意:この関数は、投稿ID、タイトル、スラッグを区別しません。投稿IDが17の場合、”17 “という名前の投稿が表示されます。おそらく、”17 “というスラッグが付いた投稿も同様に表示されます。

個別投稿、個別ページ、添付ファイル

is_singular()

is_single、is_page、およびis_attachmentのいずれかの場合に、trueを返します。これにより、投稿タイプのテストを行うことができます。

固定されている投稿

is_sticky()

現在の投稿の “この投稿を先頭に表示する” チェックボックスがチェックされている場合に true を返します。この例では、投稿IDの引数が与えられていないので、ループ投稿の投稿IDが使用されます。

is_sticky( ’17’ )

投稿ID:17が、固定する投稿の場合にtrueを返します。

投稿タイプ

get_post_type()

条件に get_post_type() を含めることで、現在の投稿が特定のタイプのものであるかどうかを確認できます。これは本当の意味での条件タグではありませんが、現在の投稿の投稿タイプを返します。

if ( ‘book’ == get_post_type() ) …

post_type_exists()

指定した投稿タイプが登録された投稿タイプであるかどうかを真で返します。これは、ある投稿が特定の投稿タイプであるかどうかをテストするものではありません。
注意: この関数は、3.0 の開発時に一時的に存在していた is_post_type という関数を置き換えるものです。

投稿タイプが階層であるか

is_post_type_hierarchical( $post_type )

登録時に引数の$post_typeが階層がある設定になっている場合にtrueを返します。

is_post_type_hierarchical( ‘book’ )

bookという投稿タイプが階層がある設定になっている場合にtrueを返します。

アーカイブの投稿タイプであるか

is_post_type_archive()

アーカイブの投稿タイプの場合にtrueを返します。

is_post_type_archive( $post_type )

投稿タイプ (文字列でも配列でもよい) にマッチする投稿のアーカイブページがある場合に true を返します。

投稿のアーカイブを有効にするには、投稿を登録する際に 'has_archive' => true を設定します。

コメントポップアップ

is_comments_popup()

コメントポップアップウィンドウの場合にtrueを返します。

投稿を含むページ

comments_open()

WordPressのループ内で、現在の投稿に対してコメントが許可されている場合にtrueを返します。

pings_open()

WordPressのループ内で、現在の投稿に対してPingが設定されている場合にtrueを返します。

固定ページ

このセクションでは、WordPress の固定ページについて説明します。

is_page()

固定ページが表示されている場合に、trueを返します。

is_page( ’42’ )

IDが42の固定ページが表示されている場合にtrueを返します。

is_page( ‘About Me And Joe’ )

タイトルが”About Me And Joe”の固定ページが表示されている場合にtrueを返します。

is_page( ‘about-me’ )

スラッグが”about-me”の固定ページが表示されている場合にtrueを返します。

is_page( array( 42, ‘about-me’, ‘About Me And Joe’ ) )

IDが42、またはスラッグが”about-me”、タイトルが”About Me And Joe”の場合にtrueを返します。

is_page( array( 42, 54, 6 ) )

固定ページのIDが42、54、6のいずれかの場合にtrueを返します。

固定ページのページネーション

<!-- nextpage -->を使って、ページに分割された投稿やページの中でn番目のページにいるかどうかを確認することができます。

例えば、複数のページに分割された投稿の最初のページだけにメタデータを表示させたい場合などに便利です。

例1

<?php
  $paged = $wp_query->get( 'page' );
  if ( ! $paged || $paged < 2 ) {
    // This is not a paginated page (or it's simply the first page of a paginated page/post)    } else {
    // This is a paginated page.
} ?>

例2

<?php $paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : false;
    if ( $paged == false )  {
    // This is not a paginated page (or it's simply the first page of a paginated page/post) }  else  {
    // This is a paginated page.
    }
?>

子ページの確認

is_subpage()関数はありませんが、ちょっとしたコードで確認できます。

スニペット1

<?php  global $post; // if outside the loop
   if ( is_page() &amp;&amp; $post->post_parent ) {
     // This is a subpage
   } else {
     // This is not a subpage
   }
?>

スニペット2のコードを使用して、独自の is_subpage() 関数を作成することができます。これを functions.php ファイルに追加します。
この関数はスニペット1と同じ方法で親ページがあるかどうかをテストしますが、親ページがある場合は親ページのIDを、ない場合はfalseを返します。

スニペット2

function is_subpage() {
    global $post;                              // load details about this page
 
    if ( is_page() && $post->post_parent ) {   // test to see if the page has a parent
        return $post->post_parent;             // return the ID of the parent post
 
    } else {                                   // there is no parent so ...
        return false;                          // ... the answer to the question is false
    }
}

子ページの確認を頻繁に行うのであれば、スニペット1のような単純な確認ではなく、スニペット2のような関数を使うことをお勧めします。

ページの親が特定のページ、例えば “About” (デフォルトではページID 2)であるかどうかをテストするには、スニペット3のテストを使うことができます。これらのテストは、問題のページを見ているかどうかと、子ページを見ているかどうかをチェックします。これは、ウェブサイトの異なるセクションに固有の変数を設定するのに便利です。

スニペット3

<?php if ( is_page( 'about' ) || '2' == $post->post_parent ) {
    // the page is "About", or the parent of the page is "About"
    $bannerimg = 'about.jpg';
} elseif ( is_page( 'learning' ) || '56' == $post->post_parent ) {
    $bannerimg = 'teaching.jpg';
} elseif ( is_page( 'admissions' ) || '15' == $post->post_parent ) {
    $bannerimg = 'admissions.jpg';
} else {
    $bannerimg = 'home.jpg'; // just in case we are at an unclassified page, perhaps the home page
}
?>

スニペット4は、上記の確認をより簡単に行うための関数です。この関数は、問題のページ(つまり「About」)やその子ページ(つまりID「2」の親を持つページ)を見ている場合にtrueを返します。

function is_tree( $pid ) {      // $pid = The ID of the page we're looking for pages underneath
    global $post;               // load details about this page
 
    if ( is_page($pid) )
        return true;            // we're at the page or at a sub page
 
    $anc = get_post_ancestors( $post->ID );
    foreach ( $anc as $ancestor ) {
        if( is_page() && $ancestor == $pid ) {
            return true;
        }
    }
 
    return false;  // we aren't at the page, and the page is not an ancestor
}

スニペット4をfunctions.phpファイルに追加し、is_tree( 'id' )を予呼び出して、現在のページがそのページなのか、そのページの子ページなのかを確認します。スニペット3では、is_tree( '2' )は最初のif文内の is_page( 'about' ) || '2' == $post->post_parent に置き換えられます。

複数の階層のページがある場合、親ページは真上のページであり、階層の一番上にあるページではないことに注意してください。

ページテンプレートであるか

ページテンプレートであるかどうか、または特定のページテンプレートが使用されているかどうかを判断することができます。

is_page_template()

ページテンプレートが使用されているか?

is_page_template( ‘about.php’ )

ページテンプレート「about」が使われているか?他の条件式とは異なり、特定のページテンプレートを指定したい場合は、about.phpmy_page_template.php のようなファイル名を使用する必要があることに注意してください。

注意: ファイルがサブディレクトリにある場合は、これも含めなければなりません。つまり、これはあなたのテーマに関連したファイルパスとファイル名、例えば page-templates/about.php のようなファイルパスでなければなりません。

カテゴリーページ

is_category()

カテゴリーアーカイブページが表示されている場合に、trueを返します。

is_category( ‘9’ )

カテゴリーID:9のカテゴリーアーカイブページが表示されている場合にtrueを返します。

is_category( ‘Stinky Cheeses’ )

カテゴリー名「Stinky Cheeses」のカテゴリーアーカイブページが表示されている場合にtrueを返します。

is_category( ‘blue-cheese’ )

カテゴリースラッグ「blue-cheese」のカテゴリーアーカイブページが表示されている場合にtrueを返します。

is_category( array( 9, ‘blue-cheese’, ‘Stinky Cheeses’ ) )

カテゴリーIDが9、またはスラッグが「blue-cheese」、またはカテゴリー名が「Stinky Cheeses」のカテゴリーアーカイブページが表示されている場合にtrueを返します。

in_category( ‘5’ )

現在の投稿がカテゴリーID:5の場合にtrueを返します。

in_category( array( 1, 2, 3 ) )

現在の投稿がカテゴリーID:1,2,3いずれかの場合にtrueを返します。

! in_category( array( 4, 5, 6 ) )

現在の投稿がカテゴリーID:4,5,6でない場合にtrueを返します。

注意:テストの際には必ずスペルをチェックしましょう。「is」と「in」の間には大きな違いがあります。

タグページ

is_tag()

タグアーカイブページが表示されている場合に、trueを返します。

is_tag( ‘mild’ )

スラッグ「mild」のタグアーカイブページが表示されている場合に、trueを返します。

is_tag( array( ‘sharp’, ‘mild’, ‘extreme’ ) )

スラッグ「sharp」「mild」「extreme」のいずれかのタグアーカイブページが表示されている場合に、trueを返します。

has_tag()

現在の投稿がタグを持っている場合に、trueを返します。必ずループ内で使用してください。

has_tag( ‘mild’ )

現在の投稿がタグ「mild」の場合にtrueを返します。

has_tag( array( ‘sharp’, ‘mild’, ‘extreme’ ) )

現在の投稿がタグ「sharp」「mild」「extreme」のいずれかの場合にtrueを返します。

タクソノミーページ

is_tax()

タクソノミーのアーカイブページが表示されている場合にtrueを返します。

is_tax( ‘flavor’ )

「flavor」タクソノミーのアーカイブページが表示されている場合にtrueを返します。

is_tax( ‘flavor’, ‘mild’)

「flavor」タクソノミーのアーカイブページで、スラッグ「mild」が表示されている場合にtrueを返します。

is_tax( ‘flavor’, array( ‘sharp’, ‘mild’, ‘extreme’ ) )

「flavor」タクソノミーのアーカイブページで、スラッグ「sharp」「mild」「extreme」のいずれかのスラッグが表示されている場合にtrueを返します。

has_term()

現在の投稿に与えられたタームのいずれかがあるかどうかをチェックします。最初のパラメータは空の文字列です。2番目のパラメータとして、タクソノミのスラッグ/名前を指定します。

has_term( ‘green’, ‘color’ )

現在の投稿が、タクソノミー「color」の「green」のタームに設定されている場合に、trueを返します。

has_term( array( ‘green’, ‘orange’, ‘blue’ ), ‘color’ )

現在の投稿が、タクソノミー「color」の「green」「orange」「blue」いずれかのタームに設定されている場合に、trueを返します。

タクソノミーが登録されているか

taxonomy_exists()

特定のタクソノミーが register_taxonomy() で登録されている場合にtrueを返します。以前はis_taxonomy()でしたが、バージョン3.0では非推奨となりました。

著者のページ

is_author()

著者のページが表示されている場合にtrueを返します。

is_author( ‘4’ )

著者ID:4のアーカイブページが表示されている場合にtrueを返します。

is_author( ‘Vivian’ )

著者のニックネーム「Vivian」のアーカイブページが表示されている場合にtrueを返します。

is_author( ‘john-jones’ )

著者のニックネーム「john-jones」のアーカイブページが表示されている場合にtrueを返します。

is_author( array( 4, ‘john-jones’, ‘Vivian’ ) )

ユーザーIDが4、ニックネームが「john-jones」、「Vivian」のいずれかのアーカイブページが表示されている場合にtrueを返します。

複数の著者によるサイト

is_multi_author()

複数の著者がサイトに投稿を公開している場合にtrueを返します。バージョン3.2以上で利用可能。

日付のページ

is_date()

日付ベースのアーカイブページが表示されている場合(月別、年別、日別、時間ベースのアーカイブなど)にtrueを返します。

is_year()

年別のアーカイブページが表示されている場合にtrueを返します。

is_month()

月別のアーカイブページが表示されている場合にtrueを返します。

is_day()

日別のアーカイブページが表示されている場合にtrueを返します。

is_time()

時間、分、秒ごとのアーカイブページが表示されている場合にtrueを返します。

is_new_day()

ループ内の現在の投稿の公開日が、ループ内の前の投稿の公開日と異なるかどうかを判断します。必ずループ内で使用します。

アーカイブページ

is_archive()

任意のタイプのアーカイブページが表示されている場合にtrueを返します。カテゴリー、タグ、著者、日付ベースのページは、すべてアーカイブページです。

検索結果ページ

is_search()

検索結果ページが表示されている場合にtrueを返します。

404ページ

is_404()

404エラーが発生したページが表示されている場合にtrueを返します。

添付ファイル

is_attachment()

投稿やページへの添付ファイルが表示されているとき。添付ファイルとは、投稿エディタのアップロード機能を使ってアップロードされた画像などのファイルのことです。添付ファイルは、それ自身の「ページ」やテンプレートに表示することができます。

個別ページ、個別投稿、添付ファイル

is_singular()

is_single()is_page() , is_attachment() のいずれかがtrueのときに、trueを返します。

is_singular( ‘book’ )

カスタム投稿タイプ”book”のときにtrueを返します。

is_singular( array( ‘newspaper’, ‘book’ ) )

カスタム投稿タイプ”newspaper”または”book”のときにtrueを返します。

シンジケーション

is_feed()

リクエストされたサイトがシンジケーションである場合。このタグは通常ユーザーが使用するものではなく、WordPress の内部で使用されており、プラグイン開発者が利用することができます。

トラックバック

is_trackback()

リクエストされたサイトが WordPress のトラックバックエンジンにフックされている場合。このタグは通常ユーザーが使用するものではなく、WordPress の内部で使用されており、プラグイン開発者が利用することができます。

プレビュー

is_preview()

個別投稿が下書きで表示されている場合にtrueを返します。

抜粋文

has_excerpt()

現在の投稿が抜粋文を持っている場合にtrueを返します。

has_excerpt( 42 )

投稿ID:42が抜粋文を持っている場合

<?php // Get $post if you're inside a function global $post;
   if ( empty( $post->post_excerpt ) ) {
    // This post has no excerpt
   } else {
    // This post has excerpt
  }
?>

他の使い方

自動表示されている抜粋を非表示にして、投稿の抜粋だけを表示させたい場合。

<?php
  if ( ! has_excerpt() ) {
      echo '';
  } else {
      the_excerpt();
  }
?>

テキストやコードの自動抜粋を置き換えます。

<?php if ( ! has_excerpt() ) {
    // your text or code
} ?>

ナビゲーションメニューの設定

has_nav_menu()

登録したナビメニューの場所にメニューが割り当てられているかどうか

ループ内

in_the_loop()

ループ内にいるかどうかをチェックします。プラグインを作成する際に便利なこの条件は、ループ内にいるときにtrueを返します。

サイドバー

is_active_sidebar()

指定されたサイドバーがアクティブかどうかをチェックします。サイドバー(名前、ID、または番号で識別される)が使用中であればtrueを返し、そうでなければfalseを返します。

マルチサイト

is_multisite()

現在のサイトがWordPressマルチサイトのインストール状態になっているかどうかを確認します。

メインサイト(マルチサイト)

is_main_site()

サイトがネットワークのメインサイトかどうかを判断します。

ネットワーク管理者(マルチサイト)

is_super_admin()

ユーザーがネットワーク管理者かどうかを判定します。

プラグイン

is_plugin_active()

プラグインが有効になっているかを判定します。

子テーマ

is_child_theme()

子テーマを使用しているかを判定します。

テーマが機能をサポートしているか

current_theme_supports()

様々なテーマの機能が存在するかどうかをチェックします。

実装例

条件付きタグの使用方法を説明するためのサンプルを紹介します。

個別投稿

この例では、 is_single() を使用して、個別投稿ページを表示しているときにのみ、特定のものを表示する方法を示しています。

if ( is_single() ) {
 
   echo 'This is just one of many fabulous entries in the ' . single_cat_title() . ' category!';
 
}

ループ内での条件付きタグの使い方のもう一つの例です。これが個別投稿ページやホームページの場合、index.phpにコンテンツや抜粋を表示するかどうか分岐します。

if ( is_home() || is_single() ) {
 
   the_content();
 
}
else {
 
   the_excerpt();
 
}

コードや要素をホームページ以外のページに表示したい場合。

<?php if ( ! is_home() ) {
 
 // Insert your markup ...
 
} ?>

複数の条件をチェックする

PHP の演算子を使用して、1つのif 文の中で複数の条件式を評価することができます。

これは、条件式の組み合わせがtrueかfalseかをチェックしたい場合に便利です。

// Check to see if any of 2 conditionals are met
if ( is_single() || is_page() ) {
 // If it's a single post or a single page, do something special
}
 
if ( is_archive() && ! is_category( 'nachos' ) ) {
 // If it's an archive page for any category EXCEPT nachos, do something special
}
// Check to see if 3 conditionals are met
if ( $query->is_main_query() && is_post_type_archive( 'products' ) && ! is_admin() ) {
 
 // If it's the main query on a custom post type archive for Products
 // And if we're not in the WordPress admin, then do something special
 
}
if ( is_post_type_archive( 'movies' ) || is_tax( 'genre' ) || is_tax( 'actor' )  ) {
 // If it's a custom post type archive for Movies
 // Or it's a taxonomy archive for Genre
 // Or it's a taxonomy archive for Actor, do something special
}

日付ベースの違い

年別のアーカイブページで、色を変えて年の違う投稿を区別してみましょう。

<?php // this starts The Loop
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2 id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></h2>
 
<small><?php the_time('F jS, Y') ?> by <?php the_author() ?></small>
 
<?php
// are we showing a date-based archive?
if ( is_date() ) {
 if ( date( 'Y' ) != get_the_date( 'Y' ) ) {
 // this post was written in a previous year
 // so let's style the content using the "oldentry" class
 echo '<div class="oldentry">';
 } else {
 echo '<div class="entry">';
 }
} else {
 echo '<div class="entry">';
}
 
the_content( 'Read the rest of this entry »' );
?></div>

サイドバーの切り替え

この例では、読者が現在閲覧しているページに応じて、サイドバーに異なるコンテンツを表示します。

<div id="sidebar">
<?php // let's generate info appropriate to the page being displayed
if ( is_home() ) {
 // we're on the home page, so let's show a list of all top-level categories
    wp_list_categories( 'optionall=0&amp;sort_column=name&amp;list=1&amp;children=0' );
} elseif ( is_category() ) {
 // we're looking at a single category view, so let's show _all_ the categories
    wp_list_categories( 'optionall=1&amp;sort_column=name&amp;list=1&amp;children=1&amp;hierarchical=1' )
} elseif ( is_single() ) {
 // we're looking at a single page, so let's not show anything in the sidebar
} elseif ( is_page() ) {
 // we're looking at a static page. Which one?
 if ( is_page( 'About' ) ) {
 // our about page.
 echo "This is my about page!";
 } elseif ( is_page( 'Colophon' ) ) {
 echo "This is my colophon page, running on WordPress " . bloginfo( 'version' ) . "";
 } else {
 // catch-all for other pages
 echo "Vote for Pedro!";
 }
} else {
 // catch-all for everything else (archives, searches, 404s, etc)
 echo "Pedro offers you his protection.";
} // That's all, folks!
?>
</div>

役立つ404ページ

404ページに、PHPの条件付き関数isset()を使って、次への導線を分かりやすくできます。

テーマのfooter.phpファイル

sidebar.phpのような他のテンプレートでクエリを実行すると、特定の条件タグが破損することがあります。
例えば、header.phpでは条件タグが正常に動作しますが、テーマのfooter.phpでは動作しません。
コツは、フッターの条件分岐の前に wp_reset_query を置くことです。例えば、以下のようにします。

<?php wp_reset_query();
 if ( is_page( '2' ) ) {
  echo 'This is page 2!';
 }
?>

条件タグ一覧

こちらをご覧ください

関数リファレンス

こちらをご覧ください