我是一名WordPress设计师,我为我的一个主题开发了一个通过jQuery验证的联系表单
请检查下面的代码,然后阅读下面的注释
$('.submitemail')。单击(函数(){
//验证代码在这里
如果(/*验证成功*/){
$.ajax({
键入:“POST”,
url:templatePath+'/lib/scripts/sendmail.php',
数据:“visitorname=”+visitorname+”&;visitoremail=”+visitoremail+”&;visitormessage=”+visitormessage,
成功:功能(contactResults){
//成功代码
}
});
}
});
注意事项:
- php是使用PHPmailer类发送电子邮件的正确脚本
- templatePath变量的值为完整模板路径,如下所示:http://somedomain.com/wp-content/themes/themename
- 上面的jQuery代码位于lib/scripts/jfunctions.js(与php脚本的目录相同)中
- 整个过程(ajax和php)在许多服务器上都能像预期的那样完美地工作(由我在两台服务器上测试,由我的主题用户在其他服务器上测试)
问题:
在某些服务器中,当对sendmail.php的ajax调用实际成功传递并且处理php脚本并发送电子邮件时,不会触发成功处理程序
当我检查firebug以了解为什么没有触发成功处理程序时,firebug显示“not found 404 error”,这就像一个假警报
可能的原因:
我认为有些服务器配置为阻止这种ajax调用
这个奇怪问题的原因可能是什么?如何修复它
提前谢谢
@nowk:sendmail.php代码是:
<;?php
//加载WordPress环境的代码如下//
$themeName_optionTree=get_option('option_tree');
$name=trim($_POST['visitorname']);
$email=$_POST['visitoremail'];
$message=$_POST['visitormessage'];
$site_owner_email=$themeName_optionTree['owner_email'];
$site_owners_name=$themeName_optionTree['owner_name'];
$email_subject=$themeName_optionTree['email_subject'];
$success_message='<;p class=“成功框”>;”$themeName_optionTree['success_message'.]</p>;';
如果(strlen($name)<;2){
$error['name']=1;
}
如果(!preg\u match('/^[a-z0-9&;\'.-\+][email protected][a-z0-9\-]+.([a-z0-9\-]+.*+[a-z]{2}/is',$email)){
$error['email']=1;
}
如果(strlen($message)<;2){
$error['message']=1;
}
如果(!$error){
需要一次('PHPMailer_v5.1/class.PHPMailer.php');
$mail=新的PHPMailer(true);
试一试{
$mail->;发件人=$email;
$mail->;FromName=$name;
$mail->;主题=$email\u主题;
$mail->;AddAddress($site\u owner\u email,$site\u owner\u name);
$mail->;正文=$message;
$mail->;发送();
回显$success_消息;
}捕获(phpmailerException$e){
echo“<;p class=“warning box”>;”.$e->;errorMessage()。<;/p>;”;
}捕获(例外$e){
echo“<;p class=“warning box”>;”.$e->;getMessage()。<;/p>;”;
}
}
?>;
请注意,上面的代码即使在ajax返回404时也能完美执行,奇怪吧
由于服务器发送404(天知道是什么原因),因此有两种方法可以修复/规避此问题:
- 忽略HTTP响应代码,并在jQueryAjax调用中将
success
更改为complete
,以便在完成请求时执行处理程序,而不管服务器响应如何。您知道服务器响应(它总是有效的)。HTML应该仍然可以在jQuerycomplete
处理程序中使用 - 通过执行(在打印任何输出之前)覆盖服务器上发送的404(可能是Wordpress的内容):
头('HTTP/1.1 200 OK')
。由于脚本被执行,这将覆盖疯狂404,jQuery将收到200并执行success
处理程序
你可以两个都试试=)我很确定第一个能用(但那不是很干净)。我也很确定第二个会起作用,但我对Wordpress了解不够,无法做出承诺=)