哪个钩子可以在 WooCommerce 中保存 WooCommerce 产品元数据?

Which hook to save WooCommerce product meta in WooCommerce?

我正在尝试更新 Woocommerce 产品更新事件中的自定义元数据。我读过我应该使用 woocommerce_update_product 而不是 save_post 但我不明白为什么只有 save_post 在我的情况下有效。

下面的代码有效

add_action( 'save_post', 'mp_sync_on_product_save', 20);
function mp_sync_on_product_save( $product_id ) {
     update_post_meta($product_id, 'test_acf_product', "text");
};

以下代码无效

add_action( 'woocommerce_update_product', 'mp_sync_on_product_save', 20);
function mp_sync_on_product_save( $product_id ) {
    update_post_meta($product_id, 'test_acf_product', "text");
};

我无意中发现,如果我在末尾添加 exit;,上面的代码可以工作(中断页面但元数据保存在数据库中)

add_action( 'woocommerce_update_product', 'mp_sync_on_product_save', 20);
function mp_sync_on_product_save( $product_id ) {
    update_post_meta($product_id, 'test_acf_product', "text");
    exit;
};

我可以使用 save_post 但我很想知道为什么 woocommerce_update_product 不起作用 如果有人能给我一些提示,我将不胜感激。

谢谢!

在后端保存产品时,有多种方法可以保存产品元数据:

1) 从 WooCommerce 3 开始,您可以使用:

add_action( 'woocommerce_admin_process_product_object', 'action_save_product_meta' );
function action_save_product_meta( $product ) {
    $product->update_meta_data( 'test_acf_product', 'text' );
}

2) 或者旧的 WooCommerce 方式:

add_action( 'woocommerce_process_product_meta', 'action_save_product_meta' );
function action_save_product_meta( $product_id ) {
    update_post_meta($product_id, 'test_acf_product', 'text' );
}

3) 或者 Wordpress 方式(针对 "product" 自定义 post 类型):

add_action( 'save_post_product', 'action_save_product_data', 20);
function action_save_product_data( $post_id ) {
     update_post_meta($post_id, 'test_acf_product', 'text');
}

4) 或者也使用 save_post 挂钩(并针对 "product" 自定义 post 类型,以避免为所有 post 类型保存此元数据和自定义 post 类型):

add_action( 'save_post', 'action_save_product_data', 20);
function action_save_product_data( $post_id ) {
    global $typenow;

    if ( 'product' === $typenow ) {
        update_post_meta($post_id, 'test_acf_product', 'text');
    }
}