#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);
Вы можете использовать этот крючок, он работает на моей стороне … если у вас есть какие-либо проблемы, обсудите их со мной, и мы их решим