我使用PODS.io Wordpress插件为用户元数据创建了以下自定义字段:
我已将这些字段添加到WooCommerce结帐中,在额外信息下,使用我主题functions.php
中的以下代码:
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
function my_custom_checkout_field( $checkout ) {
woocommerce_form_field( 'date_of_birth', array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'label' => __('Date of Birth'),
'placeholder' => __('dd/mm/yyyy'),
), $checkout->get_value( 'date_of_birth' ));
woocommerce_form_field( 'emergency_contact_name', array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'label' => __('Emergency Contact Name'),
'placeholder' => __('contact name'),
), $checkout->get_value( 'emergency_contact_name' ));
woocommerce_form_field( 'relation', array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'label' => __('Emergency Relation'),
'placeholder' => __('wife/husband'),
), $checkout->get_value( 'relation' ));
woocommerce_form_field( 'emergency_phone', array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'label' => __('Emergency Phone'),
'placeholder' => __('xxxx xxx xxx / xxxx xxxx'),
), $checkout->get_value( 'emergency_phone' ));
}
错误检查:
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
// Check if set, if its not set add an error.
if ( ! $_POST['date_of_birth'] )
wc_add_notice( __( 'Please enter your date of birth' ), 'error' );
if ( ! $_POST['emergency_contact_name'] )
wc_add_notice( __( 'Please enter your Emergency Contact Name' ), 'error' );
if ( ! $_POST['relation'] )
wc_add_notice( __( 'Please enter how your Emergency Contact is related to you' ), 'error' );
if ( ! $_POST['emergency_phone'] )
wc_add_notice( __( 'Please enter the phone number of your Emergency Contact' ), 'error' );
}
(希望)在结帐时更新用户元:
add_action( 'woocommerce_checkout_update_user_meta', 'my_custom_checkout_field_update_user_meta' );
function my_custom_checkout_field_update_order_meta( $order_id ) {
if ( !empty( $_POST['date_of_birth'] ) ) {
$dob = sanitize_text_field( $_POST['date_of_birth'] );
update_user_meta( $current_user->ID, 'date_of_birth', $dob);
}
if ( ! empty( $_POST['emergency_contact_name'] ) ) {
update_user_meta( $user_id, 'emergency_contact_name', sanitize_text_field( $_POST['emergency_contact_name'] ) );
}
if ( ! empty( $_POST['relation'] ) ) {
update_user_meta( $user_id, 'relation', sanitize_text_field( $_POST['relation'] ) );
}
if ( ! empty( $_POST['emergency_phone'] ) ) {
update_user_meta( $user_id, 'emergency_phone', sanitize_text_field( $_POST['emergency_phone'] ) );
}
}
很遗憾,我结帐时不会更新用户元自定义字段。
我可以使用以下代码更新订单元自定义字段:
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );
function my_custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST['date_of_birth'] ) ) {
update_post_meta( $order_id, 'Date Of Birth', sanitize_text_field( $_POST['date_of_birth'] ) );
}
if ( ! empty( $_POST['emergency_contact_name'] ) ) {
update_post_meta( $order_id, 'Emergency Contact Name', sanitize_text_field( $_POST['emergency_contact_name'] ) );
}
if ( ! empty( $_POST['relation'] ) ) {
update_post_meta( $order_id, 'Emergency Relation', sanitize_text_field( $_POST['relation'] ) );
}
if ( ! empty( $_POST['emergency_phone'] ) ) {
update_post_meta( $order_id, 'Emergency Phone', sanitize_text_field( $_POST['emergency_phone'] ) );
}
}
但是,我们需要用户元数据中的自定义字段,而不是订单元数据。
您是否可以看到在结帐时保存自定义字段的代码有什么问题?
感谢。
答案 0 :(得分:8)
首先,您应该添加以下自定义字段:(使用woocommerce_checkout_fields
过滤器)
function reigel_woocommerce_checkout_fields( $checkout_fields = array() ) {
$checkout_fields['order']['date_of_birth'] = array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'label' => __('Date of Birth'),
'placeholder' => __('dd/mm/yyyy'),
'required' => true,
);
return $checkout_fields;
}
add_filter( 'woocommerce_checkout_fields', 'reigel_woocommerce_checkout_fields' );
添加'required'
并将其设置为true
与检查此字段是否设置的方式具有相同的效果。 (你的"错误检查")
然后在woocommerce_checkout_update_user_meta
中,第一个参数不是$order_id
而是$customer_id
。您也应该知道第二个参数是$posted
。 $posted
包含$_POST[]
数据。如果您执行了上述代码,请包括您的自定义字段。
function reigel_woocommerce_checkout_update_user_meta( $customer_id, $posted ) {
if (isset($posted['date_of_birth'])) {
$dob = sanitize_text_field( $posted['date_of_birth'] );
update_user_meta( $customer_id, 'date_of_birth', $dob);
}
}
add_action( 'woocommerce_checkout_update_user_meta', 'reigel_woocommerce_checkout_update_user_meta', 10, 2 );