как показать пользовательские таксономии продукта в woocommerce rest api

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

Я работаю с 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) позволяет мне получать пользовательские таксономии вместе с продуктами. У меня есть несколько проблем с этим:

  1. У меня нет всех продуктов там
  2. нет информации о продукте, такой как его вариации или цена
  3. Я не хочу делать один запрос к обоим 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

  1. Создание кастомной таксономии: Убедитесь, что у вас уже есть созданные кастомные таксономии для вашего типа записи "продукт". Для этого вы должны использовать функцию register_taxonomy() с параметром show_in_rest => true.

  2. Использование фильтров для модификации ответов 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. Такой подход не требует создания новых эндпоинтов и позволяет вам контролировать, какие данные отображать.

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

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

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