Maison > Questions et réponses > le corps du texte
P粉7181655402023-08-14 11:18:03
Ce code n'a pas été testé et peut nécessiter quelques ajustements, mais il peut être le bon chemin pour faire fonctionner vos appels d'API externes.
Nous pouvons essayer d'utiliser la variable WC_Session pour définir les frais d'expédition que nous souhaitons facturer :
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 } } }
Nous pouvons alors appeler la variable WC_Session dans votre fonction hook :
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; }
Cependant, nous avons besoin d'autre chose pour actualiser la méthode d'expédition mise en cache afin qu'elle prenne effet :
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(); }
Enfin, nous désactivons la variable WC Session (à la caisse, premier chargement et page de remerciement) :
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'); } }
Mettez le code dans le fichier function.php de votre thème enfant (ou dans un plugin). Cela peut fonctionner.
Connexe : Supprimez les frais d'expédition après avoir coché la case personnalisée dans la caisse WooCommerce