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

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

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

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

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

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

以下のコードをテーマ(子テーマ)の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」となり、思わぬ結果となることがありますので注意しましょう。


と紹介しましたが、恐らくこの関数を使うケースは、ショートコードの有無によって、裏側でスクリプトや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 )」を使うようにすると、再利用ブロックでの判別ができないという問題が解消されて便利ですし、問題も起こりにくいでしょう。

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

更新日更新内容
2021年12月15日ページを公開しました
2022年 5月19日再利用ブロックを考慮したコードの紹介部分を追加しました