Когда вы регистрируете и сохраняете атрибуты в редакторе блоков WordPress (Gutenberg), у вас есть возможность сохранить их как метаданные вместо обычных атрибутов блока.
Используя этот метод, вы можете иметь настройку в своем блоке, которая может управлять чем-либо в посте или в шаблоне.
Важное примечание о рендеринге метаатрибутов публикации
Вы не можете отображать мета-атрибуты сообщений, используя метод сохранения JavaScript. Команда Гутенберга приняла решение предотвратить это, потому что блоки, которые отображают метаполя поста, могут быть легко сломаны из-за изменения мета поста в другом месте поста.
В этом руководстве мы собираемся расширить то, что мы уже создали в нашем руководстве по плагинам WordPress Gutenberg, а также в руководстве по динамическим блокам.
Предпосылки
- Быть знакомым с созданием плагинов для WordPress Gutenberg
- Будьте знакомы с динамическими блоками и рендерингом на стороне сервера
Регистрация метаданных сообщения в PHP
Прежде чем мы сможем использовать метаполе сообщения в JavaScript, мы должны убедиться, что мы зарегистрировали его в PHP с помощью register_metaи что для show_in_restаргумента установлено значение true.
Следуя руководству по динамическим блокам, откройте корневой PHP-файл плагина (в данном случае wholesome-plugin.php) и добавьте следующий код в конец этого файла после всех остальных функций:
function wholesomecode_wholesome_plugin_register_post_meta() {
register_meta(
'post',
'_wholesomecode_wholesome_plugin_block_text',
[
'auth_callback' => '__return_true',
'default' => __( 'Wholesome Plugin – hello from the editor!', 'wholesome-plugin' ),
'show_in_rest' => true,
'single' => true,
'type' => 'string',
]
);
}
add_action( 'init', 'wholesomecode_wholesome_plugin_register_post_meta' );
Этот код регистрирует метаполе, вызываемое _wholesomecode_wholesome_plugin_block_textдля postтипа записи. Это также гарантирует, что REST API может получить доступ к этому метаполю со show_in_restзначением true.
Мы также передаем функцию аргументу, __return_trueчтобы auth_callbackубедиться, что у нас есть права доступа к этому параметру. Если бы мы хотели повысить безопасность этого параметра, мы бы изменили его на пользовательскую функцию, которая проверяет определенную роль пользователя.
Регистрация метаатрибутов публикации в JavaScript
Опять же, следуя предыдущему руководству, откройте /src/index.jsи замените attributesследующим:
attributes: {
blockText: {
meta: '_wholesomecode_wholesome_plugin_block_text',
source: 'meta',
},
},
Вместо того, чтобы указывать тип атрибута и назначать значение по умолчанию, мы вместо этого определяем мета-ключ, из которого будет исходить атрибут данных, и указываем, что sourceатрибут имеет значение meta.
Как указано в предупреждении в верхней части этого руководства, вы не можете получить доступ к атрибутам метаполя записи с помощью saveметода JavaScript, поэтому скомпилируйте плагин npm startи давайте посмотрим, как мы можем вывести метаданные.
Рендеринг метаданных поста
Поскольку мы сохранили наш атрибут как метаданные записи, мы можем вывести его где угодно в WordPress, используя get_post_meta(при условии, что у нас есть $post_id):
get_post_meta( $post_id, '_wholesomecode_wholesome_plugin_block_text', true );
Продолжая руководство по динамическим блокам, давайте посмотрим, как мы можем получить доступ к этому атрибуту на стороне сервера в PHP.
Мета-данные недоступны через $attributesпараметр render_callback, так как мета-атрибуты поста не передают свое значение этому параметру, но мы можем получить доступ к глобальному $postобъекту, чтобы получить идентификатор поста.
Имея это в виду, давайте обновим наш register_block_typeдля вывода метаданных поста:
register_block_type(
'wholesomecode/wholesome-plugin',
array(
'editor_script' => 'wholesomecode-wholesome-plugin-block-editor',
'editor_style' => 'wholesomecode-wholesome-plugin-block-editor',
'render_callback' => function( $attributes, $content) {
global $post;
$block_text = get_post_meta( $post->ID, '_wholesomecode_wholesome_plugin_block_text', true );
return "<p class='wp-block-wholesomecode-wholesome-plugin'>$block_text</p>";
},
'style' => 'wholesomecode-wholesome-plugin-block',) );
Обратите внимание, что нам больше не нужно регистрировать attributesздесь, потому что мы получаем доступ к метаполю сообщения только через get_post_metaфункцию.
Использование блока
Это не лучший вариант использования метаданных такого типа, однако, когда мы используем блок, мы видим, что, поскольку мы сохраняем атрибуты как метаданные поста, если мы обновляем атрибут в одном блоке, он обновляет все блоки, как метаданные поста хранятся в посте, а не в отдельном блоке:
Опубликовать мета-атрибуты в действии
- Посмотрите на создание вложенных дочерних блоков с
InnerBlocksкомпонентом - Улучшите использование метаданных постов в Гутенберге, создав пользовательские метабоксы в Гутенберге .
- Посмотрите, как использовать настройки для хранения данных в таблице параметров в Гутенберге.