Как отобразить родительскую категорию с дочерними уровнями первого уровня в REST API

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

Я хочу помощь с WP REST API Я хочу отобразить категории с первым уровнем дочерних элементов с некоторыми атрибутами. Вот как это должно выглядеть:

{
  Родитель
  "id": 3,
  "name": "Футбол",
  "slug": "футбол"
  ребенок {
            "id": 5,
            "name": "Лига",
            "slug": "лига"
    }
}

Пожалуйста, кто-нибудь помогите мне… Спасибо

Я предполагаю, что вы хотите данные этих таксономий в каждом элементе JSON типа поста, но логика такая же для конечной точки таксономий и ответа JSON.

Я вижу два способа это сделать.

  1. фильтрация данных с использованием фильтра rest_prepare_post_type (Ссылка) или
  2. создание нового поля с использованием функции register_rest_field. (Ссылка)

Я бы рекомендовал второй подход. Это тот, который я недавно использовал с пользовательским типом поста

Случай 1: rest_prepare_post_type

В первом случае вы будете использовать фильтр rest_prepare_post_type, чтобы получить данные, сгенерировать нужные данные, добавить их в массив данных и вернуть отфильтрованные данные. В этом случае, если тип поста – “пост”, хук будет rest_prepare_post.

/**
 * @summary    Фильтрует ответ rest для поста
 *
 * @description    Фильтрует ответ rest для поста, удаляя или добавляя определенную информацию
 * @param     object    $data       Объект ответа.
 * @param     object    $post       Исходный объект типа поста.
 * @param     object    $request    Запрос, используемый для генерации ответа.
 * @return    object    $data       Отфильтрованный объект ответа.
 */
function wpse_283452_rest_prepare_post($data, $post, $request) {
    $_data = $data->data;
    // скажем, вы хотите удалить автора из ответа
    unset($_data['author']);
    // если вы хотите ДОБАВИТЬ поля, вы бы сделали логику здесь и...
    // добавили это в массив $_data
    $data->data = $_data;
    // и, наконец, вернули это
    return $data;
}
add_filter('rest_prepare_post', 'wpse_283452_rest_prepare_post', 10, 3);

Если вы хотите сделать то же самое для таксономий, вы бы использовали rest_prepare_taxonomy/ (ссылка)

Случай 2: register_rest_field (рекомендуется)

Вы зарегистрируете новое поле с помощью функции register_rest_field и заполните его так, как вам нужно, используя обратный вызов

/**
 * Регистрирует новое поле в существующем типе объекта WordPress.
 *
 * @since 4.7.0
 *
 * @global array $wp_rest_additional_fields Содержит зарегистрированные поля, организованные
 *                                          по типу объекта.
 *
 * @param string|array $object_type Объект(ы), к которому регистрируется поле
 *                                  "post"|"term"|"comment" и т. д.
 * @param string $attribute         Имя атрибута.
 * @param array  $args {
 *     Необязательно. Массив аргументов, использованных для обработки зарегистрированного поля.
 *
 *     @type string|array|null $get_callback    Необязательно. Функция обратного вызова, используемая для получения поля
 *                                              значения. По умолчанию 'null', поле не будет возвращено в
 *                                              ответе.
 *     @type string|array|null $update_callback Необязательно. Функция обратного вызова, используемая для установки и обновления
 *                                              значения поля. По умолчанию 'null', значение не может быть установлено или
 *                                              обновлено.
 *     @type string|array|null $schema          Необязательно. Функция обратного вызова, используемая для создания схемы для
 *                                              этого поля. По умолчанию 'null', запись схемы не будет возвращена.
 * }
 */
register_rest_field(
    'post',
    'wpse_283452_taxonomies',
    array(
        'get_callback' => function ($object, $field_name, $request) {
            return wpse_283452_taxonomies_callback($object);
        },
    )
);

/**
 * @summary    Возвращает массив с информацией о таксономии
 *
 * @description    Возвращает массив с информацией о таксономиях в пользовательском формате
 * @param     object    $object            Исходный объект rest
 * @return    array     $custom_taxonom    массив с терминами таксономии и их информацией в пользовательском формате
 */
function wpse_283452_taxonomies_callback($object) {
    $post_id = $object['id'];
    $terms = wp_get_post_terms(
        $post_id,
        'business_type',
        array(
            'fields' => 'all',
        )
    );
    // здесь вы должны построить массив с информацией в $terms в том формате/структуре, которая вам нужна
    return $terms;
}

Для таксономий вы будете использовать slug таксономии вместо ‘post’ в качестве первого аргумента в register_rest_field.

Вот и все.

Дайте мне знать, если это сработает.

Ответ или решение

Для того чтобы отобразить родительскую категорию и ее первый уровень дочерних категорий в WordPress REST API, существует несколько методов. В этой статье рассматриваются лучшие практики, включая использование хука rest_prepare_post_type и функции register_rest_field. Мы сосредоточимся на создании индивидуального ответа с необходимыми атрибутами в формате JSON, как указано в вашем примере.

Выбор подхода

Я рекомендую использовать второй подход с функцией register_rest_field, так как он предоставляет большую гибкость и чётко разделяет логику получения и отображения данных.

Шаги для реализации

1. Регистрация пользовательского поля с помощью register_rest_field

Первым шагом будет регистрация нового поля для типа записи, например, post. Это поле будет содержать информацию о родительских категориях и их дочерних элементах.

add_action('rest_api_init', function () {
    register_rest_field(
        'post',
        'custom_categories',
        array(
            'get_callback' => 'get_custom_categories_data',
        )
    );
});

2. Определение функции callback

Далее определим функцию get_custom_categories_data, которая будет получать нужные данные.

function get_custom_categories_data($object, $field_name, $request) {
    // Получаем ID поста
    $post_id = $object['id'];

    // Получаем термины таксономии 'category' для данного поста
    $terms = wp_get_post_terms($post_id, 'category', array('fields' => 'all'));

    $result = array();

    foreach ($terms as $term) {
        // Проверяем, является ли термин родительским
        if ($term->parent == 0) {
            $child_terms = get_term_children($term->term_id, 'category');
            $children = array();

            // Получаем дочерние категории
            foreach ($child_terms as $child_term_id) {
                $child_term = get_term($child_term_id);
                $children[] = array(
                    'id' => $child_term->term_id,
                    'name' => $child_term->name,
                    'slug' => $child_term->slug,
                );
            }
            // Формируем результат
            $result[] = array(
                'id' => $term->term_id,
                'name' => $term->name,
                'slug' => $term->slug,
                'children' => $children,
            );
        }
    }

    return $result;
}

Пример ответа

Когда вы выполните запрос через REST API, ваше поле custom_categories может выглядеть следующим образом:

{
  "custom_categories": [
    {
      "id": 3,
      "name": "Футбол",
      "slug": "football",
      "children": [
        {
          "id": 5,
          "name": "Лига",
          "slug": "league"
        }
      ]
    }
  ]
}

Заключение

Используя метод register_rest_field в сочетании с функцией обратного вызова, вы можете создать эффективное и настраиваемое решение для получения и отображения родительских категорий и их дочерних элементов через WordPress REST API. Этот подход не только улучшает структуру данных, возвращаемых API, но и обеспечивает четкое разделение логики обработки данных, что упрощает поддержку и расширение вашего кода в будущем.

Если у вас есть дополнительные вопросы или вам нужна помощь с реализацией, не стесняйтесь обращаться!

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

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