在 WooCommerce 中的结帐和我的帐户之间同步时事通讯自定义复选框

Sync newsletter custom checkbox between checkout and my account in WooCommerce

我想将 WooCommerce 结帐页面中的自定义复选框字段与“我的帐户”页面中的类似字段同步(当用户登录时)。

这是我的代码:

// Show a checkbox in checkout page and in My account > Details

add_action( 'woocommerce_edit_account_form', 'display_checkbox_in_account_page' );
add_action( 'woocommerce_after_order_notes', 'display_checkbox_in_account_page' );

function display_checkbox_in_account_page() {
    woocommerce_form_field( 'newsletter-account', array(
        'type'  => 'checkbox',
        'class' => array('form-row-wide'),
        'label' => __( 'Subscribe to my newsletter', 'woocommerce' ),
    ), get_user_meta(get_current_user_id(), 'newsletter-account', true ) );
}


// Save checkbox value when saved in My account > Details

add_action( 'woocommerce_save_account_details', 'save_checkbox_value_from_account_details', 10, 1 );
function save_checkbox_value_from_account_details( $user_id ) {
    $value = isset( $_POST['newsletter-account'] ) ? '1' : '0';
    update_user_meta( $user_id, 'newsletter-account', $value );
}

这两段代码工作正常:如果在“我的帐户”>“详细信息”中勾选了复选框,首选项将被保存,我也可以在结帐页面中看到一个勾选的复选框。

现在的问题是,当我从结帐页面编辑我的时事通讯偏好时,我需要一种方法来获得相同的结果。我想我需要使用 woocommerce_checkout_create_order 但我不知道如何编码:

//Save the checkbox value when customer edit it from the checkout page

add_action( 'woocommerce_checkout_create_order', 'save_checkbox_value_from_checkout_page'. 10, 1 );

function save_checkbox_value_from_checkout_page() {
    //some code here
}

如有任何建议,我们将不胜感激。

已更新

挂钩 woocommerce_checkout_create_order 用于 订购元数据 ,您需要 save/update 您的结帐 newsletter-account 字段值作为 用户元数据

So is better to use dedicated woocommerce_checkout_update_customer hook.

这是您的完整代码(已测试且有效):

add_action( 'woocommerce_edit_account_form', 'display_checkbox_in_account_page' );
add_action( 'woocommerce_after_order_notes', 'display_checkbox_in_account_page' );
function display_checkbox_in_account_page() {
    woocommerce_form_field( 'newsletter-account', array(
        'type'  => 'checkbox',
        'class' => array('form-row-wide'),
        'label' => __( 'Subscribe to my newsletter', 'woocommerce' ),
    ), get_user_meta( get_current_user_id(), 'newsletter-account', true ) );
}


// Save/update checkbox value when saved in My account > Details
add_action( 'woocommerce_save_account_details', 'save_checkbox_value_from_account_details', 10, 1 );
function save_checkbox_value_from_account_details( $user_id ) {
    $value = isset( $_POST['newsletter-account'] ) ? '1' : '0';
    update_user_meta( $user_id, 'newsletter-account', $value );
}

// Save/update custom checkout field value as user meta data
add_action('woocommerce_checkout_update_customer','custom_checkout_checkbox_update_customer', 100, 2 );
function custom_checkout_checkbox_update_customer( $customer, $data ){
    $value = isset( $_POST['newsletter-account'] ) ? '1' : '0';
    update_user_meta( $customer->get_id(), 'newsletter-account', $value ); // Updated
}

代码进入您的活动子主题(或活动主题)的 functions.php 文件。


现在,如果您想将订单信息作为 订单元数据 获取,您将使用:

add_action('woocommerce_checkout_create_order','custom_checkout_checkbox_add_order_meta', 100, 2 );
function custom_checkout_checkbox_add_order_meta( $order, $data ){
    $value = isset( $_POST['newsletter-account'] ) ? '1' : '0';
    $order->update_meta_data( 'newsletter-account', $value );
}