WordPressのブロックエディタ(Gutenberg)では、ブロックを使用して直感的にコンテンツを構築できますが、時には不要なブロックを無効にしたい場合があります。例えば、クライアントサイトの制作で特定のブロックを無効にしたい場合や、不要なブロックを削除して編集作業を効率化したい場合などが考えられます。

そこでこの記事では、Gutenbergブロックを無効にする方法を複数ご紹介します。

  • WordPressのユーザーインターフェース(UI)でブロックを無効にする方法
  • ブロックをロックして移動したり削除したりするのを防ぐ方法
  • 権限ベースのアクセスなど、PHP でブロックの制限を強制する方法

なお、ブロックの可視性(条件によるコンテンツの表示/非表示)や、 theme.jsonで扱うテキストや背景色などの特定のブロック設定の無効化については取り上げませんが、ブロックのロック機能を制限する方法は後半でご説明します。

いずれの方法もプラグインなしで実行可能で、すべてのブロックテーマに適用可能です。

WordPress UIでブロックを無効にする方法

不要なブロックを無効にすると、編集作業が効率化されるだけでなく、無効化したブロックはメモリに読み込まれないため、バックエンドのパフォーマンスも若干向上します。

ブロックを無効にするには、WordPressからGutenbergエディタを開き、画面右上の3つの点を選択して「設定」を開きます。「ブロック」タブを選択して、必要のないブロックのチェックを外すだけで、ブロックインサーターから削除されます。

例えば、以下のように、「引用」ブロックのチェックを外すと、「引用」ブロックが無効になります。

ブロック設定で「引用」ブロックを無効にした状態
ブロック設定で「引用」ブロックを無効にした状態

さらに細かく設定するには、ブロックカテゴリー全体を無効にすることも可能です。例えば、「テキスト」カテゴリのチェックを外すと、ブロックインサーターからテキストに関連するすべてのブロックが削除され、使用できなくなります。エディタを簡素化し、ユーザーが不要なブロックにアクセスするのを防ぐのに有用です。

ブロック設定で「テキスト」ブロックカテゴリー全体を無効にした状態
ブロック設定で「テキスト」ブロックカテゴリー全体を無効にした状態

PHPでブロックを無効にする方法

WordPressでブロックの使用を許可または禁止するには2つのアプローチがあり、必要に応じて、ブロックをインサーターで有効または無効化します。

いずれの方法もPHP やJavaScriptを使って実装することになり、それぞれにメリットとデメリットがあります。ブロックを許可する場合は一般にPHPの方がシンプルで、ブロックを禁止する場合は、JavaScriptを使用する方が効率的です。

今回はさまざまな使用例をご紹介できるよう、PHPを使用していきます。

使用を許可するブロックの設定

インサーターで特定のブロックだけを使用できるようにするには、以下のフィルターを使います。

add_filter('allowed_block_types_all', 'allowed_block_types_all_users', 10, 2 );

function allowed_block_types_all_users( $allowed_blocks, $block_editor_context ) {
    return array(
        'core/paragraph',
        'core/heading',
        'core/image',
        'core/cover',
        'core/list',
        'core/list-item'
    );
}

テーマが更新された際に変更が失われるのを防ぐため、このコードは子テーマfunctions.phpファイルに追加してください。

この方法では、必要な子テーマブロックがすべて含まれていなければなりません。例えば、core/listブロックを許可する場合、エラーを防ぐためにcore/list-itemも含めてください。

使用を許可するブロックの設定
使用を許可するブロックの設定

allowed_block_types_allフィルターは、インサーターで利用可能なブロックを開発者が制御できるようにします。このフィルターは以下2つのパラメータを受け取ります。

  • $allowed_block_types─許可するブロックを定義する配列またはブール値(デフォルトは true)
  • $block_editor_context─編集中の投稿を含む、現在のGutenbergに関する情報を提供

投稿者と寄稿者に特定のブロックの使用を許可

次のコードは、publish_pages(公開)権限を持たないユーザー(投稿者と寄稿者)に対して、利用可能なブロックを制限します。

add_filter('allowed_block_types_all', 'allowed_block_types_for_non_admins', 10, 2);

function allowed_block_types_for_non_admins($allowed_blocks, $block_editor_context) {
    // ユーザーが publish_pages 権限を持っていない場合に制限を適用
    if (!current_user_can('publish_pages')) {
        // publish_pages 権限を持たないユーザーに許可されるブロックを定義
        $allowed_blocks = array(
            'core/paragraph',
            'core/heading',
            'core/image',
            'core/cover',
            'core/list',
            'core/list-item'
        );
    }
    return $allowed_blocks;
}

上の例では、投稿者と寄稿者は段落、見出し、画像、カバー、リストブロックのみを使用できます。

特定の投稿タイプとユーザーにブロックの使用を許可

以下のコードは、固定ページの編集時には「ショートコード」ブロックをインサーターに追加し、他の投稿タイプでは使用できないようにする例です。

add_filter('allowed_block_types_all', 'allowed_block_types', 25, 2);

