Переключение WordPress на HTTPS

WordPress

Рано или поздно у владельцев или разработчиков сайтов возникает необходимость перевести сайт с обычного HTTP на безопасное HTTPS соединение. Во многих CMS или фреймворках это делается достаточно просто, но для владельцев сайта на базе CMS WordPress это может стать нетривиальной задачей.

Все дело в том, что адрес сайта(URL) в WordPress хранится в базе данных сайта и, кроме того, многие ссылки в постах также сохраняются в базе данных не в относительном виде типа /blog/archive/post123, а в абсолютном с указанием протокола, н-р http://www.domain.com/blog/archive/post123. Получается просто поменять адрес сайта с http://www.domain.com на https://www.domain.com недостаточно, нужно еще поменять все ссылки на сайте. Можно, конечно, зайти в админку и пройтись по всем постам, виджетам, темам, плагинам и вручную поменять ссылки, но это займет очень много времени в зависимости от количества матералов.

Таким образом для перехода на HTTPS в WordPress не обойтись без редактирования базы данных(впрочем есть плагины типа Force HTTPS, но практика показывает, что не все ссылки он фиксит). Можно скачать дамп базы и поправить ссылки в нем и импортировать обратно, можно выполнить нужные SQL-запросы в базе прямо на сервере/хостинге используя консоль или какой-нибудь PhpMyAdmin, кому как удобно.

Isabel Castillo прекрасно расписала какие SQL-запросы нужно выполнить и почему в своей статье https://isabelcastillo.com/mysql-wordpress-http-to-https. Цитировать или повторять статью я не буду, рекомендую просто воспользоваться ей как пошаговым руководством. От себя хочу добавить лишь, что в SQL-запросах, когда будете подставлять адрес своего сайта, то не забудьте продублировать запросы с/без www в зависимости от того, какой основной домен вашего сайта. Просто в базе могут попадаться ссылки как с www, так и без www, такое вполне могло случиться, когда вы редактировали материал и просто не указали www в ссылке или наоборот добавили.

Итоговый список SQL-запросов у меня получился таким:

1) UPDATE ‘wp_posts’ SET post_content = REPLACE(post_content, ‘src=»http://www.domain.com’, ‘src=»https://www.domain.com’) WHERE post_content LIKE ‘%src=»http://www.domain.com%’;
2) UPDATE ‘wp_posts’ SET post_content = REPLACE(post_content, ‘src=»http://domain.com’, ‘src=»https://domain.com’) WHERE post_content LIKE ‘%src=»http://domain.com%’;
3) UPDATE ‘wp_posts’ SET post_content = REPLACE(post_content, «src=’http://www.domain.com», «src=’https://www.domain.com») WHERE post_content LIKE «%src=’http://www.domain.com%»;
4) UPDATE ‘wp_posts’ SET post_content = REPLACE(post_content, «src=’http://domain.com», «src=’https://domain.com») WHERE post_content LIKE «%src=’http://domain.com%»;
5) UPDATE ‘wp_posts’ SET post_content = REPLACE(post_content, ‘href=»http://www.domain.com’, ‘href=»https://www.domain.com’) WHERE post_content LIKE ‘%href=»http://www.domain.com%’;
6) UPDATE ‘wp_posts’ SET post_content = REPLACE(post_content, ‘href=»http://domain.com’, ‘href=»https://domain.com’) WHERE post_content LIKE ‘%href=»http://domain.com%’;
7) UPDATE ‘wp_posts’ SET post_content = REPLACE(post_content, «href=’http://www.domain.com», «href=’https://www.domain.com») WHERE post_content LIKE «%href=’http://www.domain.com%»;
8) UPDATE ‘wp_posts’ SET post_content = REPLACE(post_content, «href=’http://domain.com», «href=’https://domain.com») WHERE post_content LIKE «%href=’http://domain.com%»;
9) UPDATE ‘wp_posts’ SET pinged = REPLACE(pinged, ‘http://www.domain.com’, ‘https://www.domain.com’) WHERE pinged LIKE ‘%http://www.domain.com%’;
10) UPDATE ‘wp_posts’ SET pinged = REPLACE(pinged, ‘http://domain.com’, ‘https://domain.com’) WHERE pinged LIKE ‘%http://domain.com%’;
11) UPDATE ‘wp_comments’ SET comment_author_url = REPLACE(comment_author_url, ‘http://www.domain.com’, ‘https://www.domain.com’) WHERE comment_author_url LIKE ‘%http://www.domain.com%’;
12) UPDATE ‘wp_comments’ SET comment_author_url = REPLACE(comment_author_url, ‘http://domain.com’, ‘https://domain.com’) WHERE comment_author_url LIKE ‘%http://domain.com%’;
13) UPDATE ‘wp_comments’ SET comment_content = REPLACE(comment_content, ‘http://www.domain.com’, ‘https://www.domain.com’) WHERE comment_content LIKE ‘%http://www.domain.com%’;
14) UPDATE ‘wp_comments’ SET comment_content = REPLACE(comment_content, ‘http://domain.com’, ‘https://domain.com’) WHERE comment_content LIKE ‘%http://domain.com%’;
15) UPDATE ‘wp_postmeta’ SET ‘meta_value’ = REPLACE(meta_value, ‘http://www.domain.com’, ‘https://www.domain.com’) WHERE meta_value LIKE ‘%http://www.domain.com%’;
16) UPDATE ‘wp_postmeta’ SET ‘meta_value’ = REPLACE(meta_value, ‘http://domain.com’, ‘https://domain.com’) WHERE meta_value LIKE ‘%http://domain.com%’;
17) UPDATE ‘wp_options’ SET ‘option_value’ = «https://www.domain.com» WHERE ‘wp_options’.’option_name’ = ‘siteurl’;
18) UPDATE ‘wp_options’ SET ‘option_value’ = «https://www.domain.com» WHERE ‘wp_options’.’option_name’ = ‘home’;

Замените «domain.com» на адрес вашего сайта, а «site_db_name» на имя вашей базы данных. Кстати, последние 2 запроса 17-й и 18-й также подправьте с учетом наличия/отсутствия www, а еще лучше вместо этих 2-х запросов зайдите в админку вашего сайта и поменяйте адрес сайта в настроках, тот же самый результат, но нагляднее.

И еще один важный момент. Приведенный список — это минимальный список запросов для замены ссылок, но вполне достаточный для перехода на HTTPS. Но ни в коем случае не делайте в дампе базы просто поиск и замену ссылки, в противном случае часть работоспособности сайта утратится. Дело в том, что в таблице wp_options система и некоторые плагины могут хранить настройки в сериализованном виде, к примеру, option_value может выглядеть так:

a:3:{i:0;s:8:»post_url»;i:2;s:42:»http://www.domain.com/blog/archive/post123″;i:3;s:0:»»;}

, и если просто поменять там http на https, то что-то скорее всего перестанет работать на сайте. Кто знаком с сериализованными данными, тот поймет сразу в чем дело, для других поясню — в этой строке данные записаны вместе с информацией об их длине, то есть строка «s:42», говорит, что в следующей за ней строке «http://www.domain.com/blog/archive/post123» находится 42 символа, и если вы поменяете http на https, то символов станет на 1 больше, то есть 43, и, если длину также не поменять с «s:42» на «s:43», то что-то перестанет работать. Так что будьте аккуратны с такими заменами, а лучше постарайтесь найти где это можно подправить через админку, где данные будут рассериализованы, исправлены и корректно сериализованы обратно автоматически.

Удачи!

Напишите комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *