在创建订单WooCommerce之前过滤挂钩

时间:2017-07-19 作者:Lucas Johnston

我想写一个小脚本,每当在WooCommerce中创建订单时进行检查(在结帐之后),然后有条件地更改客户的发货地址。

我想我需要一个过滤器挂钩,在创建订单后立即“启动”。我在WooCommerce Hook reference guide, 比如:“woocommerce\\u create\\u order”,但没有成功。我还联系了WooCommerce支持部门,但没有解决方案。我还查看了:Woocommerce hook after order (on Stackexchange), 然而,我需要一个在创建订单之前(而不是之后)触发的过滤器挂钩。

我想完成的是:

function alter_shipping ($order) {
  if ($something == $condition) {
    $order->shipping_address = "..."; //(simplified)
  }
  return $order;
}
add_filter( \'woocommerce_create_order\', \'alter_shipping\', 10, 1 );
上述示例中的过滤器“woocommerce\\u create\\u order”不会传递任何要操作的变量。

我需要在WooCommerce订单创建时有条件地操纵发货地址。有人知道适合这种情况的过滤器挂钩吗?还是另一种方式?

3 个回复
最合适的回答,由SO网友:Madebymartin 整理而成

无意中发现了这件事,我现在发现了同样的东西(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\' => \'Martin\',
      \'last_name\'  => \'Stevens\',
      \'company\'    => \'MBM Studio\',
      \'email\'      => \'[email protected]\',
      \'phone\'      => \'777-777-777-777\',
      \'address_1\'  => \'99 Arcadia Avenue\',
      \'address_2\'  => \'\', 
      \'city\'       => \'London\',
      \'state\'      => \'\',
      \'postcode\'   => \'12345\',
      \'country\'    => \'UK\'
    );

    $order->set_address( $address, \'shipping\' );

  }

  return $order;

}

SO网友:Rach Chen

您得到了正确的筛选器,参数的方式是错误的:

woocommerce 3.0.6 doc

// define the woocommerce_create_order callback 
function filter_woocommerce_create_order( $null, $instance ) { 
    // make filter magic happen here... 
    return $null; 
}; 

// add the filter 
add_filter( \'woocommerce_create_order\', \'filter_woocommerce_create_order\', 10, 2 ); 
所以你的$order 将始终为null,然后将$order, 然后让$order 移动到第二个参数。则返回值必须为$order_id 或者try-catch函数会卡住您的代码片段。有full doc 此函数的。

fixed

function alter_shipping (null,$order) {
  if ($something == $condition) {
    $order->shipping_address = "..."; //(simplified)
  }
  $order_id = $order->save();

  return $order_id;
}
add_filter( \'woocommerce_create_order\', \'alter_shipping\', 10, 2);

SO网友:nmr

尝试动作挂钩woocommerce_checkout_create_order, 它在保存到DB之前调用。

woocommerce_checkout_create_order

结束

相关推荐

Apply_Filters(‘the_content’)-是否使其忽略快捷代码?

我正在使用apply_filters(\'the_content) 因此,我可以在后端的wp编辑器中看到格式正确的内容。但是,这也会呈现内容中的短代码。我希望它忽略短代码,对其余内容进行过滤,基本上与发帖时一样。如果您在后端查看帖子内容,您将看到短代码,但如果您在网站的页面内查看它,您将看到呈现的短代码(其结果)。这可能吗?