2017-03-06 2 views
1

J'utilise un plugin personnalisé pour la méthode d'expédition Woocommerce. Le plugin exécute une nouvelle classe qui étend WC_Shipping_MEthod, mais le problème est que le prix 'cost' est calculé dans une autre fonction en dehors de la classe.Fonction de classe pour la méthode d'expédition personnalisée sur la page de paiement de Woocommerce

Ainsi, dans la classe actuelle je:

 public function calculate_shipping($package=array()) { 

     /* $this->add_rate(array(
        'id' => $this->id . $this->instance_id, 
        'label' => $this->title, 
        'cost' => 0, 
      )); */ 

      $rate = array(
       'id' => $this->id, 
       'label' => $this->title, 
       'cost' => 0, 
       'taxes' =>false, 
       //'calc_tax' => 'per_item' 
      ); 

      // Register the rate 
      $this->add_rate($rate); 

     } 

En dehors de la classe, dans un autre fichier, j'ai une fonction qui calcule le coût pour l'expédition:

//add shipping cost to checkout total 
add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee'); 

function woo_add_cart_fee() { 

    global $woocommerce; 
    $woocommerce->shipping; 
    $wc_econt = new WC_Econt_Shipping_Method; 

    if (is_checkout() && (bool)$wc_econt->inc_shipping_cost == TRUE) { 
     if(!isset($_SESSION)){ 
      session_start(); 
     } 
     //write_log('session econt customer shipping cost:'.$_SESSION['econt_shipping_cost']); 
     $extracost = (isset($_SESSION['econt_shipping_cost']) ? $_SESSION['econt_shipping_cost'] : 0); 
     if ($extracost != '0') { 
      WC()->cart->add_fee(__('Econt Express Shipping Method','woocommerce-econt'), $extracost);  
     } 
    } 
} 

Si seulement changer 0 à $ extracode dans la fonction de classe il ne met pas à jour le coût d'expédition sur la page de paiement:

fonction publique calculate_shipping ($ package = array()) {

Je suppose que la classe est exécutée avant la fonction woo_add_cart_fee, et c'est pourquoi elle ne peut pas obtenir la valeur de la variable $ extracost.

Comment résoudre ceci?

Répondre

0

Dans la fonction pour calculer les frais de port, ajouter une variable de session avec votre nouvelle valeur calculée comme suit:

//add shipping cost to checkout total 
add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee'); 

function woo_add_cart_fee() { 

    global $woocommerce; 
    $woocommerce->shipping; 
    $wc_econt = new WC_Econt_Shipping_Method; 

    if (is_checkout() && (bool)$wc_econt->inc_shipping_cost == TRUE) { 
     if(!isset($_SESSION)){ 
      session_start(); 
     } 
     //write_log('session econt customer shipping cost:'.$_SESSION['econt_shipping_cost']); 
     $extracost = (isset($_SESSION['econt_shipping_cost']) ? $_SESSION['econt_shipping_cost'] : 0); 
     if ($extracost != '0') { 
      WC()->session->set('Econt_Express_Shipping_Method' , $extracost);  
     } 
    } 
} 

Ensuite, la fonction d'expédition calculate utiliser la variable de session WC pour définir la valeur du coût comme ci-dessous:

public function calculate_shipping($package=array()) { 

/* $this->add_rate(array(
      'id' => $this->id . $this->instance_id, 
      'label' => $this->title, 
      'cost' => 0, 
    )); */ 

    $rate = array(
     'id' => $this->id, 
     'label' => $this->title, 
     'cost' => WC()->session->get('Econt_Express_Shipping_Method'), 
     'taxes' =>false, 
     //'calc_tax' => 'per_item' 
    ); 

    // Register the rate 
    $this->add_rate($rate); 

} 

Utilisez le javascript ci-dessous pour mettre à jour votre nouvelle valeur d'expédition à la caisse:

$('body').trigger('update_checkout', { update_shipping_method: true }); 

Vous pouvez changer la valeur de l'adresse de facturation, de l'adresse de livraison ou du pays pour pouvoir mettre à jour votre valeur si vous utilisez le code ci-dessus plus d'une fois à la caisse. C'est aussi là où je suis coincé et que je suis forcé de simuler ces changements afin que Woocommerce puisse mettre à jour ma valeur d'expédition ... je cherche encore la solution si ... lol :)

$("#billing_address_1").trigger("keypress").val(function(i,val){return val + 'a';});