特定のブロックが存在するかどうかでの条件分岐(メモ)

特定のブロックが存在するかどうかでの条件分岐(メモ)
このページについて
投稿や固定ページに〇〇というブロックがあったら..なかったら..という条件分岐をさせるために役立つコード、用法を簡単に紹介します。

WordPress5.0から変更となった投稿編集画面の動作。ブロックエディタといって、基本的にプレビューすることなくページを作るために採用された、使ってみると本当に便利なエディタです。

また、テーマやプラグインではブロックを使った編集に対応するため、より便利なブロックが簡単にできるような機能が追加されていたり、追加することができます。

しかしながら、テーマやプラグインによって追加される便利なブロック(カスタムブロック)は、当然ながらそれに対するデザイン要素であるCSSや何かの動きを加えるJSなどがページの読み込みと同時に追加で読み込まれることになります。

それらは、どのページでも問題なく動作するよう、使用しているかどうかに関わらず、すべてのページで出力されます。

さらにCSSやJSの内容、ブロックの数によっては結構な処理を行うものがあり、実際にそのページで使用していない処理をさせることで、表示速度を低下させたり、サーバーの負荷を上げたりする原因になることもあります。

本ページでは、これを回避させるため、「〇〇のブロックを使っていたら..」という条件を加えて、不要な処理や読み込みを制御する方法を紹介します。

ちなみにブロックエディタ以前でよく使われていて、ブロックエディタでも使えるようになっているショートコードがあるかないかを判別して処理を分ける場合は、特定のショートコードが本文内にあるかどうかによって処理を分岐する方法で紹介していますので、そちらもぜひ一読ください。

ページ上部へ戻る▲

特定のブロックが存在するかどうかでの処理分岐方法

条件分岐するブロックの名前(ネームスペース/ブロック名)を調べる

ブロックの判別をするためには、ブロックのネームスペースとブロック名を調べる必要があります。

これは、単純にプラグインを使うのがベストでしょう。

おすすめは、Find My Blocksです。

インストールと有効化したら、「ツール」→「Find My Blocks」を開くと、あらかじめWordPressに備わっている以外のブロックの一覧がずらっと表示されます。

その中から、制御の必要なブロックのネームスペース/ブロック名をどこかにコピーしておきましょう。

「has_block」関数を使った一番簡単な条件分岐方法

WordPressの機能である「再利用ブロック」を使わないサイトでの条件分岐はここで紹介するコードで実現できます。

逆に「再利用ブロック」内のブロックも含めて条件分岐する場合には、後述する方法を用いてください。

「再利用ブロック」を使わない場合には以下のコードをテーマのfunctions.phpへ挿入し、必要に応じて変更していきます。

function ユーザー定義関数名(){
if ( has_block( 'ネームスペース/ブロック名' ) ) {

//ブロックが存在する場合の処理
}else{
//ブロックが存在しない場合の処理
}
}

ユーザー定義関数は他の文字列と重複しない半角英数字と「_」を使った任意の名前を付けます。

ネームスペース/ブロック名は前述の方法で調べたものを入れます。

例として、ブロックがない場合に特定のスクリプトとCSSを読み込まなくするコードを紹介しておきます。

function ユーザー定義関数名(){
if ( has_block( 'ネームスペース/ブロック名' ) ) {
//ブロックが存在する場合の処理

}else{
//ブロックが存在しない場合の処理
wp_dequeue_script('スクリプトのID');
wp_dequeue_style( 'CSSのID' );
}
}
add_action('wp_enqueue_scripts','ユーザー定義関数名');

スクリプト・CSSのIDは、出力されているページのソースを開いて調べてください

再利用ブロックにあるブロックも含めて条件分岐する方法

こちらは結構複雑なコードで、実際は公式ページhas_blockに掲載されていたもののユーザー定義関数名を変更しただけのものになります。

以下のコードをテーマのfuncitons.phpへ追加します。

/***** 特定のブロックが存在するか *****/
/* if(ha_enhanced_has_block('ブロック名'))で条件分岐 */
function ha_enhanced_has_block( $block_name ) {
    if ( has_block( $block_name ) ) {
        return true;
    }
 
    if ( has_block( 'core/block' ) ) {
        $content = get_post_field( 'post_content' );
        $blocks = parse_blocks( $content );
        return ha_search_reusable_blocks_within_innerblocks( $blocks, $block_name );
    }
 
    return false;
}

/* 再利用ブロックを含めてブロックを探す */
function ha_search_reusable_blocks_within_innerblocks( $blocks, $block_name ) {
    foreach ( $blocks as $block ) {
        if ( isset( $block['innerBlocks'] ) && ! empty( $block['innerBlocks'] ) ) {
            habone_search_reusable_blocks_within_innerblocks( $block['innerBlocks'], $block_name );
        } elseif ( 'core/block' === $block['blockName'] && ! empty( $block['attrs']['ref'] ) && has_block( $block_name, $block['attrs']['ref'] ) ) {
            return true;
        }
    }
 
    return false;
}

コード追加後、以下のようにして、条件分岐を行います。

function ユーザー定義関数名($content){
if(ha_enhanced_has_block( 'ネームスペース/ブロック名' )){
	$find_block = 'ブロックはあります';
	return $find_block . $content;
}else{
	$no_block = 'ブロックは存在しません';
	return $no_block . $content;
}
}
add_filter('the_content','ユーザー定義関数名');

上記のコードで、適当なユーザー定義関数名を与え、ネームスペース/ブロック名を指定すれば、指定したブロックが存在する投稿・固定ページでは本文冒頭に「ブロックはあります」と表示され、なければ「ブロックは存在しません」と表示されるようになります。

上に記載したコードで条件判別用の「ha_enhanced_has_block」という独自関数を作り、下のコードにあるようにif(ha_enhanced_has_block( ‘ネームスペース/ブロック名’ ))で条件分岐をするといった形で使用します。

一旦別の関数(ha_enhanced_has_block)にするのは、通常の「has_block」関数では再利用ブロックまでを参照してくれないので、一旦再利用ブロックまでを含めてページ内のブロックを調べ、改めて関数(ha_enhanced_has_block)にして作り直すということが必要があるためです。

現時点でもっと簡単に分岐できるようにという予定はないようですので、この方法で行うしかなさそうですが、一度作っておけば「ha_enhanced_has_block」は使いまわしができますから、追加しておいて損はないと思います。

このページは役に立ちましたか?

著:清水 由規, 著:清水 久美子, 著:鈴木 力哉, 著:西岡 由美, 監修:星野 邦敏, 監修:吉田 裕介
¥2,948 (2022/08/11 01:26時点 | Amazon調べ)
著:Mana
¥2,200 (2022/08/11 01:26時点 | Amazon調べ)

作者:

WordPress用テーマ「HABONE」の開発、プラグインやテーマの翻訳、WordPressの使い方やカスタマイズ方法などの情報を配信しています。

年齢:40代 趣味/園芸・ペット・卓球