Получить атрибуты блока в JSON REST API

Вопрос или проблема

Я пытаюсь сделать так, чтобы атрибуты моего блока отображались в 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.

Вот шаги, которые помогут вам решить проблему:

  1. Определение атрибутов блока:

Убедитесь, что вы определили ваши атрибуты в блоке с использованием source: 'meta', чтобы они были связаны с метаданными:

attributes: {
    lat: {
        type: 'string',
        source: 'meta',
        meta: 'lat', // Ваша мета-ключ в базе данных
    },
    lon: {
        type: 'string',
        source: 'meta',
        meta: 'lon', // Ваша мета-ключ в базе данных
    },
}

Этот подход позволяет вам сохранять значения lat и lon блоков в метаданных поста.

  1. Регистрация метаданных для поста:

Ваш код для регистрации метаданных корректен. Убедитесь, что вы используете их в нужном контексте:

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(). Этот процесс даст вам гибкость и удобство работы с данными блоков в вашем приложении или на вашем сайте.

Важно поддерживать документацию актуальной, чтобы другие разработчики могли извлечь пользу из ваших наработок. Надеюсь, это поможет вам в ваших будущих проектах!

Оцените материал
Добавить комментарий

Капча загружается...