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结账中勾选自定义复选框后删除运费