function allowed_block_types($allowed_blocks, $editor_context) {
    $allowed_blocks = array(
        'core/paragraph',   
        'core/heading',    
        'core/image',      
        'core/cover',      
        'core/list',       
        'core/list-item'
    );

    // エディタコンテキストにpostオブジェクトがあり、そのタイプがpostであるかを確認
    if (!empty($editor_context->post) && 'page' === $editor_context->post->post_type) {
        $allowed_blocks[] = 'core/shortcode';
    }

    return $allowed_blocks;
}

なお、投稿者を追加しても、固定ページを作成したり修正したりすることはできないため、結果は投稿にのみ表示されます。

ユーザーには基本的に6つのブロックしか表示されませんが、管理者と編集者には固定ページでのみ利用可能なショートコードブロックが表示されます。

管理者と編集者のみがショートコードブロックを使用できる状態
管理者と編集者のみがショートコードブロックを使用できる状態

この例では、デフォルトで新規固定ページを追加することができないため、投稿者と寄稿者に与える影響はありませんが、Role Managerプラグインを使ってこの権限を変更することができます。

投稿IDに基づいてブロックの使用を許可

特定の投稿に対してのみブロックの使用を許可するには、以下のコードを使用します。

add_filter('allowed_block_types_all', 'allowed_block_types', 10, 2);

function allowed_block_types($allowed_blocks, $editor_context) {
    // エディタコンテキストにpostオブジェクトがあるかを確認
    if (!empty($editor_context->post)) {
        $post_id = $editor_context->post->ID;

        // 特定の投稿IDに対して許可されるブロックを定義
        $allowed_blocks_by_post = array(
            2 => array('core/paragraph', 'core/heading', 'core/image'),
            3 => array('core/paragraph', 'core/heading', 'core/image')
        );

        // 現在の投稿IDが定義された許可ブロック配列を持っているか確認
        if (array_key_exists($post_id, $allowed_blocks_by_post)) {
            return $allowed_blocks_by_post[$post_id];
        }
    }
    return $allowed_blocks;
}

この例では、投稿IDが2と3の場合、段落、見出し、画像ブロックのみが使用可能になります。

特定の投稿IDで使用可能ブロックを制限
特定の投稿IDで使用可能ブロックを制限

投稿IDの数が少ない場合はこれでOKですが、固定ページや投稿が頻繁に追加される動的なサイトでは、タクソノミーやカスタムフィールドで絞り込むことを検討してみてください。

使用を禁止するブロックの設定

先ほどの「使用を許可するブロックの設定」は、指定されないブロックは使用が禁止されることから、必然的に使用を禁止するブロックの設定にもなりますが、一部のブロックを除いてほとんどのブロックを許可したい場合は、このアプローチを取ることができます。以下は、見出しとカバーブロックの使用を禁止する例です。

add_filter('allowed_block_types_all', 'deny_blocks');

function deny_blocks($allowed_blocks) {
    // 登録されているすべてのブロックを取得
    $blocks = WP_Block_Type_Registry::get_instance()->get_all_registered();

    // 特定の2つのブロックを無効化
    unset($blocks['core/heading']);
    unset($blocks['core/cover']);

    return array_keys($blocks);
}

登録されているすべてのブロックを取得して、見出しとカバーブロック無効にします。

なお、コアであってもなくても、ブロックがJavaScriptに登録されている場合は、JavaScriptの登録を解除しなければなりません。

ブロックカテゴリー全体の使用を禁止

ウィジェット埋め込みテーマブロックなど、ブロックのカテゴリー全体を無効にするには、以下のコードを使用します。

add_filter('allowed_block_types_all', 'disable_blocks_by_categories', 10, 2);

function disable_blocks_by_categories($allowed_blocks, $editor_context) {
    // 登録されているすべてのブロックを取得
    $registered_blocks = WP_Block_Type_Registry::get_instance()->get_all_registered();

    // 無効にするカテゴリーを指定
    $categories_to_disable = array('widgets', 'embed', 'theme');

    // 許可されたブロック名を保持する配列を初期化
    $allowed_block_names = array();

    // 登録されたブロックをループ
    foreach ($registered_blocks as $block_name => $block_type) {
        // ブロックにカテゴリーが定義されているか確認
        if (isset($block_type->category)) {
            // ブロックのカテゴリーが無効リストにない場合、そのブロックを許可
            if (!in_array($block_type->category, $categories_to_disable, true)) {
                $allowed_block_names[] = $block_name;
            }
        } else {
            // ブロックにカテゴリが定義されていない場合、デフォルトで許可
            $allowed_block_names[] = $block_name;
        }
    }
    return $allowed_block_names;
}

この方法により、ブロックカテゴリー全体が無効になり、Gutenbergの操作が簡素化されます。

ウィジェット、埋め込み、テーマのブロックカテゴリーが無効化されたインサーター
ウィジェット、埋め込み、テーマのブロックカテゴリーが無効化されたインサーター

WordPress UIでブロックをロックする方法

ブロックをロック(固定)すると、コンテンツの編集は許可したまま、ブロックが移動したり削除されたりすることを防ぐことができます。ブロックツールバーの「ロック」を選択すると、誰でもブロックをロック、またはロック解除可能です。

