В этом уроке мы научимся работать с фильтрами блоков в WordPress, в частности с фильтром blocks.registerBlockType
.
Этот фильтр позволяет изменять не только атрибуты блока и их значения по умолчанию, но и другие данные блока, такие как заголовок, описание и т.д.
Как работают фильтры блоков?
Я уверен, что вы уже знакомы с PHP-фильтрами в WordPress, которые позволяют нам изменять WordPress множеством различных способов. Например, мы можем легко изменить содержимое записей и выводить что-то в конце:
add_filter( 'the_content', 'rudr_add_something_after_content', 99 );
function rudr_add_something_after_content( $content ) {
return $content . ' share buttons or something';
}
Блочные фильтры выглядят аналогично, но помните, что они должны выполняться на JavaScript.
wp.hooks.addFilter( 'hookName', 'namespace', rudrModifySomething, 99 )
function rudrModifySomething( something ) {
// we can modify it somehow first
return something
}
Или с помощью деструктуризации объекта wp.hooks
и стрелочной функции это будет выглядеть так:
const { addFilter } = wp.hooks
addFilter( 'hookName', 'namespace', something => {
// we can modify it somehow first
return something
}, 99 )
Но где запустить этот JavaScript? Можно просто создать JS-файл, например my-block-filter.js, и подключить его с помощью хука enqueue_block_editor_assets
.
add_action( 'enqueue_block_editor_assets', function() {
wp_enqueue_script(
'my-block-filters',
plugin_dir_url( __FILE__ ) . 'my-block-filters.js',
array( 'wp-blocks', 'wp-dom' )
);
} );
Если вы используете его внутри темы, а не в плагине, замените plugin_dir_url( __FILE__ )
на get_stylesheet_directory_uri() . '/'
.
Изменение значений атрибутов блока
Автоцентрирование изображений
wp.hooks.addFilter( 'blocks.registerBlockType', 'rudr/img', ( settings, name ) => {
if( 'core/image' === name ) {
return lodash.assign( {}, settings, {
attributes: lodash.assign( {}, settings.attributes, {
align: {
type: 'string',
default: 'center'
}
} )
} )
}
return settings
})
Если вы не знали:
core/image
, как вы уже догадались, является слагом блока «Image«, полный список слагов блоков ядра вы можете найти здесь.lodash
— это библиотека JavaScript, которая доступна в редакторе блоков, и мы можем свободно использовать ее, в данном конкретном примереlodash.assign()
позволяет добавлять или изменять свойства блока, предотвращая при этом мутацию объекта. Также можно использоватьlodash.merge()
— она позволяет не указывать тип атрибута (или другие свойства, которые мы не собираемся менять).
Результат:
Изменение атрибутов пользовательского блока
Идея этого руководства возникла у меня, когда один из моих клиентов, купивший мой плагин «Simple Carousel Block«, спросил меня о возможности изменять значения по умолчанию его атрибутов. Так что давайте попробуем сделать это прямо сейчас с помощью хука blocks.registerBlockType
.
Допустим, мы хотим, чтобы по умолчанию настройка «Слайдов для отображения» была равна 4, и была активна настройка «Навигационные точки» (см. скриншот ниже).
Код будет выглядеть следующим образом:
wp.hooks.addFilter( 'blocks.registerBlockType', 'rudr/atts', ( settings, name ) => {
if( 'rudr/carousel' === name ) {
return lodash.assign( {}, settings, {
attributes: lodash.assign( {}, settings.attributes, {
slides_to_show: {
type: 'number',
default: 4
},
pagination: {
type: 'boolean',
default: true
}
} )
} )
}
return settings
})
Если вы задаетесь вопросом, где я нашёл слаг пользовательского блока (rudr/carousel
) и названия его атрибутов (slides_to_show
, pagination
), то вам нужно просто заглянуть в файл block.json.
Модификация любых (почти) данных блока
Атрибуты блока — это не единственное, что мы можем изменить с помощью хука blocks.registerBlockType
. Для того чтобы получить наглядное представление о том, какие данные блока мы можем изменять, выполним команду console.log( settings )
для блока абзаца.
wp.hooks.addFilter( 'blocks.registerBlockType', 'rudr/smth', ( settings, name ) => {
if ( 'core/paragraph' === name ) {
console.log( settings );
}
return settings
})
Теперь давайте просто заглянем в консоль браузера:
И мы можем изменить здесь практически все! Давайте попробуем.
Изменение названия и описания блоков ядра
const { addFilter } = wp.hooks
addFilter( 'blocks.registerBlockType', 'rudr/changetitle', ( settings, name ) => {
if ( 'core/paragraph' === name ) {
return lodash.assign( {}, settings, {
title: 'Piece of text',
description: 'Start your article with a nice piece of text.'
} )
}
return settings
})
Результат:
Добавление поддержки выравнивания по ширине для абзаца
const { addFilter } = wp.hooks
const { assign, merge } = lodash
addFilter( 'blocks.registerBlockType', 'rudr/changesupport', ( settings, name ) => {
if ( 'core/paragraph' === name ) {
return assign( {}, settings, {
supports: merge( settings.supports, {
align: [ 'wide' ]
})
} )
}
return settings
})
Результат:
Источник: https://rudrastyh.com/gutenberg/change-default-blocks-with-block-filters.html
Источник: https://www.kobzarev.com/gutenberg/how-to-change-core-blocks-with-block-filters/