【问题标题】:Save and display specific payment gateway additional field everywhere in Woocommerce在 Woocommerce 的任何地方保存并显示特定的支付网关附加字段
【发布时间】:2019-10-08 17:34:19
【问题描述】:

我正在使用 "Additional field on checkout for specific payment gateway in Woocommerce" 应答代码,它会在结帐页面显示特定支付网关的附加下拉字段。

如何在订单和邮件通知中保存和显示选项?

【问题讨论】:

  • 当您使用现有代码时(如果您没有对其进行真正的更改) 只需使用问题中的链接来解释代码在做什么......另外如果这个代码很有用,不要忘记在你选择它的答案线程上投票。
  • 在提出新问题之前,请在此线程上对您之前的问题的现有答案提供一些反馈。

标签: php wordpress woocommerce checkout payment-method


【解决方案1】:

add_action('woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta');

函数 custom_checkout_field_update_order_meta($order_id)

{

如果 (!empty($_POST['field_slug'])) {

update_post_meta($order_id, 'Some key',sanitize_text_field($_POST['field_slug']));

}

} 要在订单详情或电子邮件模板页面中获取此值,您可以使用 get_post_meta($order_id, 'Some key',false);

【讨论】:

    【解决方案2】:

    “Additional field on checkout for specific payment gateway in Woocommerce”的继续

    以下是完整的方法:

    1. 添加带有 BACS 付款选项的下拉菜单
    2. 字段验证(必选)
    3. 将所选选项保存为订单自定义元数据
    4. 在任何地方(订单和电子邮件通知)显示所选的订单总数
    5. 在账单明细下方的管理员订单编辑页面上显示所选选项。

    代码:

    // BACS payement gateway description: Append custom select field
    add_filter( 'woocommerce_gateway_description', 'gateway_bacs_custom_fields', 20, 2 );
    function gateway_bacs_custom_fields( $description, $payment_id ){
        //
        if( 'bacs' === $payment_id ){
            ob_start(); // Start buffering
    
            echo '<div  class="bacs-options" style="padding:10px 0;">';
    
            woocommerce_form_field( 'bacs_option', array(
                'type'          => 'select',
                'label'         => __("Fill in this field", "woocommerce"),
                'class'         => array('form-row-wide'),
                'required'      => true,
                'options'       => array(
                    ''          => __("Select something", "woocommerce"),
                    'Option 1'  => __("Choice one", "woocommerce"),
                    'Option 2'  => __("Choice two", "woocommerce"),
                ),
            ), '');
    
            echo '<div>';
    
            $description .= ob_get_clean(); // Append buffered content
        }
        return $description;
    }
    
    // Checkout custom field validation
    add_action('woocommerce_checkout_process', 'bacs_option_validation' );
    function bacs_option_validation() {
        if ( isset($_POST['payment_method']) && $_POST['payment_method'] === 'bacs'
        && isset($_POST['bacs_option']) && empty($_POST['bacs_option']) ) {
            wc_add_notice( __( 'Please Select an option for "Direct Bank Transfer" payment, please.' ), 'error' );
        }
    }
    
    // Checkout custom field save to order meta
    add_action('woocommerce_checkout_create_order', 'save_bacs_option_order_meta', 10, 2 );
    function save_bacs_option_order_meta( $order, $data ) {
        if ( isset($_POST['bacs_option']) && ! empty($_POST['bacs_option']) ) {
            $order->update_meta_data( '_bacs_option' , esc_attr($_POST['bacs_option']) );
        }
    }
    
    // Display custom field on order totals lines everywhere
    add_action('woocommerce_get_order_item_totals', 'display_bacs_option_on_order_totals', 10, 3 );
    function display_bacs_option_on_order_totals( $total_rows, $order, $tax_display ) {
        if ( $order->get_payment_method() === 'bacs' && $bacs_option = $order->get_meta('_bacs_option') ) {
            $sorted_total_rows = [];
    
            foreach ( $total_rows as $key_row => $total_row ) {
                $sorted_total_rows[$key_row] = $total_row;
                if( $key_row === 'payment_method' ) {
                    $sorted_total_rows['bacs_option'] = [
                        'label' => __( "Bank wire option", "woocommerce"),
                        'value' => esc_html( $bacs_option ),
                    ];
                }
            }
            $total_rows = $sorted_total_rows;
        }
        return $total_rows;
    }
    
    // Display custom field in Admin orders, below billing address block
    add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_bacs_option_near_admin_order_billing_address', 10, 1 );
    function display_bacs_option_near_admin_order_billing_address( $order ){
        if( $bacs_option = $order->get_meta('_bacs_option') ) {
            echo '<div class="bacs-option">
            <p><strong>'.__('BACS option').':</strong> ' . $bacs_option . '</p>
            </div>';
        }
    }
    

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

    结帐页面:


    在收到订单页面(在订单视图和电子邮件通知上):


    在管理员订单页面上:

    【讨论】:

    • 很好的解决方案!感谢您的详细撰写。
    猜你喜欢
    • 2019-05-20
    • 2021-06-10
    • 2020-10-24
    • 2019-05-03
    • 2015-06-06
    • 1970-01-01
    • 2018-01-11
    • 2021-01-07
    相关资源
    最近更新 更多