🙅‍♂️

Gutenberg使わないブロックを非表示にする方法3選

2022/06/24に公開1

ブロックを非表示にする方法を調べていた時に感じたことのメモです

この記事ではコードを少し書いてブロックを隠す方法を書いていきますがノーコードでやりたい人は以下の記事を参考にどうぞ。
https://www.vektor-inc.co.jp/post/disable-gutenberg-blocks/

ブロックマネージャーで設定

一番簡単でコアの人も非表示にしたいならこれを推奨していると思う

デメリット

  • ウィジェット
  • サイトエディター
    などではカスタム出来ない
    多分これはいづれ直る(コアが直している)

多分関連↓
https://github.com/WordPress/gutenberg/issues/31965

ユーザーごとに変更したり権限を設定することは出来ない

option値のように初期値を変えたりは出来ない(たぶん)

ブロックマネージャーソースコード該当箇所

https://github.com/WordPress/gutenberg/tree/33d84b036592a5bf31af05b7710f3b2b14163dc4/packages/edit-post/src/components/block-manager

inserterをfalseにする

  • コアの非推奨ブロックもこの方法を使っている

https://twitter.com/shimo_tmk/status/1516045020326887424

デメリット

コピペや複製などすれば今後も使える

PHPで非表示にする

add_filter( 'allowed_block_types_all', 
  function ( $allowed_block_types, $block_editor_context ) {
    // 許可するブロックタイプ
    $allowed_block_types = array(
      'core/paragraph',
      'core/heading',
    );
    return $allowed_block_types;
  },
  10,
  2 
);

デメリット

ブロックディレクトリーの検索などに不具合がある。
https://github.com/WordPress/gutenberg/issues/33954

unregisterでブロックの登録をやめる

そもそもブロックの登録をやめる

コード

// my-plugin.js
wp.domReady(function () {
  // オフにしたいブロックを指定する
  wp.blocks.unregisterBlockType('core/paragraph'); 
  wp.blocks.unregisterBlockType( 'core/heading' );
});

デメリット

もし使用しているページがあったらブロックが表示されない
ブロックのエラーが起きる

ちなみにブロック名の確認方法はこちらの記事に詳しく書いてありますが、ブロックエディターのコンソールでwp.blocks.getBlockTypes() と打てば出てきます。
https://zenn.dev/shimomura/articles/gutenberg-block-list

個人的にブロックを隠したいときはinserterをfalseで良いのかなと思います
もし使いたくなったら戻せるので。

GitHubで編集を提案

Discussion

セルティスラボセルティスラボ

参考になります
inserter なかなか良さそうです。allowed_block_types_all のような副作用もなさそう
PHPからinserter操作するコードを書いてみました

例えば $mytheme_options['hide_blocks']['core/avatar'] = true;
などの非表示にしたいブロックを登録しておくと投稿編集とウィジェットブロック画面で非表示にできました。設定で簡単にブロックを選択できるようにしておくと便利

global $pagenow;
if(isset($pagenow) && in_array($pagenow, array('post.php', 'widgets.php')) ){
    function mytheme_hide_blocks( $metadata ) {
        global $mytheme_options;
        if(isset($metadata['name']) && strpos($metadata['name'], 'core/') !== false ){
            if(!isset($metadata['supports']['inserter']) || $metadata['supports']['inserter'] === true){
                if(!empty($mytheme_options['hide_blocks'][$metadata['name']])){
                    $metadata['supports']['inserter'] = false;
                }   
            }        
        }    
        return $metadata;
    }    
    add_filter( 'block_type_metadata', 'mytheme_hide_blocks' );
}