如何将Ajax添加到WordPress主题

8
我有一个问题,已经卡了好几天了... 我正在尝试使用一个简单的ajaxPOST函数将数据发送到MySQL数据库(而不是WP数据库)。
这段代码位于主题中的“single-post.php”中,因为它必须在每篇文章之前进行检查。
$.ajax({ url: 'library/functions/admin_checkuser.php',
     data: {action: userID},
     type: 'post',
     success: function(output) {
                  alert(output);
     }
});

我将简单地向“admin_checkuser.php”脚本发送一个变量,该脚本会调用另一个脚本以对数据库执行操作。
以下是“admin_checkuser”的代码:
$userid = $_POST['action'];

echo $userid;//for testing
$oMySQL = new MySQL();
$query = "Select * FROM videotable WHERE uid = '$userid'";
$oMySQL->ExecuteSQL($query);
$bb = $oMySQL->iRecords;
$aa = $oMySQL->aResult;
echo $bb;

if ($bb == 0){
$query = "INSERT INTO videotable VALUES ('','$userid','true')";
$oMySQL->ExecuteSQL($query);
echo 'true';
    exit();

}else{
$sharing = mysql_result($aa,0,"share");
echo $sharing;
exit();

}

但我认为这些调用并没有到达脚本。

这些脚本在WordPress之外进行了测试,并且确实有效,因此必须是WordPress中阻止ajax调用的某些东西。

顺便说一句,我尝试将“admin_checkuser.php”放在许多不同的文件夹中,但什么都没用。

提前致谢。


1
使用类似Firebug的网络选项卡或HTTPFox等工具,查看是否发生了Ajax调用 - 或者观察您服务器的访问日志。 - Marc B
2个回答

28

你最好使用内置的 WordPress AJAX 请求。

在你的主题的functions.php文件中,添加要调用的函数,例如:

function checkUser() {

    $userid = $_POST['user']; //validation also :)
    $oMySQL = new MySQL();
    $query = "Select * FROM videotable WHERE uid = '$userid'";
    $oMySQL->ExecuteSQL($query);
    $bb = $oMySQL->iRecords;
    $aa = $oMySQL->aResult;
    echo $bb;

    if ($bb == 0){
    $query = "INSERT INTO videotable VALUES ('','$userid','true')";
    $oMySQL->ExecuteSQL($query);
    echo 'true';
        exit();

    } else {
    $sharing = mysql_result($aa,0,"share");
    echo $sharing;
    exit();

    }
}

接下来,你需要使用连接到内置AJAX系统的钩子。

add_action('wp_ajax_check_user', 'checkUser');
add_action('wp_ajax_nopriv_check_user', 'checkUser');

wp_ajax_nopriv_%s 允许从前端调用。

然后,在您的 JavaScript 文件中,只需触发您的 Ajax 请求。

$.post(ajaxurl, { action: 'check_user', user: userId }, function(output) {
     alert(output);
 });

如果 ajaxurl 未定义,您需要在模板文件中创建它,类似以下代码应该可以工作,但还有其他方法。

add_action('wp_head','ajaxurl');
function ajaxurl() {
?>
<script type="text/javascript">
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
</script>
<?php
}

WordPress的后端会完成其余工作。

它接收 AJAX 请求发送的操作,查找相应的`wp_ajax(_nopriv)_%s`钩子,然后调用分配给钩子的函数。

它还将传递`$_POST`或`$_GET`,取决于 AJAX 请求的类型。

您可以在插件中使用AJAX中了解更多信息。


我不得不更改最后一部分以定义ajaxurl:`function ajaxurl() { echo '<script type="text/javascript"> var ajaxurl = "'.admin_url("admin-ajax.php").'"; </script>'; }add_action('wp_head','ajaxurl');` - aleXela
"wp_ajax_nopriv_%s" 允许从前端调用它。 - Francisco Corrales Morales
如果我想使用$wpdb怎么办?为什么你没有使用它? - Francisco Corrales Morales
@FranciscoCorrales 我只是将他现有的代码复制粘贴到示例中,显然可以使用 wpdb 对象进行改进,并保持更多的 wordpress 风格。 - Stoosh
谢谢。所以,我不需要导入任何东西吗?在functions.php中,我可以使用所有美妙的$wpdb函数吗? - Francisco Corrales Morales
显示剩余5条评论

3

您应该检查ajax调用的URL。

可以使用完整的URL而不是相对URL。

可能是因为您的主题位置使URL不正确。我假设您的ajax代码在您的主题文件夹中。

有一些WordPress函数可以获取主题目录。

例如,如果您在此页面 http://yourwebpage/test/,则ajax调用将转到此处 http://yourwebpage/test/library/functions/admin_checkuser.php。我想这将是错误的位置。

这就是为什么您需要向脚本添加绝对URL。如果它在您的主题中,您可以使用这种方法get_template_directory_uri()来获取模板目录。

请参见这里:http://codex.wordpress.org/Function_Reference/get_template_directory_uri


非常感谢!我在这上面浪费了很多时间。 - user1108310

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接