Как использовать bloginfo() и get_template_directory_uri() с SSL?
У меня есть тема WordPress, которую я пытаюсь использовать на сайте с исключительно SSL-защитой. Не-SSL версии сайта не существует.
Тема WordPress использует различные функции, такие как bloginfo('pingback_url'), bloginfo('template_directory'), get_template_directory_uri() и другие стандартные функции темы.
Все эти функции генерируют ссылки с http, а не https, поэтому ничего не загружается, так как не-SSL версия сайта отсутствует.
Как заставить WordPress использовать https для ВСЕГО?
Попробуйте установить этот плагин для WordPress. http://wordpress.org/extend/plugins/wordpress-https/installation/, но обязательно прочитайте инструкцию по установке, так как после активации плагина потребуется выполнить дополнительные действия.
Если ваш сайт использует балансировку нагрузки с обработкой SSL, то ваш сервер может не получать ничего в переменной $_SERVER['HTTPS'], а $_SERVER['SERVER_PORT'] может быть 80, когда должен быть 443 (подробнее см. ответ на Stack Overflow).
Если это ваш случай, и вы не можете добиться изменений у хостинг-провайдера, то можно обойти проблему, принудительно указав PHP, что используется SSL. Установите URL-адреса сайта и домашней страницы с https, чтобы все URL-адреса, генерируемые WordPress, использовали https. Затем добавьте этот код в плагин (готовый вариант здесь — поместите его в папку плагинов и активируйте):
// если сайт настроен на работу с SSL, принудительно включаем определение SSL!
if (stripos(get_option('siteurl'), 'https://') === 0) {
$_SERVER['HTTPS'] = 'on';
}
Примечание: это может иметь обратный эффект, так как у вас, вероятно, есть код (в плагинах или вашем собственном), который проверяет, загружена ли страница через SSL, и перенаправляет, если это не так. Теперь сервер не сможет это проверить! Поэтому также добавьте JavaScript на страницу, чтобы обеспечить хотя бы базовую проверку загрузки защищённых страниц через SSL (это также реализовано в готовом плагине):
<script>
if (document.location.protocol != "https:") {
document.location = document.URL.replace(/^http:/i, "https:");
}
</script>
Примечание: это не абсолютно надёжно! Однако метод перехватывает большинство ситуаций, за исключением случаев, когда пользователь отключает JavaScript и вручную изменяет URL на http. Если кто-то так поступит, возможно, он заслуживает, чтобы данные его кредитной карты оказались в Эльбонии.
Я хотел бы добавить к этому. У меня была похожая проблема, когда URL отображался как HTTPS, но WordPress показывал URL скриптов и стилей с HTTP, а не HTTPS (из-за чего они не загружались, так как браузеры не разрешают смешивать HTTP и HTTPS). Причина этой проблемы заключалась в том, что я использую Flexible SSL от CloudFlare, и соединение между пользователем и CloudFlare защищено, но соединение между CloudFlare и веб-сервером — нет (поэтому WordPress считает, что HTTPS отключен). Установка значения $_SERVER['HTTPS'] в on решает эту проблему.
SameOldNick
В качестве дополнительного замечания: я установил инструмент командной строки wp с сайта http://www.electrictoolbox.com/wordpress-enable-disable-plugins-command-line/ для включения плагина.
BTR Naidu