【问题标题】:Save custom checkout field value as user data on WooCommerce将自定义结帐字段值保存为 WooCommerce 上的用户数据
【发布时间】:2019-08-30 13:51:33
【问题描述】:

我在 WooCommerce 商店的结帐页面中为可选的时事通讯订阅添加了一个自定义复选框:

add_action( 'woocommerce_after_order_notes', 'add_checkout_newsletter_subscribe', 9 );

function add_checkout_newsletter_subscribe() {

    woocommerce_form_field( 'checkout_newsletter', array(
       'type'          => 'checkbox',
       'class'         => array('form-row checkout-newsletter-box'),
       'label_class'   => array('woocommerce-form__label woocommerce-form__label-for-checkbox checkbox'),
       'input_class'   => array('woocommerce-form__input woocommerce-form__input-checkbox input-checkbox'),
       'required'      => false,
       'label'         => 'Subscribe me.',
    )); 

    }

我为“我的帐户”页面创建了一个类似的复选框:

add_action( 'woocommerce_edit_account_form', '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 me.', 'woocommerce' ),
        'clear' => true,
    ), get_user_meta(get_current_user_id(), 'newsletter-account', true ) );
}

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

现在我正在寻找一种方法来连接两个复选框。

我想要获得的是,如果客户在结帐页面中标记了复选框并且它是注册用户,那么“我的帐户”页面中的复选框也应该被标记。

我认为我需要使用 woocommerce_edit_account_form 钩子,但不幸的是我没有其他线索来了解如何获得这样的结果。

你们能指出我正确的方向吗?

非常感谢您的帮助!

【问题讨论】:

    标签: php wordpress woocommerce checkout user-data


    【解决方案1】:

    以下将在结帐页面显示订阅复选框,如果客户尚未订阅,它将在提交时将其保存为用户元数据:

    // Display custom checkout field on checkout page
    add_action( 'woocommerce_after_order_notes', 'add_checkout_newsletter_subscribe', 9 );
    function add_checkout_newsletter_subscribe() {
    
        $user_id    = (int) get_current_user_id();
        $newsletter = get_user_meta( $user_id, 'newsletter-account', true );
    
        // If newsletter hasn't been subscribed yet we show the subscription checkbox on checkout
        if ( $user_id > 0 && ! $newsletter ) :
    
        woocommerce_form_field( 'checkout_newsletter', array(
           'type'          => 'checkbox',
           'class'         => array('form-row checkout-newsletter-box'),
           'label_class'   => array('woocommerce-form__label woocommerce-form__label-for-checkbox checkbox'),
           'input_class'   => array('woocommerce-form__input woocommerce-form__input-checkbox input-checkbox'),
           'required'      => false,
           'label'         => __('Subscribe me'),
        )  );
    
        endif;
    }
    
    // Save custom checkout field value as user meta data
    add_action('woocommerce_checkout_update_customer','custom_checkout_checkbox_update_customer', 10, 2 );
    function custom_checkout_checkbox_update_customer( $customer, $data ){
        if ( ! is_user_logged_in() || is_admin() )
            return;
    
        // Update user meta data
        if ( isset($_POST['checkout_newsletter']) )
            update_user_meta( $customer->get_id(), 'newsletter-account', '1' );
    }
    

    代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。


    它适用于我的帐户页面的问题代码:

    add_action( 'woocommerce_edit_account_form', '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 me.', 'woocommerce' ),
            'clear' => true,
        ), get_user_meta(get_current_user_id(), 'newsletter-account', true ) );
    }
    
    add_action( 'woocommerce_save_account_details', 'save_checkbox_value_to_account_details', 10, 1 );
    function save_checkbox_value_to_account_details( $user_id ) {
        $value = isset( $_POST['newsletter-account'] ) ? '1' : '0';
        update_user_meta( $user_id, 'newsletter-account', $value );
    }
    

    如果下单时勾选了结账选项,edit account form上的复选框也会被勾选...

    【讨论】:

    • 这似乎是一个很好的起点。我会试一下!非常感谢!
    • @LoicTheAztec 你好!感谢您的出色代码。它真的很完美。但是我可以将额外信息也添加到用户在创建订单后收到的订单详情邮件中吗?
    • @VictorSokoliuk 看到这个帖子:stackoverflow.com/a/55165261/3730754 并用if( 1 == get_user_meta( $order->get_user_id(), 'newsletter-account', true ) ) { echo '<p><strong>'.__('Newsletter').':</strong> Yes</p>'; } else { echo '<p><strong>'.__('Newsletter').':</strong> No</p>'; } 替换那个答案代码if( $value = get_post_meta( $order->get_id(), '_billing_options', true ) ) echo '<p><strong>'.__('Invoice Number').':</strong> '.$value.'</p>';...
    • @LoicTheAztec 谢谢你的代码运行良好!上帝保佑你和你的家人!你节省了我的时间和时间。
    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2022-01-03
    • 2018-07-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多