循环并组合对WooCommerce REST API的调用

时间:2020-02-17 作者:Michael C

我必须调用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;
    }
  ));
});

2 个回复
SO网友:Andrea Somovigo

首先,不清楚为什么一次获取所有产品似乎不是一个选项,如果您可以控制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) 您的代码正在计算布尔值,而不是可数接口,也许这不是最终的解决方案,但这看起来像一个bug

SO网友:Michael C

@安德烈指出我在上面有一个不恰当的变量时,至少有部分答案。其他问题包括:

不打电话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);

相关推荐

如何对开机自检输出进程进行phpunit测试?

我想知道如何测试帖子的html输出。像WP一样,在现实中会在前端输出它。此时,我的具体情况是测试oembed缓存,因为我想测试重新缓存。AFAIK WP只缓存与post关联的oembed结果。所以我不能只运行一些文本the_content 滤器我喜欢为此测试真正的后处理,通常也会测试可能出现的其他情况。到目前为止,在我的搜索中,我只找到了如何在单元测试中创建帖子的教程,而没有找到如何在上面实际运行测试的教程。