要停止 checkout 过程,您可以使用许多不同的挂钩,它们都是操作挂钩:
1).woocommerce_checkout_process
钩子主要与自定义结帐字段for validation一起使用,使用$_POST
变量判断该自定义字段,允许使用错误通知停止 checkout 过程,如下面的基本示例所示:
add_action('woocommerce_checkout_process', 'custom_checkout_field_validation');
function custom_checkout_field_validation() {
if ( isset($_POST['custom_field']) && ! empty($_POST['custom_field']) ) {
wc_add_notice(__('Invalid <strong>Custom field</strong>, please check ...'), 'error');
}
}
您还可以使用此挂钩进行判断:
- 所有通过
$_POST
变量的数据,
- Wc_Cart对象和所有购物车项目,
- WC_SESSION数据
此挂钩在创建WC_Order
对象之前触发.
2).woocommerce_checkout_create_order
动作挂钩有2个参数$order
和$data
.在字段验证后触发.
在该挂钩中,WC_Order
对象与所有数据but it's not yet saved to the database.一起存在
它允许stop the checkout process like in this answer,通过使用类似如下的基本代码:
add_action( 'woocommerce_checkout_create_order', 'process_checkout_creating_order', 10, 2 );
function process_checkout_creating_order( $order, $data ) {
if( ! $order->get_billing_company() ) {
throw new Exception( __("My error text") );
}
}
你可以:
- 更改订单数据,
- 判断购物车物品,
- 判断WC_SESSION数据.
现在,对于订单项目(在保存订单之前),最好使用以下挂钩,具体取决于项目类型:
使用该Order Items挂钩,您可以使用throw new Exception()
停止 checkout 过程,并显示错误通知.
woocommerce_checkout_order_created
钩子将$order
作为唯一参数.这里是WC_Order
exist and has been saved to database,处于"待定"状态.
您可以使用throw new Exception()
停止 checkout 过程.
您可以查看WC_Order
数据、购物车项目和WC_Session
数据.
您可以使用所有可用的设置器方法来更改WC_Order
数据.
The problem here是因为订单已经创建并保存,如果您停止 checkout 过程,如果客户再次下了订单,another order is created and saved in the database...
相关:What is the last hook triggered before an order is created in WooCommerce?