特定のショートコードが本文内にあるかどうかによって処理を分岐する方法

公開日:2021(令和3)年12月15日/最終更新日:

WordPress Customize Ideas | Personal WP Customization Notes (PWCN)

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています

あまり使わないかも知れませんが、投稿や固定ページの本文内に特定のショートコードがあったら...なかったら...で処理を分岐する方法をメモとして掲載しておきます。

ショートコードで何かの動作をさせるシーンにおいて、ショートコードがなかったら特定のスクリプトやCSSの読み込みをしないといったページパフォーマンスの改善策として使えると思います。

例として、本文内に〇〇〇というショートコードがあるかないかを判断し、

  • ショートコードがあれば、本文先頭に「ショートコードが動作しています」という文字列を表示
  • ショートコードがなければ、本文先頭に「ショートコードは存在しません」という文字列を表示

するような動作をさせるコードを紹介します。

コードを使用する前に、ここをクリックして注意事項をご確認ください

本ページで掲載しているコードは、以下に了承した上で使用ください

  • コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
  • コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
  • コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
  • コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
  • 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
  • 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)

本文内に特定のショートコードがあるかを判別して条件分岐する

以下のコードをテーマ(子テーマ)のfunctions.phpへコードを追記し、〇〇〇となっている箇所を実際のショートコードに変更してから保存することで動作します。

/***** ショートコードの有無により、本文冒頭に文字列表示 *****/
function hab_has_sc_function($content){
global $post;
// [〇〇〇] というショートコードが含まれているか
if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, '〇〇〇' ) ) {
	// ショートコードがある場合の処理
	$find_shortcode = 'ショートコードが動作しています';
	return $find_shortcode . $content;
}else{
	// ショートコードがない場合の処理
	$no_shortcode = 'ショートコードは存在しません';
	return $no_shortcode . $content;
}
}
add_filter('the_content','hab_has_sc_function');

ここで使われている判別関数「has_shortcode」はあまり使われていないので私も知りませんでした。

実際にテストしてみたところ、has_shortcoe関数は、ショートコードがあるかどうかという判別ではなく、実際に動作するショートコードが存在しているかを判別するものですので、何かのプラグインのショートコードに対する判別をしている場合で、プラグインを停止した場合の判別結果は「false」となり、思わぬ結果となることがありますので注意しましょう。

また、こちらのコードでも同じように動作させることができます(個人的にはこちらの方が分かりやすい気がします)

$content = get_post_field('post_content'); // 投稿または固定ページの内容を取得
$shortcode = '〇〇〇'; // 存在を確認したいショートコードの名前

if (has_shortcode($content, $shortcode)) {
	// ショートコードがある場合の処理
	$find_shortcode = 'ショートコードが動作しています';
	return $find_shortcode . $content;
}else{
	// ショートコードがない場合の処理
	$no_shortcode = 'ショートコードは存在しません';
	return $no_shortcode . $content;
}

と紹介しましたが、恐らくこの関数を使うケースは、ショートコードの有無によって、裏側でスクリプトやCSSを読み込むなどの処理をさせる目的が多いでしょう。その場合はWordPress公式のコードリファレンスに掲載されているサンプルコードを参考に機能実装するとよいでしょう。

再利用ブロックを含めて判別して条件分岐するときは

前述したコードでは、再利用ブロックの中にあるショートコードに対しては判別してくれません。

理由としては、ショートコードがあるかを判別した後で、再利用ブロックが読み込まれるためだと考えられます。

これを解消するために、本文を再利用ブロックを含めて再取得し、それに対して判別をするという方法に切り替えます。

具体的には、do_blocksというWordPress組み込み関数を噛ませて再取得します。

以下が再利用ブロックも含めて判別するコードです。

/***** ショートコードの有無により、本文冒頭に文字列表示(再利用ブロック含む) *****/
function hab_has_sc_reusein_function($content){
global $post;
	$include_reuse = do_blocks( $post->post_content );
// [〇〇〇] というショートコードが含まれているか
if( is_a( $post, 'WP_Post' ) && has_shortcode( $include_reuse, '〇〇〇' ) ) {
	// ショートコードがある場合の処理
	$find_shortcode = 'ショートコードが動作しています';
	return $find_shortcode . $content;
}else{
	// ショートコードがない場合の処理
	$no_shortcode = 'ショートコードは存在しません';
	return $no_shortcode . $content;
}
}
add_filter('the_content','hab_has_sc_reusein_function');

参考:do_blocks

今回に限らず、「$post->post_content」で本文を取得して何かをする際には、上記コードのように「do_blocks( $post->post_content )」を使うようにすると、再利用ブロックでの判別ができないという問題が解消されて便利ですし、問題も起こりにくいでしょう。

また、前項と同様に以下の記述して同様の動作をさせることもできます。

$content = do_blocks(get_post_field('post_content')); // 投稿または固定ページの内容を取得
$shortcode = '〇〇〇'; // 存在を確認したいショートコードの名前

if (has_shortcode($content, $shortcode)) {
	// ショートコードがある場合の処理
	$find_shortcode = 'ショートコードが動作しています';
	return $find_shortcode . $content;
}else{
	// ショートコードがない場合の処理
	$no_shortcode = 'ショートコードは存在しません';
	return $no_shortcode . $content;
}

本記事の更新(変更)履歴

更新日更新内容
2021年12月15日ページを公開しました
2022年 5月19日再利用ブロックを考慮したコードの紹介部分を追加しました
2024年 2月21日別の記述方法を追加しました
, , , , , , ,
Lolipop ServerMoshimo Ad x-serverMoshimo Ad

WordPress Customize Ideas | Personal WP Customization Notes (PWCN)
CSSをHTMLソースに直接出力する、wp_add_inline_style()の使い方