2015-09-22 111 views
5

我在我的WordPress网站上使用联系表格7作为邮件系统。我使用wpcf7_before_send_mail过滤器将所有数据发送到外部Web服务(SOAP)。当我收到该网络服务的“SUCCESS”消息时,所有消息都应该照常继续,但当我收到“FAILED”消息时,联系表单7不应发送电子邮件,并且网站上应显示不同的输出消息。是否可以在函数内改变它?(WordPress的)联系表格7中止在before_send_mail过滤器

<? 

add_filter('wpcf7_load_js', '__return_false'); 
add_filter('wpcf7_load_css', '__return_false'); 

add_action('wpcf7_before_send_mail', 'wpcf7_soap_service'); 


//Pushen via SOAP service naar servers 
function wpcf7_soap_service($contact_form) { 
$submission = WPCF7_Submission::get_instance(); 

if ($submission) { 

/*** POST variabelen ***/  
$posted_data = $submission->get_posted_data(); 

/*** SOAP settings ***/  
ini_set("soap.wsdl_cache_enabled", "0"); 

/*** variabelen opzetten ***/ 
define('BROADCAST_URL','XXX'); 
define('SIM_LOGIN', 'XXX'); 
define('SIM_PASSWORD', 'XXX'); 
define('ENV_KEY', 'XXX'); 

/*** login parameters ***/ 
$params = array(
    'username' => SIM_LOGIN, 
    'password' => SIM_PASSWORD, 
    'environmentKey' => ENV_KEY, 
); 

/*** client opzetten ***/ 
$client = new SoapClient(
    BROADCAST_URL, 
    array(
    'soap_version' => SOAP_1_1 
) 
); 

/*** Parameters ***/ 
$address["box"]   = $posted_data["box"]; 
$address["country"]  = $posted_data["country"]; 
$address["number"]  = $posted_data["streetnumber"]; 
$address["postalcode"] = $posted_data["postalcode"]; 
$address["street"]  = $posted_data["street"]; 
$address["town"]   = $posted_data["town"]; 

$birthdate    = $posted_data["birthdate"] . "T00:00:00"; 
$email     = $posted_data["email"]; 

$firstname    = $posted_data["firstname"]; 
$lastname     = $posted_data["lastname"]; 
$phone     = $posted_data["phone"]; 

/*** STDClass aanmaken met gevraagde data ***/ 
$std = new stdClass(); 

$std->Firstname   = $firstname; 
$std->Lastname   = $lastname; 
$std->Birthdate   = $birthdate; 
$std->Phone    = $phone; 
$std->Email    = $email; 

$std->Address = new stdClass(); 

$std->Address->Street   = $address["street"]; 
$std->Address->Number   = $address["number"]; 
$std->Address->Box   = $address["box"]; 
$std->Address->PostalCode  = $address["postalcode"]; 
$std->Address->Town   = $address["town"]; 
$std->Address->Country  = $address["country"]; 

if(!empty($_FILES['cv'])){ 

    $std->Files = new stdClass(); 

    $std->Files->File["FileName"]  = $_FILES["cv"]["name"]; 
    $std->Files->File["DataFile"]  = base64_encode($_FILES["cv"]["tmp_name"]); 
    $std->Files->File["FileType"]  = "CV"; 
} 

/*** Functie OpenSession ***/ 
try{ 
    $token = $client->OpenSession($params); 
}catch(SoapFault $ex){ 
    // ABORT OVER HERE 
} 

$token    = $token->OpenSessionResult; 

/*** Functie AddApplication ***/ 
try{ 
    $result = $client->AddApplication(array("token" => $token, "application" => $std)); 
}catch(SoapFault $ex){ 
    // ABORT OVER HERE 
} 

if($result->AddApplicationResult->Status == "Success"){ 
    // ABORT OVER HERE 
} 


/*** Functie CloseSession ***/ 
try{ 
    $app = $client->CloseSession($token); 
}catch(SoapFault $ex){ 
    // ABORT OVER HERE 
} 

} 
} 

回答

4

您可以通过使用跳过邮箱:

add_filter('wpcf7_skip_mail', '__return_true'); 

既然你已经禁用与

add_filter('wpcf7_load_js', '__return_false'); 

的JavaScript那么你可以使用:

add_filter('wpcf7_form_response_output', 'wpse_form_response_output', 10, 4); 

内您的wpcf7_before_send_mail行动c allback,你的自定义错误响应是:

function wpse_form_response_output($output, $class, $content, $object) 
{ 
    return sprintf(
     '<div class="wpcf7-response-output wpcf7-display-none wpcf7-mail-sent-ng" 
      role="alert" style="display: block;">%s</div>', 
     __('SOAP ERROR - Mail not sent!') 
    ); 
} 
+0

你错过了函数中的div后面的逗号,但是它的工作原理完美。你介意告诉我你在哪里找到这些信息?我想学习,而不是仅仅复制粘贴。 –

+0

很高兴听到它为你工作,感谢错字更正。当然,我只是通过插件的源代码,我尝试了各种想法,这一个工作,其他人没有。所以在这里工作并没有什么魔力,除了用少量的手工测试劳动花费时间*; @WarreBuysse – birgire

+0

我继续碰到同样的问题,并没有真正理解我猜测的源代码。感谢您的解释。显然,它完美地解决了问题。我会接受你的回答。再次感谢! –