Manière dynamique de mettre à jour le prix du mode d'expédition dans WooCommerce
P粉605233764
P粉605233764 2023-08-13 18:08:43
0
1
541
<p>J'essaie de mettre à jour dynamiquement les prix d'expédition pour mes méthodes d'expédition. Je reçois le prix d'expédition de l'API et je souhaite mettre à jour le prix lorsque j'obtiens avec succès le prix de la réponse de l'API. J'utilise le code suivant : </p> <pre class="brush:php;toolbar:false;">function handle_api_response( $rates ) { //Le code d'appel de l'API est ici..... si ($response_code === 200){ $response_data = json_decode($response, true); $prix = $response_data['expéditions'] } add_filter( 'woocommerce_package_rates', 'set_shipping_prices', PHP_INT_MAX, 1 ); fonction set_shipping_prices( $rates ) { foreach ( $rates comme $rate_id => $rate ) { $rates[ $rate_id ]->cost = $price; } retourner les taux $ ; } }</pré> <p>Le code ci-dessus ne fonctionne pas, mais si je déplace le filtre hors de la fonction handle_api_response et que je définis une valeur statique pour les frais, cela semble fonctionner. Comme ceci : </p> <pre class="brush:php;toolbar:false;">function handle_api_response( $rates ) { //Le code d'appel de l'API est ici..... si ($response_code === 200){ $response_data = json_decode($response, true); $prix = $response_data['expéditions'] } } add_filter( 'woocommerce_package_rates', 'set_shipping_prices', PHP_INT_MAX, 1 ); fonction set_shipping_prices( $rates ) { foreach ( $rates comme $rate_id => $rate ) { $rates[ $rate_id ]->coût = 50 ; } retourner les taux $ ; }</pré> <p>Mon problème est que puisque j'obtiens la valeur du prix de l'API, je dois transmettre le prix de la réponse de l'API à la fonction set_shipping_prices qui s'exécute lorsque le filtre est déclenché. </p>
P粉605233764
P粉605233764

répondre à tous(1)
P粉718165540

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal