在发送电子邮件之前,我使用联系表单 7 及其
wpcf7_before_send_mail
操作与 API 进行交互。如果 API 返回错误,我希望能够捕获该错误,将其显示为错误并阻止提交表单。
我似乎无法在网上找到我要找的东西。我能做的最好的事情就是使用
mail_sent_ok
消息字符串并显示其中的错误(这显然不是解决方案)。
基本上,最终的解决方案是强制表单提交失败。
还有同样的情况吗?
我不确定您提出问题时是否可能,但 wpcf7_before_send_mail 挂钩有一个中止标志,您只需设置该标志即可避免发送邮件。
例如在伪 PHP 中
add_action('wpcf7_before_send_mail', 'your_function', 10, 3);
function your_function($form, &$abort, $object){
$error = 1;
if($error != 0) {
$abort = true;
$object->set_response("An error happened");
}
}
根据 Louise-Philippe 的回答,我用这段代码解决了,因为 $object 参数恰好总是 null:
add_action('wpcf7_before_send_mail', 'your_function', 10, 3);
function your_function($form, &$abort, $object){
$error = 1;
if($error != 0) {
$abort = true;
$msgs = $form->prop('messages');
$msgs['mail_sent_ng'] = "An error happened"; //<- your custom error message
$form->set_properties(array('messages' => $msgs));
}
}
注意:它不是
mail_sent_ok
而是 mail_sent_ng
,因此您可以将红色边框作为预定义的错误消息。
我不知道是否有人还需要这个。但您可以使用以下内容来完成这项工作。
$submission = WPCF7_Submission::get_instance();
$submission->set_response( 'the message' )
您可以使用此过滤器进行自定义验证:
add_filter("wpcf7_validate", function ($result, $tags) {
$valid = FALSE; // here you can do your API call to calculate the validation
if (!$valid) {
$result->offsetSet(
"reason"
, ["your-name" => "error message for this field"]
);
}
return $result;
}, 10, 2);
your-name
必须是此表单的现有字段的名称。
add_action('wpcf7_before_send_mail', 'your_function', 10, 3);
function your_function($form, &$abort, $object){
$error = 1;
/*if($error != 0) {
$abort = true;
$msgs = $form->prop('messages');
$msgs['mail_sent_ng'] = "An error happened"; //<- your custom error message
$form->set_properties(array('messages' => $msgs));
}*/
//echo "<pre>";
//print_r($_SERVER);
$current_site_ip_country_code = $_SERVER['HTTP_CF_IPCOUNTRY'];
$blocked_countries = array( 'CA', 'UK', 'RU', 'NL', 'CN', 'AC', 'AD', 'AE', 'AF', 'AT', 'BD', 'BR', 'CF', 'CG', 'DK', 'ES','IN' );
if ( in_array( $current_site_ip_country_code, $blocked_countries ) ) {
// echo "here";
// die();
$abort = true;
$msgs = $form->prop('messages');
$msgs['mail_sent_ng'] = "Not Allowed"; //<- your custom error message
$form->set_properties(array('messages' => $msgs));
}
}