Фильтр-хук перед созданием заказа в WooCommerce
Я хотел бы написать небольшой скрипт, который выполняет проверку при создании заказа в WooCommerce (сразу после оформления) и затем условно изменяет адрес доставки клиента.
Я думаю, что мне нужен фильтр-хук, который срабатывает сразу после создания заказа. Я пробовал несколько вариантов из справочника хуков WooCommerce, например: 'woocommerce_create_order', но безуспешно. Я также обращался в службу поддержки WooCommerce, но решения не получил. Я также проверил: Woocommerce хук после заказа (на Stackexchange), однако мне нужен фильтр-хук, который срабатывает до создания заказа (не после).
Я хотел бы реализовать что-то вроде:
function alter_shipping ($order) {
if ($something == $condition) {
$order->shipping_address = "..."; //(упрощенно)
}
return $order;
}
add_filter( 'woocommerce_create_order', 'alter_shipping', 10, 1 );
Этот фильтр 'woocommerce_create_order' в приведенном выше примере не передает никаких переменных для манипуляции.
Мне нужно условно манипулировать адресом доставки в заказе WooCommerce в момент его создания. Кто-нибудь знает подходящий фильтр-хук для этого? Или другой способ?

Наткнулся на это, искал решение той же проблемы, которую теперь разобрал (Woocommerce 3.x)...
add_filter( 'woocommerce_checkout_create_order', 'mbm_alter_shipping', 10, 1 );
function mbm_alter_shipping ($order) {
if ($something == $condition) {
$address = array(
'first_name' => 'Мартин',
'last_name' => 'Стивенс',
'company' => 'MBM Studio',
'email' => 'test@test.com',
'phone' => '777-777-777-777',
'address_1' => '99 улица Аркадия',
'address_2' => '',
'city' => 'Лондон',
'state' => '',
'postcode' => '12345',
'country' => 'Великобритания'
);
$order->set_address( $address, 'shipping' );
}
return $order;
}

Вы использовали правильный фильтр, но аргументы переданы неправильно:
документация woocommerce 3.0.6
// определяем callback-функцию woocommerce_create_order
function filter_woocommerce_create_order( $null, $instance ) {
// здесь происходит магия фильтра...
return $null;
};
// добавляем фильтр
add_filter( 'woocommerce_create_order', 'filter_woocommerce_create_order', 10, 2 );
Таким образом, ваш $order
всегда будет null, поэтому нужно заменить null на ваш $order
и переместить $order
во второй параметр. Возвращаемое значение должно быть $order_id
, иначе try-catch функция заблокирует ваш сниппет. Вот полная документация этой функции.
исправленная версия
function alter_shipping (null,$order) {
if ($something == $condition) {
$order->shipping_address = "..."; //(упрощенно)
}
$order_id = $order->save();
return $order_id;
}
add_filter( 'woocommerce_create_order', 'alter_shipping', 10, 2);

Попробуйте хук действия woocommerce_checkout_create_order
, он вызывается непосредственно перед сохранением в БД.
