P粉7181655402023-08-14 11:18:03
這段程式碼未經測試,可能需要一些調整,但它可以是正確的路徑,使您的外部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結帳中勾選自訂複選框後刪除運費