为什么某些结账挂钩在 WooCommerce 中不起作用?

问题描述 投票:0回答:1

我使用以下代码来保存属性名称为“custom_form_data”的隐藏输入字段的值:

add_action('woocommerce_checkout_update_order_meta', 'save_custom_form_data_to_order');
function save_custom_form_data_to_order($order_id) {
    if (isset($_POST['custom_form_data'])) {
        $custom_form_data = sanitize_text_field($_POST['custom_form_data']);
        update_post_meta($order_id, 'custom_form_data', $custom_form_data);
    }
}

但是提交的值并没有保存到数据库中。我检查了

wp_postmeta
wp_wc_orders_meta
表。

为什么

woocommerce_checkout_update_order_meta
挂钩不起作用?

php woocommerce hook-woocommerce checkout orders
1个回答
2
投票

这可能与两件不同的事情有关:

  1. 启用高性能订单存储:

请注意,高性能订单存储 (HPOS) 现在默认启用。

如果启用了 HPOS,则需要使用兼容挂钩,例如:

add_action('woocommerce_checkout_create_order', 'save_custom_form_data_to_order');
function save_custom_form_data_to_order( $order ) {
    if ( isset($_POST['custom_form_data']) ) {
        $order->update_meta_data( 'custom_form_data', sanitize_text_field($_POST['custom_form_data']) );
    }
}

或者您可以使用以下方法(需要使用

save()
方法):

add_action('woocommerce_checkout_order_created', 'save_custom_form_data_to_order');
function save_custom_form_data_to_order( $order ) {
    if ( isset($_POST['custom_form_data']) ) {
        $order->update_meta_data( 'custom_form_data', sanitize_text_field($_POST['custom_form_data']) );
        $order->save();
    }
}

使用 HPOS,WordPress Post 元功能不再起作用,因为 WooCommerce 订单使用自定义数据库表以获得更好的性能。

因此 HPOS 需要在 WC_Data

 对象上使用 
WC_Abstract_Order
WC_Order
WC_Order
方法

因此,要从自定义字段获取/读取值,您将使用类似以下内容:

$order = wc_get_order( $order_id ); // If needed get the WC_Order object

$value = $order->get_meta('custom_form_data'); // Get custom field value

  1. 结账区块已启用:

请注意,结帐块现在默认启用,并且只允许很少的自定义。

使用 Checkout Blocks 时,以下操作挂钩将不起作用:

  • woocommerce_checkout_create_order
    (兼容HPOS
  • woocommerce_checkout_update_order_meta
  • woocommerce_checkout_order_created
    (兼容HPOS
  • 还有更多…

另一种选择是切换回传统的经典 Checkout(简码)

© www.soinside.com 2019 - 2024. All rights reserved.