从wordpress

时间:2016-09-15 19:46:23

标签: php ajax wordpress

TL; DR:

is_user_logged_in()admin-ajax使用时始终返回false。

详情

因此,我尝试在客户端上运行脚本,根据用户是否登录显示动态内容。 (这样我可以提供静态缓存页面,并且仍然可以对它进行一些动态控制)。

这个想法是这样的: 使用javascript隐藏/显示某些内容(如建议登录)。 这使我可以利用更好的缓存服务并提供压缩的静态页面,同时仍然可以为登录的用户调整页面内容。 因此,我将使用AJAX向服务器询问我们当前是否已登录,如果是,我们将显示/隐藏相应的内容。 压缩的静态页面将假定我们没有登录,但AJAX将在(超快)页面加载后进行检查并根据需要进行调整。

直接看似......将自定义AJAX函数挂钩到init并回放服务器返回的JSON数据,以便javascript知道我们是否已登录。

唯一的问题是,用于执行此操作的所有wordpress函数都会返回NULL0false

functions.php 额外echo用于调试wordpress操作订单

function check_login_init() {
    add_action('wp_ajax_check_login', 'check_login');
    add_action('wp_ajax_nopriv_check_login', 'check_login');
}
add_action('init', 'check_login_init');
function check_login() {
    echo 'did init action: ' . (did_action( 'init' ) ? 'true' : 'false') . '<br />';
    echo 'did admin_init action: ' . (did_action( 'admin_init' ) ? 'true' : 'false') . '<br />';
    echo 'did set_current_user action: ' . (did_action( 'set_current_user' ) ? 'true' : 'false') . '<br />';
    echo 'did get_footer action: ' . (did_action( 'get_footer' ) ? 'true' : 'false') . '<br />';
    var_dump(wp_get_current_user());
    if (did_action( 'init' )) {
        if (is_user_logged_in()) {
            echo 'true';
        } else if (!is_user_logged_in()) {
            echo get_current_user_id();
        }
    } else {
        echo 'init did not execute, AJAX failed';
    }
    wp_die();
}

遗憾的是,这会返回以下内容:

输出

did init action: true
did admin_init action: true
did set_current_user action: true
did get_footer action: false
object(WP_User)#1917 (7) { ["data"]=> object(stdClass)#1918 (0) { } ["ID"]=> int(0) ["caps"]=> array(0) { } ["cap_key"]=> NULL ["roles"]=> array(0) { } ["allcaps"]=> array(0) { } ["filter"]=> NULL } 0

initadmin_initset_current_user都按预期进行处理,但与经过身份验证的用户相关的所有方法都失败了。

到目前为止我尝试了什么

  • 我已禁用与管理面板和安全相关联的所有插件
  • 我已经注释掉了我自己的相同代码
  • .htaccess重置为Wordpress默认
  • 在函数
  • 中实例化global $current_userglobal $wp
  • 确保服务器和客户端上没有缓存
  • 通过CloudFlare
  • 禁用CDN

1 个答案:

答案 0 :(得分:0)

我也有这个问题,所有的ajax请求虽然好像没有登录,但是一旦wp-config.php设置正确就解决了。如果您使用HTTPS和SSL但是在反向代理后面将其作为HTTP请求转发,您需要执行类似这样的操作才能使其工作:

<?php
# ... Other config here ...
if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  define('WP_SITEURL', 'https://'.$_SERVER['HTTP_HOST']);
  define('WP_HOME',    'https://'.$_SERVER['HTTP_HOST']);
  # Without this WP think it should be on HTTPs, but it's not. Thus it creates a redirect loop
  $_SERVER['HTTPS']='on';
} else {
  define('WP_SITEURL', 'http://'.$_SERVER['HTTP_HOST']);
  define('WP_HOME',    'http://'.$_SERVER['HTTP_HOST']);
}

请注意,必须在反向代理上设置X-Forwarded-Proto标头。