Вопрос или проблема
Я пытаюсь сделать так, чтобы атрибуты моего блока отображались в REST API.
Для начала я добавил хук rest_api_init
для внесения моего блока в белый список.
add_action(
'rest_api_init',
function () {
if ( ! function_exists( 'use_block_editor_for_post_type' ) ) {
require ABSPATH . 'wp-admin/includes/post.php';
}
// добавить блок местоположения в REST API WordPress
$post_types = get_post_types_by_support( [ 'editor' ] );
foreach ( $post_types as $post_type ) {
if ( use_block_editor_for_post_type( $post_type ) ) {
register_rest_field(
$post_type,
'blocks',
[
'get_callback' => function ( array $post ) {
$raw_blocks= parse_blocks( $post['content']['raw'] );
$whitelisted_blocks = [];
foreach ($raw_blocks as $raw_block) {
if( $raw_block['blockName']=='myplugin/block-map-location' ){
array_push($whitelisted_blocks, $raw_block);
}
}
return $whitelisted_blocks;
},
]
);
}
}
}
);
Это выводит содержимое моего сырого блока, но массив attrs
пустой.
blocks:
0:
blockName: "myplugin/block-map-location"
attrs: []
innerBlocks:; []
innerHTML: "\n<div class=\"wp-block-myplugin-block-map-location\" aria-label=\"Интерактивная карта\" role=\"region\"><figure><div class=\"map-pp\" id=\"placepress-map\" data-lat=\"41.50214445\" data-lon=\"-81.6751670486689\" data-zoom=\"13\" data-basemap=\"carto_voyager\"></div><figcaption class=\"map-caption-pp\">Это подпись карты.</figcaption></figure></div>\n"
innerContent:
0: "\n<div class=\"wp-block-myplugin-block-map-location\" aria-label=\"Интерактивная карта\" role=\"region\"><figure><div class=\"map-pp\" id=\"placepress-map\" data-lat=\"41.50214445\" data-lon=\"-81.6751670486689\" data-zoom=\"13\" data-basemap=\"carto_voyager\"></div><figcaption class=\"map-caption-pp\">Это подпись карты.</figcaption></figure></div>\n"
Чтобы решить эту проблему, я попробовал следующее, используя пример из Руководства по Гутенбергу, но это, похоже, не дало никаких результатов. (Обратите внимание, что в данном случае я работаю с пользовательским типом записи “locations” и пытаюсь получить атрибуты “lat” и “lon” из моего блока.)
add_action( 'init', 'register_block_attributes' );
function register_block_attributes() {
register_meta( 'post', 'lat', array(
'object_subtype' => 'locations',
'show_in_rest' => true,
) );
register_meta( 'post', 'lon', array(
'object_subtype' => 'locations',
'show_in_rest' => true,
) );
}
Очевидно, я что-то упускаю, но не нахожу ответов в документации.
Отвечая на свой вопрос. Поскольку register_meta()
на самом деле добавляет в meta
, а не в blocks
, в выходных данных JSON, я просто добавил новый (избыточный) атрибут к моему блоку, используя source:meta
, где я могу вручную управлять вне тех атрибутов, которые использую для отображения блока.
attributes: {
api_coordinates: {
type: 'string',
source: 'meta',
meta: 'api_coordinates',
}, //...
}
Ответ или решение
Получение атрибутов блока в JSON REST API
Ваш запрос касался отображения атрибутов блока в REST API WordPress. Это довольно распространенная задача среди разработчиков, стремящихся раскрыть функциональность блоков Gutenberg через API. Давайте подробно разберем, как правильно это реализовать, чтобы атрибуты вашего блока были доступны в формате JSON.
Шаг 1: Регистрация блока в REST API
Вы на правильном пути, используя хук rest_api_init
, чтобы зарегистрировать ваш блок для работы с API. Убедитесь, что код правильно определяет и обрабатывает тип поста, который поддерживает блоки:
add_action('rest_api_init', function () {
if (!function_exists('use_block_editor_for_post_type')) {
require ABSPATH . 'wp-admin/includes/post.php';
}
$post_types = get_post_types_by_support(['editor']);
foreach ($post_types as $post_type) {
if (use_block_editor_for_post_type($post_type)) {
register_rest_field(
$post_type,
'blocks',
[
'get_callback' => function (array $post) {
$raw_blocks = parse_blocks($post['content']['raw']);
$whitelisted_blocks = [];
foreach ($raw_blocks as $raw_block) {
if ($raw_block['blockName'] == 'myplugin/block-map-location') {
array_push($whitelisted_blocks, $raw_block);
}
}
return $whitelisted_blocks;
},
]
);
}
}
});
Шаг 2: Регистрация атрибутов блока
Вы правильно поняли, что атрибуты вашего блока не появляются в attrs
массива, потому что метод register_meta()
добавляет метаданные к постам, а не к блокам напрямую. Чтобы получить доступ к атрибутам блока, необходимо использовать механизм источника данных в Gutenberg.
Вот шаги, которые помогут вам решить проблему:
- Определение атрибутов блока:
Убедитесь, что вы определили ваши атрибуты в блоке с использованием source: 'meta'
, чтобы они были связаны с метаданными:
attributes: {
lat: {
type: 'string',
source: 'meta',
meta: 'lat', // Ваша мета-ключ в базе данных
},
lon: {
type: 'string',
source: 'meta',
meta: 'lon', // Ваша мета-ключ в базе данных
},
}
Этот подход позволяет вам сохранять значения lat
и lon
блоков в метаданных поста.
- Регистрация метаданных для поста:
Ваш код для регистрации метаданных корректен. Убедитесь, что вы используете их в нужном контексте:
add_action('init', 'register_block_attributes');
function register_block_attributes() {
register_meta('post', 'lat', [
'object_subtype' => 'locations',
'show_in_rest' => true,
]);
register_meta('post', 'lon', [
'object_subtype' => 'locations',
'show_in_rest' => true,
]);
}
Шаг 3: Проверка доступности данных в REST API
После успешной интеграции атрибутов в блок и регистрации метаданных, вам стоит проверить выходные данные в REST API. Запросите соответствующий ресурс поста:
GET /wp-json/wp/v2/locations/<id>
В ответе должны быть поля lat
и lon
, что означает успешную интеграцию.
Заключение
Теперь вы знаете, как успешно получить атрибуты блока в JSON REST API. Основная идея заключается в назначении ваших атрибутов через source: 'meta'
и последующей регистрации метаданных с использованием register_meta()
. Этот процесс даст вам гибкость и удобство работы с данными блоков в вашем приложении или на вашем сайте.
Важно поддерживать документацию актуальной, чтобы другие разработчики могли извлечь пользу из ваших наработок. Надеюсь, это поможет вам в ваших будущих проектах!