Intereting Posts
Как хранить посещенные страницы? Супер медленная панель администратора Детская тема на основе набора инструментов не найдена Запрос с поиском и только подписчиками Получает ли кеш-лист WordPress get_user_meta ()? Прикрепленное сообщение появляется дважды Измените количество сообщений по умолчанию для показа на мобильной версии Платный членский интерфейс Pro Rest API Как добавить элемент управления фонового изображения в элементы управления администратором страницы? Проверка подлинности API REST для плагина Как получить собственный URL-адрес изображения определенного размера Сложный диапазон дат с WP_Query и МЕЖДУ Дублируйте (или более) настраиваемые поля во многих сообщениях. Есть ли простой способ их очистки? Пользовательские постоянные ссылки с Галерея NextGEN Как использовать wp_enqueue_style () и wp_enqueue_script () только при необходимости?

Почему возникает странное расхождение между get_current_user_id () при использовании AJAX по сравнению с выходом document.cookie?

Я разрабатываю простую функцию Ajax как часть плагина, предназначенного для использования в традиционной панели управления WP Admin, но встречаю несоответствие в отношении состояния cookie входа.

Проблема, версия TL; DR

Вывод моих вызовов Ajax всегда выполняется в контексте пользователя, который выходил из системы. В частности, get_current_user_id() возвращает 0 для всех инициированных Ajax вызовов, несмотря на то, что var_dump(get_current_user_id()) стороне var_dump(get_current_user_id()) возвращает правильный идентификационный номер входа в систему на выходе самой страницы.

Проверка document.cookie похоже, подтверждает отсутствие cookie для входа на стороне JS, но var_dump($_COOKIE) показывает правильное присутствие в cookie- var_dump($_COOKIE) входа в систему.

Чтобы добавить к странности, веб-панель Firefox показывает полный файл cookie вместе со значением входа, который отправляется в WordPress из вызова Ajax.

Что дает?

Код и контекст

Когда загружается определенная страница панели управления WP, мой JS просто обменивается WP-API (v2) на комментарии к данному сообщению. Метод опроса выглядит следующим образом:

 /** * Checks for any new comments. */ var pollForNewComments = function () { var url = api_base + '/comments&post=' + getPostId() + '&offset=' + getCommentCount(); console.log(document.cookie); jQuery.get(url, function (response) { if (response.length) { appendComments(response); showNewCommentsNotice(); } }); }; 

Обратите внимание на вызов console.log(document.cookie) . Когда этот метод запускается, вывод журнала консоли показывает этот вывод:

 wordpress_test_cookie=WP+Cookie+check; wp-settings-time-10=1456479389; popunder=yes; popundr=yes; setover18=1 

Обратите внимание, что cookie для входа не существует.

Тем не менее, для одного и того же вызова в сетевой панели Firefox показано, что файл cookie для входа существует в заголовках HTTP-запроса:

Скриншот Firefox Network Panel показывает cookie для входа в систему, хотя ранее вызов console.log () не был ???

Чтобы проверить, что cookie для входа в систему принимается WordPress, я var_dump(get_current_user_id()); var_dump($_COOKIE); exit(); тривиальный var_dump(get_current_user_id()); var_dump($_COOKIE); exit(); var_dump(get_current_user_id()); var_dump($_COOKIE); exit(); в моем модуле плагина, а вывод для вызова Ajax подтверждает, что, несмотря на присутствие в cookie входа в систему, WordPress считает, что пользователя не зарегистрировано:

 int(0) array(3) { ["wordpress_test_cookie"]=> string(15) "WP Cookie check" ["wordpress_logged_in_9416a7b43bd88dae58cf6c88b9f89f3f"]=> string(130) "athirduser|1456650402|a23GIhs43jJ651dKkCEKfX6EKjfnTCpT76k6Hgvznls|5da91c9c365cf214c486b0a32333a78fb6394385e5bcad619666511330322bda" ["wp-settings-time-10"]=> string(10) "1456479389" } 

Результат вызовов не-Ajax правильно возвращается, показывая как файл cookie для входа, так и верный идентификатор пользователя.

Почему здесь возникает несоответствие между Ajax и non-Ajax? Почему разница между console.log(document.cookie) и тем, что Firefox показывает в своем сетевом инспекторе?

Это односерверная настройка, локальная среда разработки, а не междоменный запрос.

Благодарю.

Solutions Collecting From Web of "Почему возникает странное расхождение между get_current_user_id () при использовании AJAX по сравнению с выходом document.cookie?"

Я должен был проследить через ядро ​​WordPress и код плагина REST API, чтобы исправить это, но, наконец, сделал это. Решение описано здесь .

TL; DR решения состоит в том, что WP-API будет игнорировать содержимое файла cookie для входа и принять запрос неавторизованного (выведенного из системы), если только в параметре _wpnonce HTTP GET (в строке запроса) не указано правильное значение или в HTTP_X_WP_NONCE HTTP-заголовок. В моем JavaScript это неверно. Исправленный JavaScript-метод выглядит следующим образом:

 /** * Checks for any new comments. */ var pollForNewComments = function () { var url = api_base + '/comments&post=' + getPostId() + '&offset=' + getCommentCount() + '&_wpnonce=' + wpApiSettings.nonce; jQuery.get(url, function (response) { if (response.length) { appendComments(response); showNewCommentsNotice(); } }); }; 

Обратите внимание, что добавление параметра _wpnonce в строку запроса с глобальной переменной JavaScript wpApiSettings.nonce (которая добавляется плагином API REST) ​​устраняет эту проблему для меня.