【问题标题】:Validate and save additional checkout field for specific payment gateway in Woocommerce验证并保存 Woocommerce 中特定支付网关的附加结帐字段
【发布时间】:2019-05-20 19:25:04
【问题描述】:

当客户选择 BACS 网关时,我需要显示一个文本输入字段我希望将输入字段值附加到订单和电子邮件通知中。

我正在使用Additional field on checkout for specific payment gateway in Woocommerce 答案代码,我已将选择字段更改为输入文本字段:

add_filter( 'woocommerce_gateway_description', 'gateway_bacs_custom_fields', 20, 2 );
function gateway_bacs_custom_fields( $description, $method_id ){
    //
     if( $method_id == 'bacs' ){

        ob_start(); // Start buffering

        echo '<div  class="bacs-fields" style="padding:10px 0;">';

        woocommerce_form_field( 'field_slug', array(
            'type'          => 'text',
            'label'         => __("Udfyld EAN", "woocommerce"),
            'class'         => array('form-row-wide'),
            'required'      => true,
                            ), '');
        echo '<div>';

        $description .= ob_get_clean(); // Append  buffered content
    }
    return $description;
}

它在显示字段的结帐页面上运行良好。

但输入的文本值并没有保存到订单和电子邮件通知中。

如何在订单和电子邮件通知中保存并附加此输入的文本值?

【问题讨论】:

    标签: php wordpress woocommerce orders payment-method


    【解决方案1】:

    由于您使用的答案代码只是在 BACS 付款说明下的结帐中显示一个字段,因此缺少很多步骤:

    需要(仅当BACS是所选付款方式时) EM>:

    1. 验证字段
    2. 将输入的值保存到订单中
    3. 在收到的订单和订单视图(我的帐户)中显示字段值
    4. 在电子邮件通知中显示字段值
    5. 在管理员编辑订单页面中显示字段值

    因此,您可以看到您所问的内容很大(太宽泛),并且需要针对第 3、4 和 5 点提出一个额外的新问题,您需要在其中说出您想问的地方输出它(位置)。

    步骤 1 和 2 的所有代码:

    add_filter( 'woocommerce_gateway_description', 'gateway_bacs_appended_custom_text_fields', 10, 2 );
    function gateway_bacs_appended_custom_text_fields( $description, $payment_id ){
         if( $payment_id === 'bacs' ){
    
            ob_start(); // Start buffering
    
            echo '<div class="bacs-fields" style="padding:10px 0;">';
    
            woocommerce_form_field( 'udfyld_ean', array(
                'type'          => 'text',
                'label'         => __("Udfyld EAN", "woocommerce"),
                'class'         => array('form-row-wide'),
                'required'      => true,
            ), '');
    
            echo '<div>';
    
            $description .= ob_get_clean(); // Append  buffered content
        }
        return $description;
    }
    
    
    // Process the field (validation)
    add_action('woocommerce_checkout_process', 'udfyld_ean_checkout_field_validation');
    function udfyld_ean_checkout_field_validation() {
    if ( $_POST['payment_method'] === 'bacs' && isset($_POST['udfyld_ean']) && empty($_POST['udfyld_ean']) )
        wc_add_notice( __( 'Please enter your "Udfyld EAN" number.' ), 'error' );
    }
    
    // Save "Udfyld EAN" number to the order as custom meta data
    add_action('woocommerce_checkout_create_order', 'save_udfyld_ean_to_order_meta_data', 10, 4 );
    function save_udfyld_ean_to_order_meta_data( $order, $data ) {
        if( $data['payment_method'] === 'bacs' && isset( $_POST['udfyld_ean'] ) ) {
            $order->update_meta_data( '_udfyld_ean', sanitize_text_field( $_POST['udfyld_ean'] ) );
        }
    }
    

    代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且有效。

    要从 $order 您将使用的 WC_Order 对象获取此自定义字段值:

    $udfyld_ean = $order->get_meta('_udfyld_ean');
    

    或者来自$order_id的订单ID可以使用WordPress的get_post_meta()函数:

    $udfyld_ean = get_post_meta( $order_id, '_udfyld_ean', true );
    

    字段验证(选择 BACS 作为支付方式):

    输入的字段值保存到订单元数据(wp_postmeta表中的phpMyAdmin视图):

    【讨论】:

    • 非常感谢 LoicTheAztec 提供了一个非常有用的答案!
    • @tiny 谢谢...现在您如何接受答案to do...如果您提出新问题,请尝试清楚地解释事物(显示位置)添加一些相关代码...
    • 步骤 1+2 接缝可以正常工作 - 我在 chekout 的正确位置得到一个文本输入,并且验证工作正常。但是我没有在我的数据库(WP_postmeta 表)中看到输入的字段值。当我发出测试订单时。为什么会这样?
    • @tiny 刚刚再次测试,它在 Woocommerce 版本 3+ (3.5.2) 上完美运行......所以你应该尝试在 wp_postmeta 表上使用 phpMyAdmin 在你的数据库中查看你的最后一个订单 ID(@ 987654333@) 搜索meta_key 就像_udfyld_ean...
    猜你喜欢
    • 2021-06-10
    • 2019-10-08
    • 1970-01-01
    • 2021-04-24
    • 2019-05-03
    • 2020-11-23
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多