Фильтр-хук перед созданием заказа в WooCommerce

19 июл. 2017 г., 20:11:41
Просмотры: 22K
Голосов: 7

Я хотел бы написать небольшой скрипт, который выполняет проверку при создании заказа в 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 в момент его создания. Кто-нибудь знает подходящий фильтр-хук для этого? Или другой способ?

0
Все ответы на вопрос 3
0

Наткнулся на это, искал решение той же проблемы, которую теперь разобрал (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;

}
27 июл. 2018 г. 14:18:28
0

Вы использовали правильный фильтр, но аргументы переданы неправильно:

документация 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);
20 авг. 2019 г. 17:22:56
0

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

woocommerce_checkout_create_order

27 июл. 2018 г. 14:25:14