2015-04-21 17 views
7

Co staram się osiągnąć: W woocommerce, muszę sprawdzić datę dostarczoną przez pole datepicker, gdy użytkownik wybierze datę, a następnie odpowiednio zaktualizuje opcje wysyłki przez ajax, tak, że rzeczy takie jak darmowa wysyłka mogą być usunięte, gdy nie są odpowiednie.Woocommerce aktualizuje metody wysyłki w kasie przez ajax

Co obecnie wiem/wymyśliłem: Aktualnie uruchamiam jQuery i wysyłam datą do niestandardowego skryptu, który jest tam, gdzie muszę to zrobić. Nie udało mi się znaleźć funkcji w ramach klas woocommerce, która zwraca tylko dane dotyczące wysyłki, więc nie sądzę, żebym mógł to nazwać i zwrócić jako fragment, tak jak to robią już w kasie.

Ja jednak nie zauważyć, że

WC_AJAX::update_order_review() 

ma połączenia działania w niej, a ja z powodzeniem podłączyć funkcję na tej skargi, a ja byłem w stanie wystrzelić w

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

, który uruchamia akcję, która aktualizuje blok sprawdzania kasy.

Moje prawdziwe pytanie: Wszystko to jest wielki, a I'ts patrząc jak jej idzie w dobrym kierunku, ale nie woocommerce tyle dobrze, aby wiedzieć, jak uzyskać metody wysyłki w moim haczykowatym działania wiedzieć rozbroić je, jeśli to konieczne. Czy ktokolwiek wie, czy uda mi się uzyskać je przez globalny obiekt $ woocommerce, a następnie odczytać je przez resztę tej metody WC_AJAX?

Każda pomoc tutaj będzie bardzo ceniona.

** uwagi: tak, wiem, że to "t", a nie "$" w jQuery. Nie pomylam się.

Odpowiedz

6

Dla tych, którzy mogą tego potrzebować, wymagało to niewielkiego dofinansowania w woocommerce z powodu sposobu, w jaki radzą sobie z wartościami koszyka/kas dla opcji wysyłki i płatności, ale ostatecznie może to zrobić za pomocą haków Woocommerce i bardzo mało modyfikacji wtyczki, więc całkiem czyste rozwiązanie.

Zasadniczo użyłem sesji woocommerce, dwóch haków i wyzwalacza javascript, który odświeża przegląd zamówienia kasy.

Dzięki połączeniu haka woocommerce_checkout_update_order_review, co dzieje się w WC_AJAX::update_order_review i korzystania z wyżej wymienionego $('body').trigger('update_checkout'); rozmowy, mogę podpiąć się do działań, które aktualizuje blok ocena transakcji. Jak na razie dobrze.

To, co zrobiłem w tej funkcji, to sprawdzenie, czy pole ma wartość, a jeśli tak, to zapisz ją w WC()->session. WTÓRA, OD WC_AJAX::update_order_review dzwoni , aby pobrać wszystkie zaktualizowane koszyki i metody wysyłki, zajrzałem do szablonu powiązanego z tą funkcją i znalazłem kolejny haczyk, woocommerce_review_order_before_shipping, który pozwala mi modyfikować metody wysyłki, zanim szablon koszyka przejdzie w pętli i zbuduje wysyłkę opcje w wc_cart_totals_shipping_html().

Teraz wiem, myślisz, poczekaj, potrzebuję metod wysyłki gotówki, a nie koszyka, ale w rzeczywistości wydają się być jednym i tym samym.

Mam nadzieję, że moje zmarnowane godziny pomogą komuś innemu z podobnym problemem.

Pozdrawiam.

+0

Dzięki. To była jedyna odpowiedź, którą mogłem wyśledzić, która próbowała zrobić coś takiego. – DarkNeuron

3

Tak więc odpowiedź Trevora nie zadziałała dokładnie dla mnie (być może WC uległo zmianie od czasu jej powstania), jednak doprowadziło mnie to we właściwym kierunku.

Użyłem trochę różnych filtrów. Problem, który musiałem rozwiązać, to dodawanie/usuwanie niektórych opcji wysyłki w oparciu o niestandardowe pole.

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; 
    } 

Powyższy opis jest niekompletną wersją mojego kodu, ale powinien być zrozumiały. Można go łatwo przetestować, wpisując jQuery('body').trigger('update_checkout'); w konsoli javascript.

Dzięki za wskazówki Trevor.

1

Jeśli ktoś chce aktualizować koszyk:

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

Zmiana o wielkość następnie powrócić. A wysyłka ponownie się przelicza.

(przeglądanie kodu więcej niż 5 godzin, następnym razem będzie kodować cały sklep internetowy, wystarczy użyć dobre ramy i pełną konfigurowalny OMG)