TL; DR:
is_user_logged_in()
在admin-ajax
使用时始终返回false。
详情
因此,我尝试在客户端上运行脚本,根据用户是否登录显示动态内容。 (这样我可以提供静态缓存页面,并且仍然可以对它进行一些动态控制)。
这个想法是这样的: 使用javascript隐藏/显示某些内容(如建议登录)。 这使我可以利用更好的缓存服务并提供压缩的静态页面,同时仍然可以为登录的用户调整页面内容。 因此,我将使用AJAX向服务器询问我们当前是否已登录,如果是,我们将显示/隐藏相应的内容。 压缩的静态页面将假定我们没有登录,但AJAX将在(超快)页面加载后进行检查并根据需要进行调整。
直接看似......将自定义AJAX函数挂钩到init
并回放服务器返回的JSON数据,以便javascript知道我们是否已登录。
唯一的问题是,用于执行此操作的所有wordpress函数都会返回NULL
,0
或false
。
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
init
,admin_init
和set_current_user
都按预期进行处理,但与经过身份验证的用户相关的所有方法都失败了。
到目前为止我尝试了什么
.htaccess
重置为Wordpress默认global $current_user
和global $wp
答案 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
标头。