亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

根據 WooCommerce Checkout 中的選擇字段添加動態費用

根據 WooCommerce Checkout 中的選擇字段添加動態費用

PHP
忽然笑 2021-12-24 09:50:23
我正在根據 Woocommerce 結帳答案代碼解決方案中的單選按鈕動態使用更新費用,這對我來說非常有用,可以為每個字段添加具有不同價格的復選框字段,并且價格變化會反映在結帳中。但是我需要一些幫助:當我選擇一種附加稅的包裝類型時,它會出現在訂單區域的后端,但只顯示價格,我也想顯示標題。復選框選項有:'options' => array (    'bag' => __ ('In a bag' .wc_price (3.00), $ domain),    'box' => __ ('In a gift box' .wc_price (9.00), $ domain),),如何讓它在訂單上顯示名稱?另外,是否可以將復選框更改為選擇字段?
查看完整描述

1 回答

?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

我對原始代碼進行了一些更改,將:

  • 顯示自定義選擇字段(而不是單選按鈕輸入字段)

  • 如果客戶未選擇包裝選項,則顯示自定義錯誤通知

  • 隨處顯示所選的包裝類型(在訂單和電子郵件通知上)

代碼:

// Add a custom select fields for packing option fee

add_action( 'woocommerce_review_order_after_shipping', 'checkout_shipping_form_packing_addition', 20 );

function checkout_shipping_form_packing_addition( ) {

    $domain = 'woocommerce';


    echo '<tr class="packing-select"><th>' . __('Packing options', $domain) . '</th><td>';


    $chosen   = WC()->session->get('chosen_packing');


    // Add a custom checkbox field

    woocommerce_form_field( 'chosen_packing', array(

        'type'      => 'select',

        'class'     => array( 'form-row-wide packing' ),

        'options'   => array(

            ''    => __("Choose a packing option ...", $domain),

            'bag' => sprintf( __("In a bag (%s)", $domain), strip_tags( wc_price(3.00) ) ),

            'box' => sprintf( __("In a gift box (%s)", $domain), strip_tags( wc_price(9.00) ) ),

        ),

        'required'  => true,

    ), $chosen );


    echo '</td></tr>';

}


// jQuery - Ajax script

add_action( 'wp_footer', 'checkout_shipping_packing_script' );

function checkout_shipping_packing_script() {

    // Only checkout page

    if ( is_checkout() && ! is_wc_endpoint_url() ) :


    WC()->session->__unset('chosen_packing');

    ?>

    <script type="text/javascript">

    jQuery( function($){

        $('form.checkout').on('change', 'select#chosen_packing', function(){

            var p = $(this).val();

            console.log(p);

            $.ajax({

                type: 'POST',

                url: wc_checkout_params.ajax_url,

                data: {

                    'action': 'woo_get_ajax_data',

                    'packing': p,

                },

                success: function (result) {

                    $('body').trigger('update_checkout');

                    console.log('response: '+result); // just for testing | TO BE REMOVED

                },

                error: function(error){

                    console.log(error); // just for testing | TO BE REMOVED

                }

            });

        });

    });

    </script>

    <?php

    endif;

}


// Php Ajax (Receiving request and saving to WC session)

add_action( 'wp_ajax_woo_get_ajax_data', 'woo_get_ajax_data' );

add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'woo_get_ajax_data' );

function woo_get_ajax_data() {

    if ( isset($_POST['packing']) ){

        $packing = sanitize_key( $_POST['packing'] );

        WC()->session->set('chosen_packing', $packing );

        echo json_encode( $packing );

    }

    die(); // Alway at the end (to avoid server error 500)

}


// Add a custom dynamic packaging fee

add_action( 'woocommerce_cart_calculate_fees', 'add_packaging_fee', 20, 1 );

function add_packaging_fee( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )

        return;


    $domain      = "woocommerce";

    $packing_fee = WC()->session->get( 'chosen_packing' ); // Dynamic packing fee


    if ( $packing_fee === 'bag' ) {

        $label = __("Bag packing fee", $domain);

        $cost  = 3.00;

    } elseif ( $packing_fee === 'box' ) {

        $label = __("Gift box packing fee", $domain);

        $cost  = 9.00;

    }


    if ( isset($cost) )

        $cart->add_fee( $label, $cost );

}


// Field validation, as this packing field is required

add_action('woocommerce_checkout_process', 'packing_field_checkout_process');

function packing_field_checkout_process() {

    // Check if set, if its not set add an error.

    if ( isset($_POST['chosen_packing']) && empty($_POST['chosen_packing']) )

        wc_add_notice( __( "Please choose a packing option...", "woocommerce" ), 'error' );

}

代碼位于您的活動子主題(或活動主題)的 functions.php 文件中。測試和工作。

http://img1.sycdn.imooc.com//61c5279c00016aaa05150468.jpg

客戶未選擇包裝選項時的錯誤消息:

http://img1.sycdn.imooc.com//61c527a70001434c06580051.jpg


查看完整回答
反對 回復 2021-12-24
  • 1 回答
  • 0 關注
  • 163 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號