Cara dinamik untuk mengemas kini harga kaedah penghantaran dalam WooCommerce
P粉605233764
P粉605233764 2023-08-13 18:08:43
0
1
500
<p>Saya cuba mengemas kini harga penghantaran secara dinamik untuk kaedah penghantaran saya. Saya mendapat harga penghantaran daripada api dan ingin mengemas kini harga apabila saya berjaya mendapatkan harga daripada respons api. Saya menggunakan kod berikut: </p> <pre class="brush:php;toolbar:false;">function handle_api_response( $rates ) { //Kod panggilan api ada di sini..... jika ($kod_tindak balas === 200){ $data_tindak balas = json_decode($respon, benar); $price = $response_data['shipments'] } add_filter( 'kadar_pakej_woocommerce', 'tetapkan_harga_penghantaran', PHP_INT_MAX, 1 ); fungsi set_shipping_price( $rates ) { foreach ( $kadar sebagai $kadar_id => $kadar ) { $kadar[ $kadar_id ]->kos = $harga; } pulangan $kadar; } }</pre> <p>Kod di atas tidak berfungsi, tetapi jika saya mengalihkan penapis keluar daripada fungsi handle_api_response dan menetapkan beberapa nilai statik kepada bayaran, ia nampaknya berfungsi. Seperti ini:</p> <pre class="brush:php;toolbar:false;">function handle_api_response( $rates ) { //Kod panggilan api ada di sini..... jika ($kod_tindak balas === 200){ $data_tindak balas = json_decode($respon, benar); $price = $response_data['shipments'] } } add_filter( 'kadar_pakej_woocommerce', 'tetapkan_harga_penghantaran', PHP_INT_MAX, 1 ); fungsi set_shipping_price( $rates ) { foreach ( $kadar sebagai $kadar_id => $kadar ) { $kadar[ $kadar_id ]->kos = 50; } pulangan $kadar; }</pre> <p>Masalah saya ialah memandangkan saya mendapat nilai harga daripada api, saya perlu menghantar harga daripada respons api kepada fungsi set_shipping_price yang berjalan apabila penapis dicetuskan. </p>
P粉605233764
P粉605233764

membalas semua(1)
P粉718165540

Kod ini belum diuji dan mungkin memerlukan sedikit pengubahsuaian, tetapi ia boleh menjadi laluan yang betul untuk menjadikan panggilan API luaran anda berfungsi.

Kita boleh cuba menggunakan pembolehubah WC_Session untuk menetapkan yuran penghantaran yang ingin kita lalui:

function handle_api_response( $rates ) {

    // 在这里编写API调用代码.....
 
    if ($response_code === 200){
        $response_data = json_decode($response, true);
        $cost = $response_data['shipments'];
         
        if ( $cost > 0 ) {
            // 将费用设置为WC Session变量
            WC()->session->set('shipment_cost', floatval($cost));

            // 尝试触发“更新结账”Ajax事件
            ?><script>jQuery('body').trigger('update_checkout');</script><?php
        }
    }
}

Kami kemudian boleh memanggil pembolehubah WC_Session dalam fungsi cangkuk anda:

add_filter('woocommerce_package_rates', 'update_shipping_costs', 10, 2);
function update_shipping_costs( $rates, $package ) {
    foreach ( $rates as $rate_id => $rate ) {
        // 从Session变量中获取新的费用
        $new_cost = WC()->session->get('shipment_cost');

        if( isset($rate->cost) && $rate->cost > 0 && $new_cost > 0 ) {
            $rates[ $rate_id ]->cost = $new_cost; // 设置新的费用
        }
    }
    return $rates;
}

Walau bagaimanapun, kami memerlukan sesuatu yang lain untuk menyegarkan kaedah penghantaran cache agar ia berkuat kuasa:

add_action('woocommerce_checkout_update_order_review', 'refresh_shipping_methods');
function refresh_shipping_methods( $post_data ){
    $bool = true;

    // 我们检查Session变量
    if ( WC()->session->get('shipment_cost') > 0 ) {
        $bool = false;
    }

    // 与运输方法一起使用时是必需的
    foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){
        WC()->session->set( 'shipping_for_package_' . $package_key, $bool );
    }
    WC()->cart->calculate_shipping();
}

Akhir sekali, kami menyahset pembolehubah Sesi WC (semasa pembayaran pertama dimuatkan dan halaman terima kasih) :

add_action('wp_footer', 'reset_wc_session_variable');
function reset_wc_session_variable() {
    if (is_checkout() && WC()->session->get('shipment_cost') > 0) {
        WC()->session->__unset('shipment_cost');
    }
}

Masukkan kod ke dalam fail functions.php tema anak anda (atau ke dalam pemalam). Ia mungkin berkesan.

Berkaitan: Alih keluar kos penghantaran selepas menyemak kotak pilihan tersuai dalam pembayaran WooCommerce

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan