Циклический обход и объединение вызовов API REST Woocommerce

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

Мне нужно делать запросы к нескольким страницам базы данных товаров Woocommerce (получить все товары за один раз, похоже, невозможно), и цикл сбора результатов не работает так, как я ожидал. Я должен видеть массив с чуть менее 900 объектами, но все, что я вижу, это пустой массив. Я очень новичок в PHP. Вот соответствующий код:

function get_awesome_products() {
  for ($count = 1; $count <= 9; $count++ ) {
  if ($count < 2) { $completeProductList = []; }
   $baseRequest="https://myawesomeapi/wp-json/wc/v3/products/? 
 consumer_key=xxxx&consumer_secret=xxxx&per_page=100&page=";
 $request = wp_remote_get( $baseRequest . (string)$count);
 $body = wp_remote_retrieve_body( $request );
 $data = array_values(json_decode( $body, true ));

if (count($completeProductList < 1)) {
  $completeProductList = $data;
} else {
$completeProductList = array_merge($completeProductList, $data);
}
}
return new WP_REST_Response($completeProductList, 200);
}

add_action('rest_api_init', function() {
register_rest_route('awe/v1', 'aweproducts', array(
'methods' => 'GET',
'callback' => 'get_awesome_products',
'permission_callback' => function () {
  return true;
    }
  ));
});

Прежде всего, неясно, почему получение всех товаров за один раз, похоже, невозможно, если у вас есть доступ к API
вы можете добавить пользовательский эндпоинт и написать свой запрос, чтобы получить все товары (возможно, со статусом “опубликовано”)
что-то вроде:

global $wpdb;
$Q="SELECT * FROM ".$wpdb->prefix."posts WHERE post_type="product" AND post_status="publish"";
$completeProductList = $wpdb->get_results($Q);
return new WP_REST_Response($completeProductList, 200);

должно сработать.

Во-вторых: не тестируя вашу функцию, я думаю, что

if (count($completeProductList < 1)) должно быть if (count($completeProductList) < 1)
ваш код считает булевое значение вместо интерфейса Countable, возможно, это не окончательное решение, но это выглядит как ошибка.

@Andrea как минимум частично ответил на вопрос выше, когда указал, что у меня была переменная неправильно заключена. Другие проблемы, которые имели место, были:

  • Не вызван array_values() на массиве после вызова json_decode.
  • Проблемы области видимости переменных?

Если кто-то еще столкнется с подобной проблемой, вот код, который сработал для меня:

function get_awesome_products() {
$baseRequest="https://myawesomeapi/wp-json/wc/v3/products/? 
consumer_key=xxxx&consumer_secret=xxxx&per_page=100&page=";
 for ($count = 1; $count <= 9; $count++ ) {
$request = wp_remote_get( $baseRequest . (string)$count);
$body = wp_remote_retrieve_body( $request );
$data = array_values( json_decode( $body, true ));

if ($count < 2) {
  $completeProductList = $data;
} else {
  $completeProductList = array_merge($completeProductList, $data);
}
}
return new WP_REST_Response($completeProductList, 200);

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

Эффективное использование WooCommerce REST API: объединение данных с нескольких страниц

Когда вы работаете с WooCommerce REST API и пытаетесь извлечь данные о продуктах, могут возникнуть трудности с объединением данных с нескольких страниц. В данной статье мы рассмотрим правильные подходы к осуществлению вызовов API и сбору данных, а также возможные ошибки, которые могут помешать успешному получению ожидаемых результатов.

Проблематика вызовов API

Ваша задача заключается в необходимости собрать все продукты из базы данных WooCommerce, при этом API возвращает данные постранично. Правильное извлечение данных с нескольких страниц может показаться сложным, особенно если вы новички в PHP. Ваша начальная реализация кода встречала определенные проблемы, включая неправильные условия и обработки массивов.

Правильная реализация функции

Во-первых, давайте разберемся с вашей функцией get_awesome_products(). Она должна последовательно вызывать API для каждой страницы и объединять результаты в один массив. Вот исправленная версия вашей функции:

function get_awesome_products() {
    $baseRequest = "https://myawesomeapi/wp-json/wc/v3/products/?consumer_key=xxxx&consumer_secret=xxxx&per_page=100&page=";
    $completeProductList = []; // Инициализация массива за пределами цикла

    for ($count = 1; $count <= 9; $count++) {
        $request = wp_remote_get($baseRequest . (string)$count);
        if (is_wp_error($request)) {
            return new WP_REST_Response('Ошибка при получении данных', 500);
        }

        $body = wp_remote_retrieve_body($request);
        $data = json_decode($body, true);

        // Проверка на наличие данных
        if (is_array($data) && !empty($data)) {
            $completeProductList = array_merge($completeProductList, $data);
        }
    }

    return new WP_REST_Response($completeProductList, 200);
}

Объяснение изменений

  1. Инициализация массива: Переменная $completeProductList теперь инициализируется перед началом цикла, что позволяет корректно объединять результаты.

  2. Проверка на ошибки API: Добавлена проверка на наличие ошибок при выполнении wp_remote_get(), чтобы избежать проблем при получении ответа от API.

  3. Проверка данных: Перед объединением данных важно убедиться, что они являются массивом и не пустые.

Обработка данных на стороне API

Если у вас есть полный доступ к API и необходимость объединения данных из базы WooCommerce, вы можете создать собственный эндпоинт, который будет возвращать все продукты за один запрос. Это может выглядеть следующим образом:

global $wpdb;
$Q = "SELECT * FROM {$wpdb->prefix}posts WHERE post_type = 'product' AND post_status = 'publish'";
$completeProductList = $wpdb->get_results($Q);
return new WP_REST_Response($completeProductList, 200);

Создание специального эндпоинта позволяет избежать необходимости многократных вызовов API и оптимизировать производительность.

Заключение

Получение всех продуктов из WooCommerce через REST API может быть реализовано с помощью правильного подхода к вызовам и обработки результатов. Убедившись, что ваш код корректен и надежен, вы сможете эффективно собирать необходимую информацию. Важно следить за качеством кода и проводить отладку, чтобы избежать распространенных ошибок.

Ваш успех в работе с API зависит от понимания методов обработки данных, и как показано в этой статье, правильная структура кода — это ключ к успешному завершению задачи.

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

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