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