Wordpress admin/ajax未检测到用户登录

Wordpress admin/ajax未检测到用户登录,ajax,wordpress,Ajax,Wordpress,我在Wordpress中遇到了一个问题,AJAX调用有时无法检测到用户已登录。在主题的index.php文件的末尾,我有以下代码: <?php $user_id = get_current_user_id(); ?> <script> alert("Logged in as user #<?php echo $user_id; ?>"); </script> 在my functions.php中: add_action('wp_a

我在Wordpress中遇到了一个问题,AJAX调用有时无法检测到用户已登录。在主题的index.php文件的末尾,我有以下代码:

<?php
    $user_id = get_current_user_id();
?>
<script>
    alert("Logged in as user #<?php echo $user_id; ?>");
</script>
在my functions.php中:

add_action('wp_ajax_test_ajax', 'test_ajax');
function test_ajax() {
    $user_id = get_current_user_id();
    echo "Your user id is: ".$user_id; 

    exit();
}
我注意到的是,有时候wp_ajax甚至不会运行,所以它会回显0。所以我添加了nopriv:

add_action('wp_ajax_nopriv_test_ajax', 'test_ajax');
但即使在运行时,它仍会认为用户未登录,get_current_user_id()将返回0

我还尝试了wp_get_current_user();和全局$current_user;,但它们也返回空用户,即没有用户登录



我不确定这里发生了什么,因为index.php中的get_current_user_id()可以工作,但有时admin ajax不这么认为(不是所有时间,有时——我很难弄清楚为什么这是间歇性的…)。但我注意到这是可行的,我也不知道为什么:

  • 登录Wordpress
  • 转到index.php
  • 您将收到第一个表示您已登录的警报,但第二个警报(来自admin ajax) 但事实并非如此
  • 转到/wp管理员。由于您已经登录,因此无需再次登录即可看到仪表板
  • 返回index.php。现在两个警报都正确了

  • 试试这个,让我知道:

    <?php
        add_action('wp_ajax_test_ajax', 'test_ajax');
        function test_ajax() {
    
            global $current_user;
    
            $user_id = get_current_user_id();
            echo "Your user id is: ".$user_id; 
    
            exit();
    
        }
    ?>
    

    尝试在使用ajaxurl之前手动重置它,例如:

    var ajaxurl="http://" + document.domain + "/wp-admin/admin-ajax.php";
    

    我的问题是,当从en.mysite.com访问时,ajaxurl被称为www.mysite.com,这使得他们无法沟通。

    global$current\u user;同时返回0用户:/I我遇到此问题,并发现使用CodeKit的服务器(不同的url/来源)是原因。加载直接/完整本地主机路径解决了问题。您解决了问题吗?我有一个类似的问题:如果去Hompage,所有ajax调用都会给我一个uid 0;如果我转到另一页,uid是正确的;如果我回到主页,uid是正确的。在我的php回调中,我输出$_cookiesuperglobal,当uid为0时,COOKIE不会初始化。如果不是0,cookies将正确初始化(与预期一致)。好的,在我的例子中,这是一个http/https问题(在HttAccess中或通过插件不强制https)。转到,所有链接都是https格式,单击一个链接,再单击一个链接返回主页,一切都很好,因为它现在是https格式的,就像站点的url()。
    var ajaxurl="http://" + document.domain + "/wp-admin/admin-ajax.php";