特定のページだけでショートコードを使いたい!ということはないでしょうか?
そもそも自作したコードであれば条件分岐を足すのは容易ですが、
テーマで用意された場合はちょっとわからないですよね。
その場合のカスタマイズを書いてみました。
WordPressでショートコードを条件分岐する方法
やり方は簡単で、ショートコードを呼び出すショートコードをfunctions.phpに記述するだけです。
子テーマのfunctions.phpのPHP領域へ追加します。編集前に元のファイルを保存し、エラー時にファイルを戻せる状態で作業してください。管理画面で編集する場合の場所は次のとおりですが、サイト設定によりこのメニューは表示されません。
WordPressの管理画面 > 外観 > テーマファイルエディター > functions.php
サンプルコード
[blog_parts id="123"]を、tokyoカテゴリーの記事だけで表示する例です。
function custom_ad_shortcode($atts) {
$ad_content = '';
// 投稿記事 & 'tokyo' というカテゴリに属しているかチェック
if (is_single() && has_category('tokyo')) {
$ad_content = do_shortcode('[blog_parts id="123"]');
}
return $ad_content;
}
add_shortcode('custom_ad', 'custom_ad_shortcode');[custom_ad]というショートコードを記事に貼れば特定の条件で表示されます。
条件分岐例の応用例
複数条件の場合は、最初の関数とadd_shortcode登録を次の一組へ置き換えます。同名関数なので2つの例を同時に追加しないでください。IDとカテゴリ・タグのスラッグは自分のサイトへ合わせます。参照するブログパーツ内にcustom_adを含めると再帰呼出しになるため、入れないでください。
function custom_ad_shortcode($atts) {
$ad_content = '';
// 現在の投稿が 'tokyo' カテゴリに属しているかチェック
if (is_single() && has_category('tokyo')) {
$ad_content = do_shortcode('[blog_parts id="51"]');
}
// トップページの場合
elseif (is_front_page()) {
$ad_content = do_shortcode('[blog_parts id="52"]');
}
// タグページの場合
elseif (is_tag()) {
$ad_content = do_shortcode('[blog_parts id="53"]');
}
// 特定のタグ(例:sample-tag)を持つ投稿の場合
elseif (is_single() && has_tag('sample-tag')) {
$ad_content = do_shortcode('[blog_parts id="54"]');
}
// 特定のページテンプレート(例:template-special.php)を使用するページの場合
elseif (is_page_template('template-special.php')) {
$ad_content = do_shortcode('[blog_parts id="55"]');
}
// アーカイブページの場合
elseif (is_archive()) {
$ad_content = do_shortcode('[blog_parts id="56"]');
}
return $ad_content;
}
add_shortcode('custom_ad', 'custom_ad_shortcode');
複数の条件分岐の書き方例
次のif文は条件部分の参考例です。先ほどのコールバック内の条件に置き換えて使い、functions.phpの読み込み時に直接判定しないでください。条件タグはメインクエリが決まってから評価します。通常の固定ページにはカテゴリー・タグがないため、その条件を併用するには登録済みのタクソノミーを確認します。
特定のカテゴリとタグの両方を持つ投稿
if (is_single() && has_category('test') && has_tag('sample-tag')) {
// 処理内容
}特定のカテゴリのいずれかを持ち、特定のタグを持つ投稿
if (is_single() && (has_category('test') || has_category('demo')) && has_tag('sample-tag')) {
// 処理内容
}
特定のページか、特定のカテゴリとタグの両方を持つ投稿
if (is_page('about') || (is_single() && has_category('test') && has_tag('sample-tag'))) {
// 処理内容
}特定のページテンプレートを使用し、特定のカテゴリまたはタグを持つ投稿
if (is_page_template('template-special.php') && (has_category('test') || has_tag('sample-tag'))) {
// 処理内容
}
確認した環境と範囲
2026年10月11日に、掲載コードを静的に読み直し、使用している条件分岐タグ(is_single()、has_category()、is_front_page()、is_tag()、has_tag()、is_page_template()、is_archive())を公式リファレンスと照合しました。2026年10月21日の見直しでは、do_shortcodeへ渡す文字列の二重角括弧を一重へ修正しました。二重角括弧は実行を避けて文字として表示する構文です。do_shortcodeの公式仕様も確認してください。
SWELLを有効にしたWordPressの各ページ種別での統合確認は行っていません。タグ・アーカイブの分岐は、そのページでcustom_adが実際に実行されるウィジェットやテンプレート等に置いた場合の例です。記事に置くだけで一覧ページにも自動表示されるわけではありません。elseifで繋いでいるため、条件に複数当てはまるページでは先に書いた条件だけが適用されます。導入後に、出したいページと出したくないページを1つずつ開いて確認してください。
戻す場合は、functions.phpに追加した関数とadd_shortcodeの行を取り除き、記事に貼った[custom_ad]も削除します。
まとめ
特定の条件によってコンテンツを出し分けるというのは効果的な施策だと思います。
ぜひ条件分岐の記述方法を覚えて使ってみてください。
SWELLで使えるショートコードの全体像はSWELLで使える!専用ショートコード17選まとめ、サイト内で実際に使われているショートコードを調べる方法はWordPress│本文で使われているショートコードを洗い出す方法にまとめています。
過去のコードはGitHubのMOTOKI-LLC/WAZA-codeにも保管しています。今回の修正とは同期していないため、掲載コードを使ってください。
よくある質問:WordPressでショートコードを条件分岐するとき
特定のページだけで、ショートコードを使うにはどうしますか?
記事では、ショートコードを呼び出すショートコードをfunctions.phpに記述し、その中で条件分岐を行います。自作のコードなら条件分岐を足すのは容易ですが、テーマで用意されたショートコードの場合に使える方法です。
コードは、どこに書きますか?
記事では、子テーマを使っている場合は子テーマのfunctions.phpへ書き、テーマの更新で消えないようにします。編集前にファイルをバックアップしておきます。
記事のサンプルでは、どんな条件ですか?
記事では、投稿記事で、「tokyo」というカテゴリに属している場合のみ表示する例を紹介しています。例に使っているのはSWELLのブログパーツ用ショートコードで、他のテーマでは、そのテーマが用意しているショートコード名に読み替えます。仕組み自体はテーマを問わず同じです。
作ったショートコードは、どう使いますか?
記事では、呼び出し用のショートコードを記事に貼れば、特定の条件で表示されます。
複数の条件を組み合わせられますか?
組み合わせられます。記事では、特定のカテゴリとタグの両方を持つ投稿、特定のカテゴリのいずれかを持ち特定のタグを持つ投稿、特定のページか特定のカテゴリとタグの両方を持つ投稿、特定のページテンプレートを使用し特定のカテゴリまたはタグを持つ投稿、といった例を挙げています。
条件に複数当てはまるページでは、どうなりますか?
記事では、条件を連結しているため、条件に複数当てはまるページでは先に書いた条件だけが適用されます。
公開前に、何を確認しますか?
記事では、導入後に、出したいページと出したくないページを1つずつ開いて確認します。
記事のコードは、実際に動かして確認されていますか?
いいえ。記事では、2026年10月11日に掲載コードを静的に読み直し、使用している条件分岐タグを公式リファレンスと照合しましたが、実際のWordPressにコードを入れて各ページ種別での表示・非表示を通した確認は行っていません。戻す場合は、functions.phpに追加した関数と登録の行を取り除き、記事に貼ったショートコードも削除します。



