3

我有一个在 WooCommerce 中创建产品的 ERP 系统,我需要它们是私有的而不是发布的。

我尝试了钩子woocommerce_rest_insert_product,但它什么也没做。我尝试将它添加到插件和使用plugins_loaded操作的 mu-plugin 上。

我在课堂上找到了钩子WC_REST_Products_V1_Controller,理论上它应该可以工作......

/**
 * Fires after a single item is created or updated via the REST API.
 *
 * @param WP_Post         $post      Post data.
 * @param WP_REST_Request $request   Request object.
 * @param boolean         $creating  True when creating item, false when updating.
 */
do_action( 'woocommerce_rest_insert_product', $post, $request, false );
4

2 回答 2

2

我找不到“为什么”它不起作用的答案。

我发现这个 WordPress.org 论坛帖子显示了一个可行的替代方案:

add_action( 'woocommerce_new_product', function($id, $product ){
    // your thing
}, 10, 2);
于 2021-03-26T01:08:40.117 回答
1

我知道这是一个迟到的答案,但其他人来这里阅读它可能是有意义的。

我很确定您使用的是最新v3的 API。

问题是可以找到您提到的操作,WC_REST_Products_V1_Controller其中端点命名空间设置为:

protected $namespace = 'wc/v1';

这意味着它在 v3 上不可用。

如果您通过版本 3 中的 Woocommerce REST 控制器,您将访问此文件:

includes/rest-api/Controllers/Version3/class-wc-rest-products-controller.php

名称空间设置为wc/v3;

在这里,类WC_REST_Products_Controller扩展了WC_REST_Products_V2_Controller.

里面WC_REST_Products_V2_Controllercreate_itemandupdate_item方法。这两种方法看起来都与 v1 中的方法非常相似,但是您要查找的操作名称已更改为:

/**
* Fires after a single object is created or updated via the REST API.
*
* @param WC_Data         $object    Inserted object.
* @param WP_REST_Request $request   Request object.
* @param boolean         $creating  True when creating object, false when updating.
*/
do_action( "woocommerce_rest_insert_{$this->post_type}_object", $object, $request, true );

因此,您的代码应类似于:

add_action( 
    "woocommerce_rest_insert_product_object", 
    function($product, $request, $creating ){
        // do something here
    }, 10, 3
);

woocommerce_new_product和之间的最大区别在于woocommerce_rest_insert_{$this->post_type}_objectwoocommerce_new_product在所有创建操作上触发,而不仅仅是在 REST 创建上。

于 2021-12-01T23:47:25.510 回答