Проблема с woocommerce_checkout_order_processed элементами заказа

#php #wordpress #woocommerce #hook-woocommerce #orders

#php #wordpress #woocommerce #ошибка-woocommerce #заказы

Вопрос:

Я работаю над проектом WooCommerce. Мне нужно добавить некоторую запись на основе упорядоченного элемента в мою пользовательскую таблицу. Если пользователь заказал 3 элемента, то эти 3 записи будут размещены вместе с некоторыми данными в моей пользовательской таблице.

Для этого я использовал woocommerce_checkout_order_processed hook. Но я столкнулся с некоторой проблемой, что если пользователь добавляет 4 товара в корзину и на странице оформления заказа, если пользователь удалил все товары, кроме одного, и, наконец, заказал только 1 товар, тогда и в этом крючке я получаю все 4 товара. Я не получаю окончательный заказанный элемент в этом крючке.

Поэтому я изменил перехват на woocommerce_thankyou . Но в некоторых случаях по какой-либо причине пользователь не заходил на страницу благодарности или при оплате какой-либо кредитной картой этот перехват не сработал.

Итак, кто-нибудь может сказать мне лучший хук, который может быть запущен после размещения заказа, независимо от того, произведена оплата или нет, а также я должен получать только заказанные товары. Моя версия WooCommerce — 3

Код :

 function wc_function($order_id) {
    global $wpdb;
    $order = new WC_Order($order_id);
    $items = $order->get_items();
    foreach ($items as $item_line_id => $item) {
        // Insert data in my custom table
    }
}
//add_action('woocommerce_checkout_order_processed','wc_function', 10, 3);
//add_action('woocommerce_thankyou', 'wc_function', 10, 1);
  

Спасибо!

Комментарии:

1. как вы получаете эти элементы в обратном вызове? $order->get_items() ??

2. Привет @swadhwa, пожалуйста, проверьте мой обновленный вопрос.

3. Да, я использую $order->get_items() для получения элементов.

4. замена function wc_function($order_id) на function wc_function($order_id, $posted_data, $order) него не должна иметь никакого значения, но вы могли бы попробовать: $order->get_items()

5. @7uc1f3r, да, с 3 аргументами это работает, если мы получаем элементы непосредственно из аргументов. Если мы используем wc_get_order( $order_id )-> get_items(), то он вернет все товары, даже удаленные со страницы корзины.

Ответ №1:

do_action on woocommerce_checkout_order_processed передает ровно три аргумента, третий из которых является самим $order собой. Поэтому попробуйте использовать это вместо:

 function wc_function($order_id, $posted_data, $order) {
    $items = $order->get_items();
    foreach ($items as $item_line_id => $item) {
        // Insert data in my custom table
    }
}
  

Комментарии:

1. Привет, я понимаю, что в перехвате woocommerce_checkout_order_processed иногда он добавляет несколько записей в мою пользовательскую таблицу. Он работает не так, как ожидалось. Есть ли у вас какой-либо другой перехват, который можно запустить точно после размещения заказа?

2. У нас есть woocommerce_thankyou, и я тоже пытался, но почему-то, если пользователь не заходит на страницу благодарности, это не работает.

Ответ №2:

add_action( ‘woocommerce_checkout_order_processed’, ‘getswift_delivery_thankyou’, 10, 1); add_action(‘woocommerce_thankyou’, ‘getswift_delivery_thankyou’, 10, 1);

Вы можете использовать этот крючок, он работает на моей стороне … если у вас есть какие-либо проблемы, обсудите их со мной, и мы их решим