フィルターとフック
エディターには編集体験を変更する、多くのフィルターやフックが用意されています。以下にその一部を紹介します。
エディターの設定
エディターを変更する最も一般的な方法の1つが block_editor_settings_all
PHP フィルターです。このフィルターは初期化されたエディターに設定が送られる前に適用されます。
block_editor_settings_all
フックはコールバック関数に2つのパラメータを渡します。
$settings
– エディターの 構成可能な設定 の配列。$context
–WP_Block_Editor_Context
のインスタンスで、現在のエディターに関する情報を含むオブジェクト。
次の例では、プラグインを有効化できないユーザー (管理者) に対してコードエディターを無効にします。これをプラグインまたはテーマの functions.php
ファイル内に追加してテストしてください。
add_filter( 'block_editor_settings_all', 'example_restrict_code_editor' );
function example_restrict_code_editor( $settings ) {
$can_active_plugins = current_user_can( 'activate_plugins' );
// プラグインを有効化できないユーザー (管理者) に対してコードエディターを無効化する
if ( ! $can_active_plugins ) {
$settings[ 'codeEditingEnabled' ] = false;
}
return $settings;
}
その他の例については、以下のユースケースを含むEditor Hooksドキュメントをチェックしてください。
サーバーサイド theme.json フィルター
theme.json ファイルはインターフェースオプションを制御する素晴らしい方法ですが、グローバルまたはブロックレベルの変更しかできないため、シナリオによっては制限されることがあります。
例えば、前のセクションでは、theme.json を使用して色とタイポグラフィのコントロールをグローバルに無効にしましたが、管理者ユーザーに対しては色の設定を有効にしたい場合などです。
より柔軟性を持たせるため、WordPress 6.1では、4つの異なるデータレイヤーで theme.json データをカスタマイズできるサーバーサイドフィルターを導入しました。
wp_theme_json_data_default
– WordPress によって提供されるデフォルトデータへのフックwp_theme_json_data_blocks
– ブロックによって提供されるデータへのフックwp_theme_json_data_theme
– 現在のテーマによって提供されるデータへのフックwp_theme_json_data_user
– ユーザーによって提供されるデータへのフック
以下の例では、wp_theme_json_data_theme
フィルターを使用して、現在のテーマの theme.json ファイルのデータを更新します。現在のユーザーが管理者であれば、色のコントロールが復元されます。
// 管理者以外のすべてのユーザーの色コントロールを無効にする
function example_filter_theme_json_data_theme( $theme_json ){
$is_administrator = current_user_can( 'edit_theme_options' );
if ( $is_administrator ) {
$new_data = array(
'version' => 2,
'settings' => array(
'color' => array(
'background' => true,
'custom' => true,
'customDuotone' => true,
'customGradient' => true,
'defaultGradients' => true,
'defaultPalette' => true,
'text' => true,
),
),
);
}
return $theme_json->update_with( $new_data );
}
add_filter( 'wp_theme_json_data_theme', 'example_filter_theme_json_data_theme' );
このフィルターは、それぞれのレイヤーのデータを含む WP_Theme_JSON_Data
クラスのインスタンスを受け取ります。そこで、update_with( $new_data )
メソッドに、有効な theme.json に似た構造の新しいデータを渡します。$new_data
にはtheme.json のバージョン番号が必要です。
クライアントサイド (エディター) フィルター
WordPress 6.2では、新しいクライアント側フィルターが導入されました。エディターがレンダーされる前にブロックレベルでtheme.json settings を変更できます。
このフィルターは blockEditor.useSetting.before
と呼ばれ、JavaScript のコードで以下のように使用します。
import { addFilter } from '@wordpress/hooks';
/**
* カラムブロックのスペースオプションを px に制限する。
*/
addFilter(
'blockEditor.useSetting.before',
'example/useSetting.before',
( settingValue, settingName, clientId, blockName ) => {
if ( blockName === 'core/column' && settingName === 'spacing.units' ) {
return [ 'px' ];
}
return settingValue;
}
);
この例では、カラムブロックで使用可能なスペースの単位をピクセルだけに制限します。上述したように、同様の制限は、theme.json フィルターを使用するか、ブロックレベルの設定を使用してテーマの theme.json ファイルで直接適用できます。
しかし、blockEditor.useSetting.before
フィルターは、ブロックの位置、隣接するブロック、現在のユーザーの役割などに応じて設定を変更できる点でユニークです。カスタマイズの可能性は広範囲にわたります。
次の例では、見出しブロックがメディアとテキストブロックの中に配置されると、テキストの色コントロールが無効になります。
import { select } from '@wordpress/data';
import { addFilter } from '@wordpress/hooks';
/**
* メディアとテキストブロック内に配置された見出しブロックのテキスト色コントロールは無効化する。
*/
addFilter(
'blockEditor.useSetting.before',
'example/useSetting.before',
( settingValue, settingName, clientId, blockName ) => {
if ( blockName === 'core/heading' ) {
const { getBlockParents, getBlockName } = select( 'core/block-editor' );
const blockParents = getBlockParents( clientId, true );
const inMediaText = blockParents.some( ( ancestorId ) => getBlockName( ancestorId ) === 'core/media-text' );
if ( inMediaText && settingName === 'color.text' ) {
return false;
}
}
return settingValue;
}
);
ブロックフィルター
エディターそのもののカスタマイズだけでなく、個々のブロックを変更する方法も数多くあります。例えば、特定のブロックの背景色などのサポートを無効化したり、デフォルトで表示される設定を定義できます。
最もよく使われるフィルターの1つが block_type_metadata
です。サーバー上で PHP でブロックタイプを登録する際に、ブロックの block.json
ファイルから読み込まれた生のメタデータをフィルタリングできます。
フィルターは1つのパラメーターを取ります。
$metadata
(array
) – 登録するブロックタイプのblock.json
から読み込まれるメタデータ
metadata
配列にはブロックの説明や属性からブロックのサポートまで、ブロックに関するあらゆる情報が含まれています。
以下の例では、見出しブロックの背景色とグラデーションのサポートを無効化します。
function example_disable_heading_background_color_and_gradients( $metadata ) {
// フィルターは見出しブロックのみに適用
if ( ! isset( $metadata['name'] ) || 'core/heading' !== $metadata['name'] ) {
return $metadata;
}
// 'supports' キーの存在を確認
if ( isset( $metadata['supports'] ) && isset( $metadata['supports']['color'] ) ) {
// 背景色とグラデーションサポートを削除
$metadata['supports']['color']['background'] = false;
$metadata['supports']['color']['gradients'] = false;
}
return $metadata;
}
add_filter( 'block_type_metadata', 'example_disable_heading_background_color_and_gradients' );
利用可能なブロックフィルターの詳細については、ブロックフィルター ドキュメントを参照してください。
追加の情報
- How to modify theme.json data using server-side filters (サーバーサイドフィルターを使用して theme.json データを変更する方法) (WordPress Developer Blog)
- Curating the Editor experience with client-side filters (クライアントサイドフィルターで編集体験をキュレーションする) (WordPress Developer Blog)
最終更新日: