我是一名WordPress设计师,我为我的一个主题开发了一个联系表单,通过jQuery验证。
请检查下面的代码,然后阅读下面的说明。
$('.submitemail') .click(function() {
//VALIDATION CODE GOES HERE
if ( /*VALIDATED SUCCESSFULLY*/ ) {
$.ajax({
type: 'POST',
url: templatePath+'/lib/scripts/sendEmail.php',
data: 'visitorname=' + visitorname + '&visitoremail=' + visitoremail + '&visitormessage=' + visitormessage,
success: function(contactResults) {
//SUCCESS CODE
}
});
}
});
备注:
问题:
在某些服务器中,当成功传递对sendEmail.php的ajax调用并处理php脚本并发送电子邮件时,不会触发成功处理程序。
当我用firebug检查为什么没有触发成功处理程序时,firebug显示“找不到404错误”,这就像是误报。
可能的原因:
我认为某些服务器配置为阻止此类ajax调用。
这个奇怪的问题可能是什么原因?如何解决?
提前致谢。
@nowk:sendEmail.php代码是:
<?php
// Code for loading WordPress environment goes here //
$themeName_optionTree = get_option('option_tree');
$name = trim($_POST['visitorname']);
$email = $_POST['visitoremail'];
$message = $_POST['visitormessage'];
$site_owners_email = $themeName_optionTree['owner_email'];
$site_owners_name = $themeName_optionTree['owner_name'];
$email_subject = $themeName_optionTree['email_subject'];
$success_message = '<p class="success-box">' . $themeName_optionTree['success_message'] . '</p>';
if (strlen($name) < 2) {
$error['name'] = 1;
}
if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $email)) {
$error['email'] = 1;
}
if (strlen($message) < 2) {
$error['message'] = 1;
}
if (!$error) {
require_once('PHPMailer_v5.1/class.phpmailer.php');
$mail = new PHPMailer(true);
try {
$mail->From = $email;
$mail->FromName = $name;
$mail->Subject = $email_subject;
$mail->AddAddress($site_owners_email, $site_owners_name);
$mail->Body = $message;
$mail->Send();
echo $success_message;
} catch (phpmailerException $e) {
echo '<p class="warning-box">' . $e->errorMessage() . '</p>';
} catch (Exception $e) {
echo '<p class="warning-box">' . $e->getMessage() . '</p>';
}
}
?>
请注意,即使ajax返回404,上面的代码也能完美执行,很奇怪吧!
答案 0 :(得分:28)
由于服务器发送404(上帝知道是什么原因),有两种方法可以解决/规避这个问题:
success
更改为complete
,以便在请求完成时执行处理程序,无论服务器响应如何。您知道服务器响应(它始终有效)。 HTML仍应在jQuery complete
处理程序中可用。header('HTTP/1.1 200 OK')
。由于脚本被执行,这将覆盖疯狂的404,jQuery将接收200并执行success
处理程序。你可以试试两个=)我很确定第一个会起作用(但那不是那么干净)。我也很确定第二个会工作,但我不知道Wordpress是否足以做出承诺=)
答案 1 :(得分:2)
我猜这是因为Wordpress已经内置了一个AJAX机制,它阻止你自己实现它。本页介绍如何将AJAX添加到插件中:
http://codex.wordpress.org/AJAX_in_Plugins
以下是该页面的摘录:
由于Ajax已内置于核心WordPress管理屏幕中,因此向插件添加更多管理端Ajax功能非常简单,本节将介绍如何执行此操作。
这是一个简短的例子。所有这些都将在一个文件中。
首先,添加一些将触发AJAX请求的javascript:
<?php
add_action('admin_print_scripts', 'my_action_javascript');
function my_action_javascript() {
?>
<script type="text/javascript" >
jQuery(document).ready(function($) {
var data = {
action: 'my_action',
whatever: 1234
};
// since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
$.post(ajaxurl, data, function(response) {
alert('Got this from the server: ' + response);
});
});
</script>
<?php
}
然后,设置一个将处理该请求的PHP函数:
<?php
add_action('wp_ajax_my_action', 'my_action_callback');
function my_action_callback() {
global $wpdb; // this is how you get access to the database
$whatever = intval( $_POST['whatever'] );
$whatever += 10;
echo $whatever;
die(); // this is required to return a proper result
}
就是这样!您需要添加一些细节,例如错误检查和验证请求来自正确的位置(使用check_ajax_referer()),但希望上面的示例足以让您开始使用自己的管理端Ajax插件。 注意:从版本2.8开始,可以使用javascript全局变量ajaxurl,以防您想将javascript代码与php文件分离为仅javascript文件。仅在管理方面这是真的。
答案 2 :(得分:2)
如此处https://cooltrainer.org/fixing-false-404-headers-on-external-pages-including-wp-blog-header-php/所示,此解决方案经过测试并运行良好:
require_once("path/to/wp-config.php");
$wp->init();
$wp->parse_request();
$wp->query_posts();
$wp->register_globals();
$wp->send_headers();
答案 3 :(得分:0)
如果不深入研究问题,您可能会检查ajax请求是否实际发生在您认为的位置。这里可能会发生一些事情,例如服务器设置为将任何请求重定向到/ wp-content /其他地方。
使用firebug捕获一些标题信息,也许还有livehttp标题。