Хук WooCommerce после обновления заказа?

Есть ли ловушка, которую я могу использовать, когда вношу изменение в чей-то заказ через администратора (например, его адрес или настраиваемое мета-поле)? Я прочитал этот вопрос, но, к сожалению, woocommerce_process_shop_order_meta запускается до сохранения заказа, то есть у меня нет доступа к недавно обновленным данным. Мне нужно иметь возможность использовать новые данные, сохраненные в заказе.

ОБНОВЛЕНИЕ: проблема с использованием save_post_shop_order заключается в том, что мета обновляется до того, как это происходит, поэтому я не могу сравнить ранее сохраненное мета-значение, например:

$metaArray = $_POST['meta'];

foreach($metaArray as $meta => $key) {
    $metaArr[$key["key"]] = $key["value"];
}

$meta = get_post_meta($order->ID);

if($meta['coverstart'][0] != $metaArr['coverstart']) {
    die("COVER START DATE HAS CHANGED");
}

die() никогда не попадает, потому что скрипт всегда получает только что сохраненное значение.


person Liam McArthur    schedule 27.03.2018    source источник
comment
Отвечает ли это на ваш вопрос? Ловушка Woocommerce для обновления заказа   -  person Márton Tamás    schedule 21.01.2021


Ответы (1)


Извините, но woocommerce_checkout_update_order_meta запускается после сохранения заказа ... См. Этот исходный код извлечения, расположенный в _ 2_ create_order() метод:

// Save the order.
$order_id = $order->save(); // <== Order is saved here before

do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data ); <== // The hook

return $order_id;

Итак, в woocommerce_checkout_update_order_meta вы можете получить сохраненные данные заказа:

  • путем извлечения объекта WC_Order из аргумента $order_id и использования всех его методов.
  • или используя get_post_meta() с аргументом $order_id, чтобы получить данные, сохраненные в wp_postmeta таблице базы данных.

Затем вы можете обновить данные с помощью функции update_post_meta()


Вы даже можете использовать woocommerce_checkout_create_order перед сохранением данных…

Вы сможете получить данные из аргумента $order, используя все доступные методы для класса WC_Order (методы получения CRUD).

Вы сможете изменить эти данные и сохранить их с помощью методов установки CRUD…

Некоторые примеры в stackOverFlow


Если вам нужно сделать это после оформления заказа, то крючки, которые будут использоваться, могут быть:

  • woocommerce_new_order (по событию вновь созданного заказа)
  • woocommerce_thankyou (на странице полученного заказа)
  • woocommerce_order_status_changed (по событию изменения статуса заказа)

А может быть и другие ...


Чтобы изменить данные при сохранении заказа в бэкэнде, вы будете использовать save_post_shop_order с 3 аргументами: $post_id, $post и $update

person LoicTheAztec    schedule 27.03.2018
comment
Какой фантастический ответ. Теперь это имеет для меня больше смысла. Большое спасибо за вашу помощь в этом! - person Liam McArthur; 27.03.2018
comment
Обновил мой вопрос на основе проблемы с использованием save_post_shop_order. @LoicTheAztec - person Liam McArthur; 28.03.2018
comment
@LiamMcArthur Вы должны задать новый вопрос с этим обновлением и вернуться к исходному вопросу ... Также попробуйте добавить в этот новый вопрос код, который можно протестировать, чтобы найти что-то полезное для вас ... - person LoicTheAztec; 28.03.2018