WooCommerce结账页面错误通知自定义位置问题求助
解决WooCommerce结账错误通知排序问题
你的问题根源在于没有利用woocommerce_after_checkout_validation钩子提供的$errors参数,而是直接调用wc_add_notice添加通知。默认情况下,WooCommerce会在woocommerce_after_checkout_validation钩子执行完成后,统一将$errors对象中的错误转换成通知添加到队列中。而你的代码直接提前添加了通知,所以会排在所有默认错误的前面。
针对WooCommerce 3.3.5版本,这里有两种可靠的解决办法:
方法1:使用$errors对象添加错误(推荐)
这种方法完全贴合WooCommerce的原生验证流程,能确保你的错误通知排在默认错误的末尾(因为我们设置了更高的优先级)。
修改你的代码如下:
add_action('woocommerce_after_checkout_validation', 'validate_checkout_email_opt', 999, 2); function validate_checkout_email_opt($posted_data, $errors) { // 检查字段是否被勾选 if (!isset($posted_data['terms_emails']) || !$posted_data['terms_emails']) { // 将错误添加到$errors对象,而不是直接调用wc_add_notice $errors->add( 'terms_emails_error', __('Bitte stimme zu, dass du den Hinweis zu unseren E-Mail- und SMS-Benachrichtigungen gelesen hast.') ); } }
为什么这有效?
- 我们给钩子传递了第二个参数
$errors(通过add_action的第四个参数2指定接收2个参数) - 优先级设为
999,确保你的验证在所有默认验证(通常优先级为10)之后执行,所以你的错误会被添加到$errors对象的最后 - WooCommerce最后会统一将
$errors中的所有错误转换成通知,按添加顺序输出,因此你的通知会排在错误列表的末尾
方法2:用过滤器重新排序通知(备选)
如果因为某些原因无法使用方法1,你可以通过woocommerce_get_notices过滤器直接调整通知队列的顺序,把你的错误移到末尾:
// 保留你原来的添加通知代码 add_action('woocommerce_after_checkout_validation', 'validate_checkout_email_opt', 999); function validate_checkout_email_opt() { if (!$_POST['terms_emails']) { wc_add_notice(__('Bitte stimme zu, dass du den Hinweis zu unseren E-Mail- und SMS-Benachrichtigungen gelesen hast.'), 'error'); } } // 添加过滤器调整通知顺序 add_filter('woocommerce_get_notices', 'reorder_checkout_email_opt_notice', 10, 1); function reorder_checkout_email_opt_notice($notices) { // 只处理错误通知 if (!isset($notices['error']) || empty($notices['error'])) { return $notices; } $target_text = __('Bitte stimme zu, dass du den Hinweis zu unseren E-Mail- und SMS-Benachrichtigungen gelesen hast.'); $target_notice = null; $new_errors = []; // 遍历错误通知,分离目标通知和其他通知 foreach ($notices['error'] as $notice) { if ($notice['notice'] === $target_text) { $target_notice = $notice; } else { $new_errors[] = $notice; } } // 如果找到目标通知,把它放到数组末尾 if ($target_notice) { $new_errors[] = $target_notice; $notices['error'] = $new_errors; } return $notices; }
为什么这有效?
woocommerce_get_notices过滤器会在WooCommerce输出通知前触发,允许你修改通知队列- 我们遍历错误列表,找到你的目标通知,把它从原队列中移除,再添加到队列末尾
两种方法都能解决你的问题,方法1更符合WooCommerce的设计规范,推荐优先使用。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

