WooCommerce:在结帐、我的帐户、管理订单和 WordPress 用户中添加出生日期计费字段

问题描述

我尝试在 Woocommerce Checkout 表单中添加一个生日字段,然后将其保存为用户元数据。 我可以用下面的代码显示它,但我无法保存它以便在用户个人资料页面中看到它。

add_action( 'woocommerce_before_shop_loop_item','woocommerce_before_shop_loop_item_callback' ); 
function woocommerce_before_shop_loop_item_callback() {
    ?>
    <span class="products-inner">
    <?PHP
}

add_action( 'woocommerce_after_shop_loop_item_title','woocommerce_after_shop_loop_item_title_callback' ); 
function woocommerce_after_shop_loop_item_title_callback() {
    ?>
    <span class="product-inner-wrap"><span class=""><div class="product-inner-list">
    <?PHP
}

add_action( 'woocommerce_after_shop_loop_item','woocommerce_after_shop_loop_item_callback' ); 
function woocommerce_after_shop_loop_item_callback() {
    ?>
    </div></span></span></span>
    <?PHP
}

解决方法

以下是在结帐、我的帐户地址、管理订单页面和 WordPress 用户仪表板中显示账单出生日期的完整代码:

// Display Billing birthdate field to checkout and My account addresses
add_filter( 'woocommerce_billing_fields','display_birthdate_billing_field',20,1 );
function display_birthdate_billing_field($billing_fields) {

    $billing_fields['billing_birthdate'] = array(
        'type'        => 'date','label'       => __('Birthdate'),'class'       => array('form-row-wide'),'priority'    => 25,'required'    => true,'clear'       => true,);
    return $billing_fields;
}

// Save Billing birthdate field value as user meta data
add_action( 'woocommerce_checkout_update_customer','save_account_billing_birthdate_field',10,2 );
function save_account_billing_birthdate_field( $customer,$data ){
    if ( isset($_POST['billing_birthdate']) && ! empty($_POST['billing_birthdate']) ) {
         $customer->update_meta_data( 'billing_birthdate',sanitize_text_field($_POST['billing_birthdate']) );
    }
}

// Admin orders Billing birthdate editable field and display
add_filter('woocommerce_admin_billing_fields','admin_order_billing_birthdate_editable_field');
function admin_order_billing_birthdate_editable_field( $fields ) {
    $fields['birthdate'] = array( 'label' => __('Birthdate','woocommerce') );

    return $fields;
}

// WordPress User: Add Billing birthdate editable field
add_filter('woocommerce_customer_meta_fields','wordpress_user_account_billing_birthdate_field');
function wordpress_user_account_billing_birthdate_field( $fields ) {
    $fields['billing']['fields']['billing_birthdate'] = array(
        'label'       => __('Birthdate','woocommerce'),'description' => __('','woocommerce')
    );
    return $fields;
}

代码位于活动子主题(或活动主题)的functions.php 文件中。经测试有效。