Вопрос или проблема
Я работаю с woocommerce rest API v1, чтобы создать страницу магазина с поддержкой AJAX.
Что я попробовал:
- создал пользовательские таксономии для типа записи продуктов woocommerce
- установил show_in_rest в true для этих таксономий
- сделал запрос к woocommerce rest api как
/wp-json/wc/v1/products/?consumer_key=[actual_consumer_key]&consumer_secret=[actual_consumer_secret]
Что я ожидал:
Список продуктов и их вариаций с категориями, тегами, И пользовательскими таксономиями для каждого продукта.
Что я получил:
Список продуктов со всем КРОМЕ моих пользовательских таксономий
Моя догадка:
Таксономии связаны с записями wordpress, в то время как woocommerce rest api возвращает JSON данные в виде экземпляра класса WC_Product. Но если это так, почему у меня есть категории и теги? (которые являются стандартными таксономиями)
Я получаю эти данные с помощью AJAX, поэтому get_terms
не является вариантом. Я не могу сделать один запрос на продукт, чтобы получить таксономии, мне нужно все в упакованном виде.
Мне нужно создать пользовательский конечный пункт для этого?
Пожалуйста, дайте знать, если я неясен.
С уважением,
ИЗМЕНЕНИЕ: Я только что узнал, что wordpress REST API (не woocommerce) позволяет мне получать пользовательские таксономии вместе с продуктами. У меня есть несколько проблем с этим:
- У меня нет всех продуктов там
- нет информации о продукте, такой как его вариации или цена
- Я не хочу делать один запрос к обоим API – Woocommerce и WordPress, чтобы получить все данные
Является ли пользовательский конечный пункт единственным способом?
На момент версии API, действующей в августе 2024 года, вот как сделать так, чтобы уже зарегистрированная пользовательская таксономия была доступна в WC REST API:
add_filter( "woocommerce_rest_prepare_product_object", 'prefix26354_rest_api_prepare_custom_to_product', 10, 3 );
function prefix26354_rest_api_prepare_custom_to_product( $response, $object, $request ) {
$product_id = $object->get_id();
if ( empty( $response->data[ 'custom_cat' ] ) ) {
$terms = [];
foreach ( wp_get_post_terms( $product_id, 'custom_cat' ) as $term ) {
$terms[] = [
'id' => $term->term_id,
'name' => $term->name,
'slug' => $term->slug,
];
}
$response->data[ 'custom_cat' ] = $terms;
}
return $response;
}
В конечном итоге я нашел способ с использованием фильтров. Я не знал, что существуют фильтры для ответов REST API…
Вот мое решение:
add_filter( 'woocommerce_rest_prepare_product', 'custom_products_api_data', 90, 2 );
function custom_products_api_data( $response, $post ) {
// получаем пользовательское поле и добавляем его в ответ API
$response->data['custom_taxonomy1'] = wp_get_post_terms( $post->ID, 'custom_taxonomy1', [] );
$response->data['custom_taxonomy2'] = wp_get_post_terms( $post->ID, 'custom_taxonomy2', [] );
return $response;
}
`
Источник: https://francescocarlucci.com/woocommerce-api-add-custom-data-default-endpoints/
Ответ или решение
Для того чтобы отображать кастомные таксономии продуктов в REST API WooCommerce, вы можете воспользоваться фильтрами, доступными в WordPress. Ваше понимание проблемы и текущего функционала API вполне точное. Давайте разберемся, как правильно настроить вывод кастомных таксономий для продуктов с помощью подхода, который вы уже начали.
Шаги для отображения кастомных таксономий в WooCommerce REST API
-
Создание кастомной таксономии: Убедитесь, что у вас уже есть созданные кастомные таксономии для вашего типа записи "продукт". Для этого вы должны использовать функцию
register_taxonomy()
с параметромshow_in_rest => true
. -
Использование фильтров для модификации ответов API: WooCommerce предоставляет возможность расширять данные продуктов с помощью фильтров. Вам нужно добавить следующий код в файл
functions.php
вашей темы или в отдельный плагин:
add_filter( 'woocommerce_rest_prepare_product', 'custom_products_api_data', 90, 2 );
function custom_products_api_data( $response, $post ) {
// Извлекаем и добавляем кастомные таксономии к ответу API
$response->data['custom_taxonomy1'] = wp_get_post_terms( $post->ID, 'custom_taxonomy1', []);
$response->data['custom_taxonomy2'] = wp_get_post_terms( $post->ID, 'custom_taxonomy2', []);
return $response;
}
Пояснения к коду:
-
Функция
add_filter
: Здесь мы используем хукwoocommerce_rest_prepare_product
, который позволяет нам изменять данные, возвращаемые для продуктов. Первый аргумент — это имя фильтра, второй — название вашей функции, а третий — приоритет выполнения. -
Функция
custom_products_api_data
: Мы получаем объект ответа API и объект продукта, используя$post
. Далее, с помощьюwp_get_post_terms
, мы извлекаем термины для каждой кастомной таксономии и добавляем их к массиву данных ответа. -
Вернуть изменённый ответ: Убедитесь, что вы возвращаете измененный объект ответа, чтобы ваши кастомные данные отображались в API.
Тестирование результатов:
После добавления вышеуказанного кода, сделайте запрос к вашему WooCommerce REST API:
/wp-json/wc/v1/products/?consumer_key=[your_consumer_key]&consumer_secret=[your_consumer_secret]
В ответе вы должны увидеть массив продуктов, где для каждой записи добавлены ваши кастомные таксономии custom_taxonomy1
и custom_taxonomy2
.
Заключение
Использование фильтров для добавления кастомных данных в ответы REST API – это оптимальный способ увеличения функциональности, не нарушая целостности основного функционала WooCommerce. Такой подход не требует создания новых эндпоинтов и позволяет вам контролировать, какие данные отображать.
Если у вас возникнут дополнительные вопросы по этой теме, не стесняйтесь обращаться!