我使用以下代码来保存属性名称为“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
挂钩不起作用?
这可能与两件不同的事情有关:
请注意,高性能订单存储 (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
请注意,结帐块现在默认启用,并且只允许很少的自定义。
使用 Checkout Blocks 时,以下操作挂钩将不起作用:
woocommerce_checkout_create_order
(兼容HPOS)woocommerce_checkout_update_order_meta
woocommerce_checkout_order_created
(兼容HPOS)另一种选择是切换回传统的经典 Checkout(简码)。