В WordPress, начиная с версии 2.6, встроена поддержка HTTPS: можно сделать либо HTTPS-логин, либо поместить панель администратора за SSL. Однако, из-за особенностей реализации, когда пользователь входит в систему, он получает cookie либо для HTTP, либо для HTTPS. Иными словами, если пользователь попал на http://example.com/wp-admin/
, то при переходе на https://example.com/wp-admin/
ему придётся входить в систему еще раз.
Всё бы ничего, но если плагин делает POST на HTTPS, то пользователь попадает на wp-login.php, который после успешного входа сделает перенаправление (GET) на URL, который ожидает принять POST. При этом если POST шёл на https://example.com/wp-admin/admin.php?page=somepage&noheader=1
, то пользователь увидит безобразную страницу.
К счастью, есть простое решение. Как известно, аутентификационные cookies устанавливает процедура wp_set_auth_cookie
. Перед их установкой она генерирует событие set_auth_cookie
, которому передаются следующие параметры:
$auth_cookie
— значение для cookie, сгенерированное процедуройwp_generate_auth_cookie()
;$expire
— 0, если пользователь не выбрал "Запомнить меня", не 0 в противном случае;$expiration
— срок жизни cookie;$user_id
— ID пользователя (из таблицыwp_users
);$scheme
— схема аутентификации:secure_auth
для SSL,auth
для HTTP.
Использовать эти данные можно следующим образом:
* set_auth_cookie action hook
*
* @param string $auth_cookie Value generated by wp_generate_auth_cookie()
* @param int $expire 0, if Remember Me is not checked
* @param int $expiration Cookie expiration date
* @param int $user_id ID of the logged in usger
* @param string $scheme Authentication scheme (secure_auth or auth)
*/
function sj_set_auth_cookie($auth_cookie, $expire, $expiration, $user_id, $scheme)
{
static $was_here = false;
if (false === $was_here) {
$was_here = true;
if ('secure_auth' == $scheme) {
wp_set_auth_cookie($user_id, 0 != $expire, false);
}
elseif ('auth' == $scheme) {
wp_set_auth_cookie($user_id, 0 != $expire, true);
}
else {
$was_here = false;
}
}
}
add_action('set_auth_cookie', 'sj_set_auth_cookie', -100, 5);
интересное решение. но для тех, кто не программер. куда этот кусок кода надо вставить чтобы все заработало?
как я понимаю, тогда можно будет админу логиниться и работать по https:// да?
Если я правильно понимаю Ваши намерения, то Вам нужно добавить
define('FORCE_SSL_LOGIN', false);
в
wp-config.php
.