从 WooCommerce 中的自定义结帐字段更新用户显示名称

Update user display name from custom checkout field in WooCommerce

在 WooCommerce 中,结账时,我可以在下订单时创建或更新所有用户和账单信息。但是,我也想 set/update 用户 "display name" (别名)

因此,根据 "" 答案代码,我将以下代码添加到我的活动主题的 functions.php 文件中:

// Display a custom checkout field
add_action( 'woocommerce_before_checkout_billing_form', 'my_custom_checkout_field' );
function my_custom_checkout_field( $checkout ) {
    echo '<div id="my_custom_checkout_field">';

    woocommerce_form_field( 'display_name', array(
        'type'          => 'text',
        'class'         => array('my-custom-field form-row-wide'),
        'label'         => __('Alias'),
        'placeholder'   => __('Nickname to show in my account and comments'),
        'required'      => true,
        ), $checkout->get_value( 'display_name' ));

    echo '</div>';
}

// Save the custom checkout field in the order meta
add_action( 'woocommerce_checkout_update_user_meta', 'save_order_custom_meta_data', 10, 2 );
function save_order_custom_meta_data( ) {
    if ( isset($_POST['display_name']) )
        $user->update_meta_data('display_name', sanitize_text_field( $_POST['display_name'] ) );
}

但这不起作用,因为我收到 "Internal Server Error" 消息。

任何解决此问题的帮助将不胜感激。

问题出在你的第二个函数上……缺少函数参数并且 $user 变量为 null,你不能在其上使用 WC_Data 方法 update_meta_data().

此外 display_name 不是用户元数据,而只是用户数据。因此,您需要使用专用的 WordPress 函数 wp_update_user() 才能 set/update 用户显示名称。

将您的第二个挂钩函数替换为以下内容:

// Save/update user data from custom checkout field value
add_action( 'woocommerce_checkout_update_user_meta', 'checkout_update_user_display_name', 10, 2 );
function checkout_update_user_display_name( $customer_id, $data ) {
    if ( isset($_POST['display_name']) ) {
        $user_id = wp_update_user( array( 'ID' => $customer_id, 'display_name' => sanitize_text_field($_POST['display_name']) ) );
    }
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。现在应该可以使用了。