WooCommerce:无法将WC_GET_PRODUCTS用于自定义REST API终结点

时间:2017-12-14 作者:David Lee

我正在尝试创建一些定制的RESTAPI端点,这些端点可以获取具有一些特殊条件的产品,例如,一个端点用于特色产品。我试着用wc_get_products 功能如下:

add_action(\'rest_api_init\', \'my_custom_featured_product_endpoint\');

function my_custom_featured_product_endpoint() {
    register_rest_route(\'custom-endpoints/v1\', \'/products/featured\', array(
        \'methods\' => \'GET\',
        \'callback\' => \'my_custom_featured_product_callback\',
    ));
}

function my_custom_featured_product_callback() {
    $meta_query  = WC()->query->get_meta_query();
    $tax_query   = WC()->query->get_tax_query();
    $tax_query[] = array(
        \'taxonomy\' => \'product_visibility\',
        \'field\'    => \'name\',
        \'terms\'    => \'featured\',
        \'operator\' => \'IN\',
    );

    $args = array(
        \'tax_query\' => $tax_query,
        \'meta_query\' => $meta_query,
    );

    $result = wc_get_products($args);

    return rest_ensure_response($result);
}
结果就是一些空数组。我可以买到那些老式的产品get_posts 替换wc_get_products 但是输出格式没有诸如“价格”、“图像”之类的属性。。。

那么有没有其他选择wc_get_products 用于自定义REST API端点,或者有什么方法可以使其工作?

附言:我通过如下更改回调函数来测试查询:

function my_custom_featured_product_callback() {
    $result = wc_get_product(99);//Yes there is a product with ID 99

    return rest_ensure_response($result);
}
结果保持不变,只是一个空数组。所以我认为问题一定在于wc_get_productswc_get_product 功能。也许rest_api_init 这些功能不是合适的挂钩吗?

3 个回复
SO网友:Arash Rabiee

您错过了一些东西,当您使用wc\\u get\\u product获取产品时,它会返回给您一个抽象对象,所以如果您需要获取产品,请执行以下操作

$product =  wc_get_product($product_id);
return $product->get_data();
此外,您还可以使用所有其他功能,例如:

$product->get_status();
$product->get_gallery_image_ids();
...

SO网友:Brauperle

我面临着类似的行为$wc_get_product 当我使用控制台检查响应时,总是从自定义REST端点返回空对象。登录前端侧。

因为我在响应中直接返回PHP对象,所以我在下面的线程帮助下将Product对象转换为数组,从而解决了这个问题:

convert-php-object-to-associative-array

在那之后,一切如期而至,希望你也能如愿以偿!

SO网友:Vala Khosravi

添加(array) 之前的演员阵容wc_get_products($args) 像这样:

$result = (array) wc_get_products($args);
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名,但有几个显著的例外:整数属性不可访问;私有变量的类名在变量名之前;受保护变量的变量名前面有一个“*”。这些前置值的两侧都有空字节。您可以通过以下方式访问产品数据:*data 所有物

结束