WordPressでは〇〇かどうか?という判定を行う「is_〇〇」っていう関数がたくさんあります。
その中で結構使用頻度が高く、自身時折あれ?となる(普通の人はならないかも)投稿タイプでの条件分岐について、違いや便利な使い方を公開しておきます。
補足ですが、投稿タイプというのは、「投稿」「固定ページ」「添付ファイル」「リビジョン」「ナビゲーションメニュー」「カスタムCSS」「チェンジセット(テーマカスタマイザーの設定)」、そして任意に追加できる「カスタム投稿タイプ」があり、本ページではその中の「投稿」「固定ページ」「カスタム投稿タイプ」での条件分岐について紹介します。
投稿タイプについて詳しくは公式サポートの「投稿タイプ」を参照ください
本ページ掲載のコードを使用するときは
本ページで掲載しているコードは、以下に了承した上で使用ください
- コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
- コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
- コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
- コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
- 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
- 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)
まずは、is_singular()以外の投稿タイプ判別関数をおさらい
is_singular()という投稿タイプを判別する便利な関数について紹介する前に、WordPress標準の投稿タイプである「投稿」や「固定ページ」かどうかを判別する関数についておさらいしておきます。
もう十分に知ってるよ!という方は「is_singular()の基本的な使い方と、より便利に使う方法」へ飛んでください。
「投稿」という投稿タイプのみという条件分岐をする場合
これは、「投稿」という投稿タイプ(日本語だとややこしい..)のコンテンツかどうかを判別します。
従って「投稿」という投稿タイプ以外である「固定ページ」や「カスタム投稿タイプ」のコンテンツかどうかというのは除外されます。
ただし、「is_single()」は「投稿」という投稿タイプのみに使えるという話を聞きますが、is_single( int|string|int[]|string[] $post = ” ): boolによると、投稿 ID、タイトル、スラッグなどを指定した場合には、カスタム投稿タイプの中のものも判別するようです(ただし固定ページは対象外)。
「固定ページ」という投稿タイプのみという条件分岐をする場合
「固定ページ」という投稿タイプかどうかを判断します。
当然ながら「投稿」「カスタム投稿タイプ」といった投稿タイプは対象外となります。
1点注意が必要なのは、固定ページをトップページにしている場合。単純に「is_page()」とするとこれも固定ページと判別されてしまうので、もしもトップページを除外した固定ページとしたい場合には、以下のようにします。
if( is_page() && !is_front_page() ){
フロントページ以外の固定ページで処理する内容
}
これで固定ページ、かつトップページに指定した固定ページではないもの(!is_front_page()で除外)という指定ができます。
「投稿」または「固定ページ」という投稿タイプのみという条件分岐をする場合
WordPress標準の「投稿」または「固定ページ」のどちらかという条件を設ける場合には以下のように記述します。
if( is_single() || is_page() ){
「投稿」または「固定ページ」の場合の処理
}
ただ注意したいのが、前項のis_page()と同様に、この記述だと、固定ページをフロントページにした場合にも適用されてしまうことです。
フロントページを除く「投稿」と「固定ページ」としたい場合には以下のように記述します。
if( (is_single() || is_page()) && !is_front_page() ){
「投稿」または、フロントページとなっている「固定ページ」を除く「固定ページ」の場合の処理
}
is_singular()の基本的な使い方と、より便利に使う方法
is_single()やis_page()とis_singular()の違い
ここまでの説明で、「投稿」や「固定ページ」が投稿タイプというものの1つであるということは理解できていると思います。
is_singular()関数は、どの投稿タイプと合致するか?というのを判別する関数で、基本的には以下のように記述します。
if( is_singular( 'post' ) ){
「投稿」という表示名の投稿タイプの単独ページでの処理
}
if( is_singular( 'page' ) ){
「固定ページ」という表示名の投稿タイプの単独ページでの処理
}
この段階では、それぞれ以下のようにしても同じ結果が得られます。
if( is_single() ){
「投稿」という表示名の投稿タイプの単独ページでの処理
}
if( is_page() ){
「固定ページ」という表示名の投稿タイプの単独ページでの処理
}
だったら別にis_single()やis_page()でいいのでは?と思いますよね?
でもここからがis_singular()の真骨頂です。
例として、以下のように書くことで、「投稿」または「固定ページ」だったらという条件分岐ができるようになります。
if( is_singular( array('post','page') ){
「投稿」または「固定ページ」という名前の投稿タイプの単独ページに対する処理
}
冒頭で投稿タイプというのは結構いろいろあると説明しました。その中から後から任意に追加することがある投稿タイプに「カスタム投稿タイプ」というのがあります。
カスタム投稿タイプはコードを自身でテーマへ追加しても、以下のようなプラグインを使っても簡単に追加することができます(個人的にはプラグイン使用がおすすめです)。
例えば「test」という投稿タイプスラグ名(サイト内で投稿タイプを判別するための名前)を持つカスタム投稿タイプを作って、それを条件に加えようとした場合には、以下のコードで実現できます。
if( is_singular( array('post','page','test') ){
「投稿」または「固定ページ」という名前の投稿タイプの単独ページに対する処理
}
つまりarray()の中に「,’投稿タイプスラグ名’」を追加すれば、どれだけでも複数の投稿タイプを含めることができるのです。
「is_single()」は投稿(postという投稿スラグ名を持つ投稿タイプ)、「is_page()」は固定ページ(pageという投稿スラグ名を持つ投稿タイプ)に限定されているので、is_singular()を使うことで柔軟に条件分岐できるようになるんですね。
is_singular()関数でできないこと
逆に、is_single()やis_page()ではできて、is_singular()でできないことがあります。
それは、IDなどで限定(絞り込み)できないということです。
例えばis_single()で「17」というIDを持つコンテンツに限定して処理したい時は、以下のように書くと実現できます。
if( is_single(17) ){
IDが17のコンテンツに対する処理
}
ここで特定のIDを持つコンテンツとしたのは、前述したようにis_single()での個別指定が、「投稿」だけではなく全体に及ぶからです
is_singular()関数ではこの指定はできませんから、特定のコンテンツに限定する場合のみis_single()やis_page()を使い、あとはis_singular()を使えば事足りると覚えておくとよいでしょう。
ちなみに、フロントページになっている固定ページを除いた、「投稿」または「固定ページ」という条件にする場合は以下のように記述します。
if( is_singular( array('post','page') ) && !is_front_page() ){
「投稿」または、フロントページとなっている「固定ページ」を除く「固定ページ」の場合の処理
}
「is_singular()」をさらに便利に使う方法
同じ条件で処理するものを後から一括で変更できるようにする
ここまでis_singular()関数の基本的な使い方を紹介してきました。投稿タイプによる条件分岐であればこの関数が便利だということが伝わっていれば幸いです。
さて、この関数での条件処理はカスタムコードでは比較的よく使うのでいろいろな箇所に記述することが多いと思います。
が、サイトの構築が進み、条件に含めるカスタム投稿タイプが増減した場合はどうしますか?
元のコードに書かれている投稿タイプの判別をすべて書き換えるのはとても面倒ですし、一部で変更を忘れ、思った結果にならずに困惑することがあるかもしれませんね。
そこで「is_singular()」の利便性をさらに一歩前進させて、「直接元のコードを触らずに、後からテーマで簡単なコードを追加するだけで対象となる投稿タイプを変更できるようにしておく」方法を紹介していきます。
前項で紹介した「投稿」または、フロントページとなっている「固定ページ」を除く「固定ページ」の場合という以下のコードを
if( is_singular( array('post','page') ) && !is_front_page() ){
「投稿」または、フロントページとなっている「固定ページ」を除く「固定ページ」の場合の処理
}
こちらのコードにそっくり差し替えます。
$post_types ='post,page';
$post_types = apply_filters('pwcn_posttype_filter',$post_types);
$post_types_array = explode(',', $post_types);//「,」で投稿タイプを分割
if (in_array(get_post_type(), $post_types_array) && !is_front_page()) {
「投稿」または、フロントページとなっている「固定ページ」を除く「固定ページ」の場合の処理
※またはpwcn_posttype_filterで指定された投稿タイプでフロントページを除く場合の処理
}
このコードの解説をしておきます。
まず1行目で基本となる投稿タイプを「post」と「page」に指定します。
次の行で「apply_filters()」という関数を使って、「pwcn_posttype_filter」というフックを作って後からプログラムを使って変更できるようにしています。
3行目で、一旦「’post,page’」となっている部分、もしくはフィルターで指定されている文字列を「,」で区切って格納します。
4行目で「in_array()」関数で〇〇を含めるという指定をして、「get_post_type()」で現在の投稿タイプが3行目で格納された投稿タイプスラグのいずれかに該当するか?という判別をし、最後に「!is_front_page()」を使ってフロントページとなっている固定ページを除外しています。
これを同様の条件をするカスタムコードすべてに使った上で、テーマのfunctions.phpなどで以下のコードを追加すると、「post,page」だった基本の投稿タイプを自由に一括変更させて処理することができるようになります。
function pwcn_change_posttype() {
$new_posttype = '投稿タイプをコンマ区切りで入力';
$post_types = $new_posttype;
return $post_types;
}
add_filter( 'pwcn_posttype_filter', 'pwcn_change_posttype' );
例えば「投稿タイプをコンマ区切りで入力」へ「post」と入力すれば「投稿」という投稿タイプのみに、「post,カスタム投稿タイプスラグ」とすれば「投稿」と「カスタム投稿タイプ」のいずれかの場合..といった風に書き換えることができるのです。
これならカスタム投稿タイプが増減しても面倒な書き換え作業はこの1つのプログラムだけで済みますね。
さらに発展させて独自コールバック関数化する
前項でも断然便利ではあるものの、条件分岐の度にこのコードを入れるのはコード全体が長くなってしまうので管理しにくくなってしまうかも知れません。
「is_single()」のように短いコードでこの条件処理ができるように、独自の関数(ユーザー定義関数)名でコールバック関数(処理をさせるためのユーザー定義関数)を作ることで、コードがすっきりし、かつ、一括変更も可能という状況を作ることができます。
具体的には、以下のようなプログラムをテーマのfunctions.phpなどへ追加します。
function pwcn_is_single_post_page(){
$post_types ='post,page';
$post_types = apply_filters('pwcn_posttype_filter',$post_types);
$post_types_array = explode(',', $post_types);//「,」で投稿タイプを分割
$result = in_array(get_post_type(), $post_types_array) && !is_front_page();
return $result;
}
条件としてはフロントページを除く「投稿」または「固定ページ」だったら..というものなので、この条件で処理したい場所で以下のコードを使います。
if( pwcn_is_single_post_page() ){
「投稿」または、フロントページとなっている「固定ページ」を除く「固定ページ」の場合の処理
※またはpwcn_posttype_filterで指定された投稿タイプでフロントページを除く場合の処理
}
同じ条件処理をするのに、先ほどの何行にも渡るコードを書かなくて済む分ずいぶんすっきりしますよね?
もちろん、前項の「pwcn_posttype_filter」を使って、一括で投稿タイプの指定をし直すこともできますから、本当に便利になりますよ。
コメントを残す