WordPress5.8から、FSE(フルサイト編集)用のブロックが追加されました。
しかし、ブロックベーステーマならばともかく、従来のPHPで組むテーマでこれらのブロックを使うことはほぼないと思います。むしろ邪魔になってしまうケースがほとんどだと思います。
なので、今回はそのFSEのためのブロックを使用できないようにする方法を紹介しておきます。
目次
PHP側で特定のブロックをオフにする方法
オフにするには、'allowed_block_types_all'
というフックを使います。(旧'allowed_block_types'
)
add_filter( 'allowed_block_types_all', function ( $allowed_block_types, $block_editor_context ) {
$allowed_blocks = [];
if ( is_array( $allowed_block_types ) && ! empty( $allowed_block_types ) ) {
// すでに許可リストがある場合
$allowed_blocks = $allowed_block_types;
} else {
// まだ空だったら全ブロック取得
$block_types = \WP_Block_Type_Registry::get_instance()->get_all_registered();
foreach ( $block_types as $block_type ) {
$allowed_blocks[] = $block_type->name;
}
}
$FSE_blocks = [
'core/loginout',
'core/page-list',
'core/post-content',
'core/post-date',
'core/post-excerpt',
'core/post-featured-image',
'core/post-terms',
'core/post-title',
'core/post-template',
'core/query-loop',
'core/query',
'core/query-pagination',
'core/query-pagination-next',
'core/query-pagination-numbers',
'core/query-pagination-previous',
'core/query-title',
'core/site-logo',
'core/site-title',
'core/site-tagline',
];
$disallowed_blocks = $FSE_blocks;
// その他、オフにしたいブロックがあれば $disallowed_blocks に追加
$allowed_blocks = array_diff( $allowed_blocks, $disallowed_blocks );
$allowed_blocks = array_values( $allowed_blocks ); // array_valuesちゃんとしないと効かない
return $allowed_blocks;
}, 99, 2);
ポイントは、WP_Block_Type_Registry
を使って全ブロックを取得してからいらないものを削除している点です。
この手法の問題点
ブロックディレクトリからの検索が無効になってしまうという問題点があります。
個人的にはブロックディレクトリから検索することがないので大丈夫なのですが、販売しているテーマでは不具合になってしまうので、後述する方法に切り替えました。
JSで特定のブロックをオフにする方法
blocks.registerBlockType
フックを使って、オフにしたいブロックを検出して{}
を返します。
import { addFilter } from '@wordpress/hooks';
addFilter('blocks.registerBlockType', 'my-namespace/filter-blocks', function (settings, name) {
const fseBlocks = [
'core/loginout',
'core/page-list',
'core/post-content',
'core/post-date',
'core/post-excerpt',
'core/post-featured-image',
'core/post-terms',
'core/post-title',
'core/post-template',
'core/query-loop',
'core/query',
'core/query-pagination',
'core/query-pagination-next',
'core/query-pagination-numbers',
'core/query-pagination-previous',
'core/query-title',
'core/site-logo',
'core/site-title',
'core/site-tagline',
];
if (-1 !== fseBlocks.indexOf(name)) {
return {};
}
return settings;
});
こうすることで、ブロックディレクトリからの検索は有効なまま、特定のブロックをオフにすることができました。
ただしこの手法の場合、オフにするブロックが過去に設置されていた場合、エディター上でブロックがクラッシュします。