2014-09-02 23 views
9

Tworzę niestandardową wtyczkę dla mojej witryny.Dodaj dodatkową metę do zamówień w Woocommerce

W niektórych częściach tej wtyczki muszę przechowywać dodatkowe meta w wp_postmeta dla każdego zamówienia.

dodałem to w klasie mojego pluginu:

`add_action ('woocommerce_before_checkout_process', array(&$this, 'add_item_meta', 10, 2));` 

A to add_item_meta() funkcja:

function add_item_meta($item_id, $values) { 
      wc_add_order_item_meta($item_id, '_has_event', 'yes'); 
     } 

Funkcja ta nie jest kompletna, ale nic się nie dzieje z tych kodów; Myślę, że muszę użyć innego haka, ale nie mogę znaleźć właściwego.

Czy ktoś wie coś na ten temat?

Mam również inny problem z $item_id: jest to zmienna globalna woocommerce, ale nie widzę jej w mojej wtyczce!

To znaczy, nie mam dostępu do tej zmiennej z mojej wtyczki lub czegoś podobnego!

Odpowiedz

4

odpowiedź brzmi: należy używać woocommerce_checkout_update_order_meta dla add_action i też mam po prostu użyć update_post_meta() dodać dodatkowy meta do mojego zamówienia

function add_item_meta($order_id) { 
      //global $woocommerce; 
      update_post_meta($order_id, '_has_event', 'yes'); 
     } 
3

2016 sposób:

add_action('woocommerce_checkout_update_order_meta',function($order_id, $posted) { 
    update_post_meta($order_id, 'my_custom_meta_key', 'my data'); 
} , 10, 2); 
  • $order_id to identyfikator zamówienia, który jest przechowywany jako niestandardowy typ wpisu
  • $posted to wszystkie dane z $_POST
+1

Gdzie jest ten kod umieszczony w systemie? W jakim pliku? Czy to podejście ujawni dane niestandardowe wywołaniu Order API, takie jak https://shop.example.com/wc-api/v3/orders/1248 –

+0

Możesz umieścić ten kod bezpośrednio w pliku 'functions.php' swojego tematu. WooCommerce uruchomi tę funkcję zaraz po utworzeniu zamówienia i zapisaniu go w bazie danych. – gregdev

12

Opierając się na Mo Saeedi odpowiedź, uważam, że ten fragment jest bardziej zgodne z new CRUD approach wprowadzonego przez woocommerce 3,0:

add_action('woocommerce_checkout_update_order_meta',function($order_id, $posted) { 
    $order = wc_get_order($order_id); 
    $order->update_meta_data('my_custom_meta_key', 'my data'); 
    $order->save(); 
} , 10, 2); 

Apostolskiej Również ten gwinty na WordPress fora:

+0

Myśli o tym, jak dodać niestandardowe pole meta (przypisane do klienta/użytkownika, który zamówił przedmiot) do meta zamówienia? – Garconis

5

2018 sposób:

Zbudowany na Guido W.P. odpowiedzieć można użyć zamiast woocommerce_checkout_create_order hak działań w bardziej lżejsze i efektywny kod wersja (używając WC 3+ CRUD methods):

add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2); 
function before_checkout_create_order($order, $data) { 
    $order->update_meta_data('_custom_meta_key', 'value'); 
} 

Kod idzie w pliku function.php swojego aktywnego motywu dziecka (lub aktywnego tematu).

Testowane i działa w WooCommerce 3+ (tylko).


kilka wyjaśnień:

Hak działanie woocommerce_checkout_create_order jest krok przed zapisaniem danych rzędu. Patrz poniżej w ekstrakcie metody WC_Checkoutcreate_order() (z obu hakach):

/** 
* Action hook to adjust order before save. 
* @since 3.0.0 
*/ 
do_action('woocommerce_checkout_create_order', $order, $data); 

// Save the order. 
$order_id = $order->save(); 

do_action('woocommerce_checkout_update_order_meta', $order_id, $data); 

return $order_id; 

Dlaczego używając woocommerce_checkout_create_order zamiast?:

  • bo nie trzeba używać $order = wc_get_order($order_id); jak już dostał $order jako argument w funkcji uzależniony.
  • Nie trzeba używać $order->save(); jak będzie to miało miejsce tuż po każdym razie (patrz kod źródłowy)
  • także woocommerce_checkout_create_order został wydany w woocommerce wersji 3 i to pokojówka na to zbyt.

To działa tylko z pojedynczą linią kodu wewnątrz funkcji.

+0

To bardzo sprytne @LoicTheAztec! Mam tylko jedną wątpliwość: czy jest to tak samo przyszłościowe jak użycie 'woocommerce_checkout_update_order_meta'? Wygląda na to, że 'woocommerce_checkout_update_order_meta' został tam umieszczony przez twórców WooCommerce w celu aktualizacji meta zleceń. Mogę się mylić, ale użycie innego filtra do tego konkretnego celu sprawia, że ​​czuję się trochę nieswojo. –

+0

@GuidoWalterPettinari Możesz użyć tej samej funkcji, kodu do różnych celów, lub mieć 2 różne funkcje podpięte w tym samym haku z różnymi priorytetami ... To nie jest wielka sprawa :) ... Tak więc oba kody działają równie dobrze ... Jedyna różnica jest to, że ** mój jest tylko trochę lżejszy niż twój **, ponieważ nie pamiętam wystąpienia obiektu WC_Order i nie muszę używać metody save() ... – LoicTheAztec

+0

Hi Loic! I Twoje rozwiązanie jest rzeczywiście szybsze niż moje, ale nie powiedziałbym, że to jedyna różnica. Na podstawie nazwy filtra prawdopodobnie zespół WooCommerce życzy sobie, abyśmy zaktualizowali metatag zamówień za pomocą filtru 'woocommerce_checkout_update_order_meta'. Chodzi mi o to, że może być nierozsądne pominięcie tej wskazówki, aby uzyskać kilka milisekund w czasie wykonywania, szczególnie, że aktualizacje WooCommerce są tak częste i nie zawsze są zgodne z kompatybilnością wsteczną. Jestem trochę paranoikiem, Wiem, że –