有没有办法使用WooCommerce_Checkout_Process操作来阻止下订单继续进行?

如果WooCommerce_CHECKOUT_PROCESS是一个筛选器,则返回类似于FALSE的内容可能会停止该进程,但由于这是一个操作,因此返回任何内容都将被忽略.

在运行WooCommerce_Checkout_Process操作后,我希望:

  1. 判断购物车中的所有物品,并
  2. 判断客户填写的所有字段(姓名、地址、电话等),以及
  3. 如果不满足某些标准,则向客户发送错误消息,告知他们在完成标准XYZ之前无法下单.

是否可以在WooCommerce变量中进行设置,以阻止订单继续执行WooCommerce_CHECKOUT_PROCESS操作?

另外,在此操作过程中,我如何获取当前订单项目和客户信息?

谢谢

推荐答案

要停止 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 过程,并显示错误通知.


  1. 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?

Php相关问答推荐

Laravel迁移返回SQL错误,但SQL有效且工作正常

PHP如何将ARRAY_MAP与Reset()配合使用

PHP中冒号的奇怪用例

WooCommerce我的帐户:从帖子作者处获取自定义帖子类型帖子ID

为什么在我的PHP联系人脚本中开机自检后出现未定义变量错误?

Symfony5:如何在不登录的情况下使API路由可访问?

Chillerlan/php-iOS名称字段的QR vCard错误

是否使用联系人表单7 wpcf7_Feedback_Response输出答复中的html?

Font Awesome 加载图标未显示在 WooCommerce 管理员列表中

服务器升级到新的mysql版本8.0.34后查询错误

在 Woocommerce 邮箱订单中显示产品 GTIN

如何在 PHP 中对具有相同数组值的值求和

我需要一个正则表达式模式来获取在不包含特定字符串后面的模式中的文本

在WooCommerce我的账户单个订单页面中添加订单商品部分和按钮

Xdebug 不会在断点处停止

正则表达式抓取递归括号的内容

如何将子查询结果添加到学说 2 中主查询的末尾?

如何为多个表的id列设置不同的值

一个php应用程序可以实例化多个RNG吗

根据数组中的文本文件编号显示星级