更新WooCommerce中運送方式價格的動態方法
P粉605233764
P粉605233764 2023-08-13 18:08:43
0
1
439
<p>我正在嘗試動態更新我的運輸方式的運費價格。我從api獲取運費,並希望在成功獲取api響應的價格時更新價格。我正在使用以下程式碼:</p> <pre class="brush:php;toolbar:false;">function handle_api_response( $rates ) { // api呼叫程式碼在這裡..... if ($response_code === 200){ $response_data = json_decode($response, true); $price = $response_data['shipments'] } add_filter( 'woocommerce_package_rates', 'set_shipping_prices', PHP_INT_MAX, 1 ); function set_shipping_prices( $rates ) { foreach ( $rates as $rate_id => $rate ) { $rates[ $rate_id ]->cost = $price; } return $rates; } }</pre> <p>上述程式碼不起作用,但是如果我將過濾器移出handle_api_response函數並將一些靜態值設為費用,它似乎可以工作。像這樣:</p> <pre class="brush:php;toolbar:false;">function handle_api_response( $rates ) { // api呼叫程式碼在這裡..... if ($response_code === 200){ $response_data = json_decode($response, true); $price = $response_data['shipments'] } } add_filter( 'woocommerce_package_rates', 'set_shipping_prices', PHP_INT_MAX, 1 ); function set_shipping_prices( $rates ) { foreach ( $rates as $rate_id => $rate ) { $rates[ $rate_id ]->cost = 50; } return $rates; }</pre> <p>我的問題是,由於我從api取得價格值,我需要將價格從api回應傳遞給在觸發過濾器時執行的set_shipping_prices函數。 </p>
P粉605233764
P粉605233764

全部回覆(1)
P粉718165540

這段程式碼未經測試,可能需要一些調整,但它可以是正確的路徑,使您的外部API呼叫有效。

我們可以嘗試使用WC_Session變數來設定我們想要傳遞的運費:

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
        }
    }
}

然後,我們可以在您的掛鉤函數中呼叫WC_Session變數:

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;
}

但是,我們需要其他東西來刷新快取的運輸方法,以使其生效:

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();
}

最後,我們取消設定WC Session變數(在結帳首次載入和感謝頁面上)

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');
    }
}

將程式碼放入您的子主題的functions.php檔案中(或外掛程式中)。它可能有效。

相關:在WooCommerce結帳中勾選自訂複選框後刪除運費

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!