Вопрос или проблема
Я хочу помощь с WP REST API Я хочу отобразить категории с первым уровнем дочерних элементов с некоторыми атрибутами. Вот как это должно выглядеть:
{
Родитель
"id": 3,
"name": "Футбол",
"slug": "футбол"
ребенок {
"id": 5,
"name": "Лига",
"slug": "лига"
}
}
Пожалуйста, кто-нибудь помогите мне… Спасибо
Я предполагаю, что вы хотите данные этих таксономий в каждом элементе JSON типа поста, но логика такая же для конечной точки таксономий и ответа JSON.
Я вижу два способа это сделать.
- фильтрация данных с использованием фильтра
rest_prepare_post_type
(Ссылка) или - создание нового поля с использованием функции
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, но и обеспечивает четкое разделение логики обработки данных, что упрощает поддержку и расширение вашего кода в будущем.
Если у вас есть дополнительные вопросы или вам нужна помощь с реализацией, не стесняйтесь обращаться!