Вопрос или проблема
Я перепробовал все возможные варианты. Ничего не сработало. Не уверен, стоит ли вообще всё это публиковать, но вот пример:
add_action( 'enqueue_block_editor_assets', __NAMESPACE__ . '\enqueue_hide_blocks_script' );
function enqueue_hide_blocks_script(): void {
wp_enqueue_script(
'arve-hide-blocks', // Обработчик
plugins_url( 'src/hide-blocks.js', PLUGIN_FILE ),
array( 'wp-blocks', 'wp-dom-ready', 'wp-edit-post' ),
VERSION,
array( 'strategy' => 'defer' )
);
}
wp.domReady( () => {
const embedBlock = wp.data.select( 'core/blocks' ).getBlockType( 'core/embed' );
console.log( 'embedBlock', embedBlock ); // пусто
if ( embedBlock && embedBlock.variations ) {
embedBlock.variations.forEach( ( variation ) => {
if ( [ 'youtube', 'vimeo' ].includes( variation.name ) ) {
// Скрыть из вставщика, изменяя поддержку
wp.blocks.registerBlockType( 'core/embed', {
...embedBlock,
supports: {
...embedBlock.supports,
inserter: false,
},
} );
}
} );
}
} );
Я пытался получить вариации блока core/embed
разными способами, и ничего не работало. Также пробовал решения на PHP, предложенные ИИ, но они не сработали.
Чтобы было ясно, я только хочу удалить вариации, а не весь блок core/embed
. И я хочу удалить их только из вставщика, а не вовсе, чтобы уже вставленные блоки оставались работоспособными, это у меня уже работало.
Попытка повторно зарегистрировать вариации не сработает, как вы уже обнаружили. Вместо этого, вам нужно подключиться к изначальной регистрации типа блока core/embed
и изменить параметры там. Это можно сделать, используя block.registerBlockType
hook:
function alterEmbedVariations( settings, name ) {
if ( name !== 'core/embed' ) {
return settings;
}
return {
...settings,
variations: variations.map( ( variation ) => {
if ( [ 'youtube', 'vimeo' ].includes( variation.name ) ) {
variation.supports = {
...variation.supports,
inserter: false,
};
}
return variation;
},
};
}
wp.hooks.addFilter(
'blocks.registerBlockType',
'my-plugin/embed/variations-alter',
alterEmbedVariations
);
Примечание: вам не нужно размещать это внутри wp.domReady
, так как система хуков обеспечит выполнение функции фильтра в нужное время.
Возможно, вам также нужно будет удалить стратегию defer
из параметров загрузки скрипта. Время выполнения может или не может быть важно для правильной работы функции фильтра.
Ответ или решение
Вопрос о том, как скрыть вариации блоков YouTube и Vimeo из блока редактора WordPress, но оставив уже вставленные блоки функциональными, представляет собой довольно распространенную задачу в разработке кастомных решений для WordPress. Для полноты понимания данного вопроса необходимо глубже изучить, как WordPress работает с блоками и их вариациями, и какие подходы могут быть применены для достижения желаемого результата.
Теория
WordPress предоставляет разработчикам возможность создавать и настраивать блоки через редактор блоков Gutenberg. Каждый блок может иметь свои вариации — варианты блока, которые сохраняют базовую функциональность, но могут различаться стилями, атрибутами и поведением. Например, в блоке core/embed
могут быть такие вариации, как YouTube, Vimeo и другие сервисы обмена видео.
Когда вы хотите скрыть определенные вариации из интерфейса ввода блоков (Block Inserter), но сохранять возможность их использования, если они уже вставлены, недостаточно просто "дезактивировать" блок; вам необходимо аккуратно модифицировать параметры вариаций, чтобы они были невидимы только при добавлении новых блоков.
Пример
В представленных вами фрагментах кода вы пытаетесь использовать функцию wp.domReady()
для манипуляций с блоками. Однако подходящего результата она не дает, поскольку wp.domReady()
выполняется слишком поздно для успешного воздействия на начальные параметры регистрации блоков. Вместо этого, целесообразно использовать хуки WordPress, которые позволяют изменять параметры блока непосредственно в момент его регистрации.
Вот как это можно сделать правильно, с использованием хука blocks.registerBlockType
:
function alterEmbedVariations(settings, name) {
if (name !== 'core/embed') {
return settings;
}
// Изменение вариаций
if (settings.variations) {
settings.variations = settings.variations.map((variation) => {
if (['youtube', 'vimeo'].includes(variation.name)) {
return {
...variation,
supports: {
...variation.supports,
inserter: false,
},
};
}
return variation;
});
}
return settings;
}
wp.hooks.addFilter(
'blocks.registerBlockType',
'my-plugin/embed/variations-alter',
alterEmbedVariations
);
Применение
Прежде всего, измените регистрацию вашего скрипта, чтобы убрать стратегию defer
. Это важно потому, что слушатель хука должен быть активен до загрузки редактора блоков — вам необходимо подхватить регистрацию блока почти сразу после старта страницы, а стратегия defer
может этому помешать.
Кроме того, при работе с блоками через хуки важно убедиться, что вы используете правильные зависимости, чтобы скрипт загружался тогда, когда это необходимо, но не раньше. Заметьте, что ваш скрипт должен зависеть, например, от wp-blocks
и wp-hooks
.
Чтобы проверить, как работают ваши изменения, помните, что для их применения может потребоваться очистка кэша браузера и кэша WordPress, а также обновление страницы редактора.
В случае, если после применения этих настроек вариации все еще видны в Block Inserter, убедитесь, что нет других плагинов или тем, которые могли бы вмешиваться в логику блоков, поскольку они могут перекрывать ваш код своими собственными изменениями.
Таким образом, вместе с верной реализацией методов и хорошо отлаженной стратегией загрузки скриптов вы сможете успешно скрыть нужные вариации в Block Inserter редактора Gutenberg, не влияя на функциональность ранее добавленных элементов.