Вопрос или проблема
Мне нужно делать запросы к нескольким страницам базы данных товаров 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);
}
Объяснение изменений
-
Инициализация массива: Переменная
$completeProductList
теперь инициализируется перед началом цикла, что позволяет корректно объединять результаты. -
Проверка на ошибки API: Добавлена проверка на наличие ошибок при выполнении
wp_remote_get()
, чтобы избежать проблем при получении ответа от API. -
Проверка данных: Перед объединением данных важно убедиться, что они являются массивом и не пустые.
Обработка данных на стороне 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 зависит от понимания методов обработки данных, и как показано в этой статье, правильная структура кода — это ключ к успешному завершению задачи.