Maison  >  Questions et réponses  >  le corps du texte

Manière dynamique de mettre à jour le prix du mode d'expédition dans WooCommerce

<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粉605233764P粉605233764457 Il y a quelques jours492

répondre à tous(1)je répondrai

  • P粉718165540

    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

    répondre
    0
  • Annulerrépondre