editor.BlockEdit
— это важный хук WordPress, который позволяет модифицировать компонент редактирования блока. Этот хук предоставляет возможность обернуть существующий компонент BlockEdit
конструктором высшего порядка, добавляя дополнительную функциональность или интерфейсные элементы к блокам редактора.
Использование editor.BlockEdit
Чтобы расширить функционал редактора блоков, можно использовать хук editor.BlockEdit
. Он позволяет внедрять кастомные элементы управления в интерфейс каждого блока, например, добавляя свои панели инспектора только когда нужный блок выбран. Рассмотрим пример, как можно добавить пользовательскую панель управления.
Пример: Добавление пользовательской панели инспектора для выбранных блоков
const { createHigherOrderComponent } = wp.compose;
const { InspectorControls } = wp.blockEditor;
const { PanelBody, PanelRow, TextControl } = wp.components;
const { useSelect } = wp.data;
const enhanceBlockEdit = createHigherOrderComponent((BlockEdit) => {
return (props) => {
const shouldRenderPanel = useSelect(select => select('core/block-editor').getSelectedBlockClientId() === props.clientId);
return (
<>
<BlockEdit {...props} />
{shouldRenderPanel && (
<InspectorControls>
<PanelBody title="Настройки компонента" initialOpen={true}>
<PanelRow>
<TextControl
label="Пользовательское поле"
value={props.attributes.customField}
onChange={(value) => props.setAttributes({ customField: value })}
/>
</PanelRow>
</PanelBody>
</InspectorControls>
)}
</>
);
};
}, 'enhanceBlockEdit');
wp.hooks.addFilter(
'editor.BlockEdit',
'my-custom-plugin/enhance-blockedit',
enhanceBlockEdit
);
Важно учитывать производительность
Поскольку
editor.BlockEdit
применяется ко всем блокам, это может повлиять на производительность редактора. Поэтому следует всегда проверять необходимость выполнения дополнительных операций, например, рендеринг компонентов только при выбранном блоке используяprops.isSelected
или состояние выделенного блока.
Практика: Условное отображение по состоянию блока
Попробуем добавить панель, отображающуюся только для определённых блоков, и только тогда, когда они выделены.
const enhanceSelectiveBlockEdit = createHigherOrderComponent((BlockEdit) => {
return (props) => {
if (props.name !== 'core/paragraph') {
return <BlockEdit {...props} />;
}
return (
<>
<BlockEdit {...props} />
{props.isSelected && (
<InspectorControls>
<PanelBody title="Только для параграфов">
<PanelRow>
<TextControl
label="Специальное поле для параграфов"
value={props.attributes.specialField}
onChange={(value) => props.setAttributes({ specialField: value })}
/>
</PanelRow>
</PanelBody>
</InspectorControls>
)}
</>
);
};
}, 'enhanceSelectiveBlockEdit');
wp.hooks.addFilter(
'editor.BlockEdit',
'my-custom-plugin/enhance-selective-blockedit',
enhanceSelectiveBlockEdit
);
Заключение
Хук editor.BlockEdit
является мощным инструментом для разработки кастомных расширений в редакторе блоков WordPress. Корректное использование этого хука позволяет создавать более интерактивный и настраиваемый интерфейс, потенциально влияя на производительность. Следует внимательно подходить к его применению, чтобы обеспечить оптимальный пользовательский опыт.