Вот моя проблема, у меня установлена контактная форма 7 для wordpress, и во время wpcf7_before_send_mail я делаю вызов API, мне нужно аннулировать форму, если API возвращает ошибку, тогда мне нужно аннулировать запрос и вернуть ошибку, возвращенную из вызов API.
При сбое API я установил флаг false, и сообщение об ошибке также сохраняется, но моя форма проходит успешно, несмотря на ошибку, которую я вызываю.
add_action("wpcf7_before_send_mail", "wpcf7_send_contact_builder");
function wpcf7_send_contact_builder($form) {
$submission = WPCF7_Submission::get_instance();
$wpcf7_data = $submission->get_posted_data();
... api call and set $success to true if ok and false if not ...
if (!$success) {
$form->status = 'validation_failed (statuscode:' . $xml->status->statuscode[0] . ').';
$form->valid = false;
$form->response = $xml->status->statusdesc[0];
return $forml
}
}
Я также пытался использовать:
$form->invalidate('validation_failed (statuscode:' . $xml->status->statuscode[0] . ').', $xml->status->statusdesc[0]);
Но каким бы способом я не смог предотвратить отправку письма об успешной отправке, и форма была подтверждена как успешная. Отладка показала, что! Success в операторе if работает, и содержащийся код добавляется в переменную. Я также попытался, как будто форма была массивом ($ form [‘valid’] = false), но это также не сработало, и форма представляется как успешная. Есть идеи о том, что мне здесь не хватает? Я опустил код для самого вызова API и определения правильного идентификатора формы, оба они работают правильно, только форма, которую я ищу, анализируется, и вызов API возвращает ожидаемые данные.
Мне нужно было то же самое. Изучив файлы плагинов CF7, я нашел следующее решение:
//To make it working, we must need at least CF7-v5.0;
add_action( 'wpcf7_before_send_mail', 'cf7_validate_api', 15, 3 );
function cf7_validate_api($cf7, &$abort, $submission){
if ( $cf7->id() !== 789 ) //CF7 post-id from admin settings;
return;
$errMsg = '';
//$submission = WPCF7_Submission::get_instance();
$postedData = $submission->get_posted_data();
//$postedData['more-data'] = 'something';
unset($postedData['not-sending-data']);
//-----API posting------
$url = "http://my-web.com/wp-admin/admin-ajax.php?action=get-something";
$username = 'apiUserName';
$password = 'apiUserPass';
$args = [
'headers' => [
'Authorization' => "Basic ".base64_encode( $username . ':' . $password ),
'Accept' => 'application/json; charset=utf-8', // The API returns JSON
//'Content-Type' => 'application/json; charset=utf-8'
],
'body' => $postedData
];
$response = wp_remote_post( $url, $args );
//------------------
if( is_wp_error( $response ) ){
$error_message = $response->get_error_message();
$errMsg = "Something went wrong:\n{$error_message}";
} else {
$response_body = wp_remote_retrieve_body( $response );
$data = json_decode( $response_body );
if( empty($data) || $data->status==0 ){ //API validation error!
$errMsg = $data->msg->title."\n".$data->msg->description;
}
}
if( $errMsg ){ //do not send mail;
//$cf7->skip_mail = true; //for older versions!
$abort = true; //==> Here, it is with 'called by reference' since CF7-v5.0 :)
$submission->set_status( 'validation_failed' );
//$submission->set_response( $cf7->message( 'validation_error' ) ); //msg from admin settings;
$submission->set_response( $cf7->filter_message($errMsg) ); //custom msg;
}
}
Надеюсь, это кому-нибудь поможет. Удачного кодирования 🙂
Других решений пока нет …