2015-04-21 15 views
7

Quello che sto cercando di realizzare: In woocommerce, ho bisogno di controllare una data consegnata tramite un campo Datepicker quando l'utente seleziona una data, e quindi aggiornare le opzioni di spedizione di conseguenza tramite Ajax, in modo che cose come la spedizione gratuita possano essere eliminate quando non sono appropriate.Woocommerce aggiornamento metodi di spedizione in cassa tramite ajax

Quello che attualmente so/ho capito: Attualmente ho l'evento jQuery che si attiva e invia una data a uno script personalizzato, che è un pò dove devo fare. Non sono stato in grado di trovare una funzione all'interno delle classi woocommerce che restituisce solo i dati di spedizione, quindi non credo di poterlo chiamare e restituirlo come un frammento, come già avviene per il checkout.

Tuttavia, ho trovato che

WC_AJAX::update_order_review() 

ha una chiamata in azione all'interno di esso, e ho agganciato con successo una funzione su quella azione, e sono stato in grado di sparare il

t('body').trigger('update_checkout'); 

che spegne l'azione che aggiorna il blocco di revisione del checkout.

La mia vera domanda: Tutto questo è grande, e I'ts guardando come il suo titolo nella giusta direzione, ma non so woocommerce abbastanza bene per sapere come ottenere i metodi di spedizione all'interno della mia azione agganciato disinserirle se necessario. Qualcuno sa se riesco a farli attraverso l'oggetto globale $ woocommerce, e poi farli leggere dal resto del metodo WC_AJAX ??

Qualsiasi aiuto qui sarebbe molto apprezzato.

** note: sì, so che è un 't' e non un '$' nel jQuery. Non è un errore

risposta

6

Quindi, per quelli di voi che potrebbero aver bisogno di questo, ha richiesto un po 'di finishing nel woocommerce, a causa del modo in cui gestiscono l'output di valori carrello/checkout per le opzioni di spedizione e pagamento, ma alla fine, io potrebbe accadere usando gli hook di woocommerce, e una modica modifica del plugin, quindi, una soluzione piuttosto pulita.

Fondamentalmente quello che ho fatto è stato utilizzare le sessioni di woocommerce, due hook e un trigger javascript che aggiorna la recensione dell'ordine di checkout.

Attraverso una combinazione del gancio woocommerce_checkout_update_order_review che avviene nel WC_AJAX::update_order_review e l'uso del sopracitato $('body').trigger('update_checkout'); chiamata, ho potuto agganciare all'azione che aggiorna il blocco recensione cassa. Fin qui tutto bene.

Quello che ho fatto in questa funzione è stato controllare se il campo aveva un valore, e se lo ha fatto, salvarlo nel WC()->session. POI, dal WC_AJAX::update_order_review chiamate woocommerce_order_review() per afferrare tutti i metodi aggiornati di carrello e spedizione, ho esaminato il modello associato a tale funzione e ho trovato un altro hook, woocommerce_review_order_before_shipping, che mi consente di modificare i metodi di spedizione prima che il modello del carrello esegua il loop e sviluppi la spedizione opzioni in wc_cart_totals_shipping_html().

Ora, lo so, stai pensando, aspetta, ho bisogno di check-out metodi di spedizione, non quelli da carrello, ma in realtà, sembrano essere la stessa cosa.

Speriamo che le mie ore sprecate possano aiutare qualcun altro con un problema simile.

Cheers.

+0

Grazie. Questa è stata l'unica risposta che ho potuto rintracciare che ha tentato di fare qualcosa di simile. – DarkNeuron

3

Quindi la risposta di Trevor non ha funzionato esattamente per me (forse il WC è cambiato da quando è stato creato), tuttavia mi ha portato nella giusta direzione.

Ho usato alcuni filtri leggermente diversi. Il problema che dovevo risolvere era aggiungere/rimuovere alcune opzioni di spedizione, in base a un campo personalizzato.

add_action('woocommerce_checkout_update_order_review', function ($rawFields) { 
      // This function checks for the value of my custom field on the checkout page. 
      parse_str($rawFields, $checkoutFields); 
      $this->myField = $checkoutFields['my_field'] ?? null; 
}); 

add_filter('woocommerce_shipping_packages', 'modifyShippingPackages']); 

public function modifyShippingPackages($packages) 
    { 
     if ($this->myField) { 
      //.. modify $packages. In my case, I had to remove shipping methods. 
      $rates = $packages[0]['rates']; 

      $newRates = array_filter($rates, function ($shippingRate) 
      { 
       // figure out what should be in the rates 
      }); 

      $packages[0]['rates'] = $newRates; 

      $session = WC()->session; 
      $session->set('shipping_method_counts', [count($newRates)]); 
      $session->set('chosen_shipping_methods', [$newRates[0]->id]); 
     } 

     return $packages; 
    } 

Il frammento di cui sopra è una versione incompleta del mio codice, ma dovrebbe ottenere il punto attraverso. Può essere testato facilmente digitando jQuery('body').trigger('update_checkout'); nella tua console javascript.

Grazie per i suggerimenti Trevor.

1

Se qualcuno vuole aggiornare il carrello:

foreach (WC()->cart->get_cart() as $key => $value) { 
    WC()->cart->set_quantity($key, $value['quantity']+1); 
    WC()->cart->set_quantity($key, $value['quantity']); 
    break; 
} 

Modifica del quantitativo poi cambiare di nuovo. E la spedizione ricalcola.

(più di 5 ore il codice di navigazione, la prossima volta che sarà codificare l'intero negozio online, basta usare un buon quadro completo e personalizzabile OMG)

Problemi correlati