gpt4 book ai didi

wordpress - 如何将 WooCommerce 结帐自定义字段保存到用户元

转载 作者:行者123 更新时间:2023-12-02 22:56:49 25 4
gpt4 key购买 nike

我使用 PODS.io 为用户元创建了以下自定义字段WordPress 插件:

  • 出生日期
  • emergency_contact_name
  • 关系
  • 紧急电话

我已在主题的 functions.php 中使用以下代码,在额外信息下将这些字段添加到 WooCommerce 结帐中:

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'] ) );
}
}

但是,我们需要用户元中的自定义字段,而不是订单元。

您能看出在 checkout 时将自定义字段保存到用户元的代码有什么问题吗?

谢谢。

最佳答案

首先,您应该像这样添加自定义字段:(使用 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 );

关于wordpress - 如何将 WooCommerce 结帐自定义字段保存到用户元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com