ブロック名の横にある3つの点をクリックして、「ロック」>「すべてをロック」を選択すると、「移動を無効化」と「削除を防止」の両方が有効になります。必要に応じて、いずれかを選択するだけでもOKです。

ロック設定で移動を無効化したり削除を防止したりすることができる
ロック設定で移動を無効化したり削除を防止したりすることができる

なお、ブロックがロックされていても、さらなる設定を行わない限りはユーザーはコンテンツとスタイルを変更することができます。

スタイルの変更を禁止するには、このロック機能に加えて、theme.jsonファイルに変更を加える必要があります。

ネストされた要素を含むブロックの場合、親ブロックだけをロックするか、すべての内部ブロックもロックするかを選択できます。これにより、グループ化された要素は構造化されたまま、その中で編集範囲を制御することが可能になります。

ロック設定には親ブロックで利用可能なオプションが表示される
ロック設定には親ブロックで利用可能なオプションが表示される

PHPでブロックをロックする方法

WordPress UIのブロックのロック機能は基本的なもので、サイト全体の制限を設定するものではありません。エディタにアクセスできるユーザーであれば、誰でもブロックのロックを解除できるため、ロックされたコンテンツを簡単に上書きできてしまいます。ブロックを恒久的にロックするには、PHPを使用するのがベストです。

PHPを使えば、ブロックのロックとロック解除の機能を丸ごと取り除くことができ、すべてのユーザーに対して制限を設定することができます。これは、ブロックのロック機能が導入されたWordPress 5.9以前からあるWordPressの機能です。

ブロックのロックは、多くのシナリオ、特に構造化されたコンテンツを管理する場合に役立ちます。

  • ユーザーが主要なブロックを変更できないようにしてデザインの整合性を保つ
  • 偶発的な編集によるレイアウトの崩れを防止
  • 不要な選択肢を減らすことでコンテンツ作成を効率化
  • パターンやテンプレートの一貫性を確保

すべてのユーザーに対するブロックロック機能の削除

以下のコードは、ブロックのロック機能を無効にし、すべてのユーザーがブロックをロックまたはロック解除できないようにするものです。

add_filter('block_editor_settings_all', 'example_disable_block_locking', 10, 2);

function example_disable_block_locking($settings, $context) {
   $settings['canLockBlocks'] = false; 
   return $settings;
}

これを適用すると、Gutenbergからブロックのロック機能が完全に削除されます。

Kinstaでサイトをホスティングしている場合は、すべてのWordPressサイトでデフォルトで有効になっているSFTPを使用して、テーマファイルの変更を簡単かつ安全に行うことができます。

ユーザー権限に基づいてブロックのロック機能を制限する

ブロックのロック機能を完全に削除するのではなく、一部のユーザーに対してのみ無効にしたい場合は、以下のコードを使用することができます。以下は管理者と編集者のみがブロックのロック機能を使用でき、寄稿者や投稿者がブロックのロックを解除できないようにするものです。

add_filter('block_editor_settings_all', 'example_disable_block', 10, 2);

function example_disable_block ($settings, $context ) {
   if (
       isset( $context->post ) &&
       'post' === $context->post->post_type &&
       ! current_user_can( 'edit_theme_options' )
   ) {
       $settings['canLockBlocks'] = false; 
       $settings['codeEditingEnabled'] = false;   
   }
   return $settings;
}

上のコードでは、ブロックの制御をedit_theme_options(テーマの設定編集)権限を持つユーザー(通常は管理者と編集者)に制限します。投稿者や寄稿者は、上位のユーザーが設定したロックを解除することはできません。

また、コードエディタへのアクセスも無効になり、ユーザーがこの制限を回避するために手動でブロックのマークアップを修正するのを防ぎます。これにより、コーディングの知識を持つユーザーであっても、適切な権限を持たない限りはブロックのロックを解除できないことが保証されます。

まとめ

ブロックの使用を許可するか拒否するか、あるいはその両方を組み合わせるかは、特定の要件によって異なります。特定のブロックを制限してすっきりとした編集環境を実現したり、デザインの一貫性を強化したり、ユーザーの役割に基づいてアクセスを制限したりすることができます。

また、ユーザー権限を変更することで、ブロックの管理方法をさらにカスタマイズ可能です。今回ご紹介した内容を超えたきめ細かな設定を行うことができます。

WordPressは、日々活発に進化しているコンテンツ管理システム(CMS)です。今後のアップデートにより、ブロックを管理する新たな方法が導入されたり、既存の機能が変更されたりする可能性は十分あるため、常にWordPress開発に関する最新情報を気にかけるようにすることをおすすめします。

安全で開発者に配慮したサーバーをお探しですか?Kinstaでは、SFTP経由のテーマファイル編集を含むWordPressファイルの管理を簡素化し、サイトの安定性を維持しながら安全でシームレスなカスタマイズを可能にするWordPress専用マネージドクラウドサーバーを提供しています。ご興味がございましたら、ぜひ一度お試しください。

Bud Kraus

Bud Kraus has been working with WordPress as an in-class and online instructor, site developer, and content creator since 2009. He has produced instructional videos and written many articles for WordPress businesses.