Сменить домен после переноса сайта WordPress
Перенесли сайт с одного домена на другой. Сайт открывается в браузере, но все ссылки на нем ведут на старый домен. Как изменить старый домен на новый после переноса сайта?
Сменить домен на сайте WordPress в БД после переноса можно через sql-бекап или sql-запросы. Но что делать, если нет под рукой доступа в phpMyAdmin или просто не хочется туда лазить и наделать там делов, особенно, если не знаешь что такое phpMyAdmin, sql-запросы и sql-бекапы 🙂
Допустим, у нас есть ФТП доступ к сайту. Таким образом, мы можем загрузить в корень сайта небольшой скрипт, который подсоединится к базе данных и сделает необходимые нам замены во всей БД. Доступ к базе данных у нас есть – он находится в файле wp-config.php.
Теперь создаем текстовый файл с названием replace.php и помещаем в него нижеприведенный код. Обратите внимание, что настройки в этот скрипт необходимо внести следующие (в самых первых строках скрипта):
- $search = Искомую строку (пишем старый_домен.сом)
- $replace = Заменяемую строку (новый_домен.сом)
- $hostname = значение define(‘DB_HOST’, ‘localhost’); из файла wp-config.php
- $database = значение define(‘DB_NAME’, ‘………’); из файла wp-config.php
- $username = значение define(‘DB_USER’, ‘………’); из файла wp-config.php
- $password = значение define(‘DB_PASSWORD’, ‘………’); из файла wp-config.php
<?php // Written by Mark Jackson @ MJDIGITAL // http://www.mjdigital.co.uk/blog $search = 'старый.ru'; // Ищем... $replace = 'новый.ru'; // Меняем на... $hostname = "localhost"; // Настройки базы данных $database = "host1234"; $username = "host1234"; $password = "password"; //дальше ничего не трогаем $queryType = 'replace'; $showErrors = true; if($showErrors) { error_reporting(E_ALL); ini_set('error_reporting', E_ALL); ini_set('display_errors',1); } $MJCONN = mysql_pconnect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR); mysql_select_db($database,$MJCONN); $table_sql = 'SHOW TABLES'; $table_q = mysql_query($table_sql,$MJCONN) or die("Cannot Query DB: ".mysql_error()); $tables_r = mysql_fetch_assoc($table_q); $tables = array(); do{ $tables[] = $tables_r['Tables_in_'.strtolower($database)]; }while($tables_r = mysql_fetch_assoc($table_q)); $use_sql = array(); $rowHeading = ($queryType=='replace') ? 'Replacing \''.$search.'\' with \''.$replace.'\' in \''.$database."'\n\nSTATUS | ROWS AFFECTED | TABLE/FIELD (+ERROR)\n" : 'Searching for \''.$search.'\' in \''.$database."'\n\nSTATUS | ROWS CONTAINING | TABLE/FIELD (+ERROR)\n"; $output = $rowHeading; $summary = ''; foreach($tables as $table) { $field_sql = 'SHOW FIELDS FROM '.$table; $field_q = mysql_query($field_sql,$MJCONN); $field_r = mysql_fetch_assoc($field_q); do { $field = $field_r['Field']; $type = $field_r['Type']; switch(true) { case stristr(strtolower($type),'char'): $typeOK = true; break; case stristr(strtolower($type),'text'): $typeOK = true; break; case stristr(strtolower($type),'blob'): $typeOK = true; break; case stristr(strtolower($field_r['Key']),'pri'): $typeOK = false; break; default: $typeOK = false; break; } if($typeOK) { $handle = $table.'_'.$field; if($queryType=='replace') { $sql[$handle]['sql'] = 'UPDATE '.$table.' SET '.$field.' = REPLACE('.$field.',\''.$search.'\',\''.$replace.'\')'; } else { $sql[$handle]['sql'] = 'SELECT * FROM '.$table.' WHERE '.$field.' REGEXP(\''.$search.'\')'; } $error = false; $query = @mysql_query($sql[$handle]['sql'],$MJCONN) or $error = mysql_error(); $row_count = @mysql_affected_rows() or $row_count = 0; $sql[$handle]['result'] = $query; $sql[$handle]['affected'] = $row_count; $sql[$handle]['error'] = $error; $output .= ($query) ? 'OK ' : '-- '; $output .= ($row_count>0) ? '<strong>'.$row_count.'</strong> ' : '<span style="color:#CCC">'.$row_count.'</span> '; $fieldName = '`'.$table.'`.`'.$field.'`'; $output .= $fieldName; $erTab = str_repeat(' ', (60-strlen($fieldName)) ); $output .= ($error) ? $erTab.'(ERROR: '.$error.')' : ''; $output .= "\n"; } }while($field_r = mysql_fetch_assoc($field_q)); } echo '<pre>'; echo $output."\n"; echo '<pre>'; ?>
Теперь загружаем файл replace.php в корень нашего сайта и открываем в браузере http://наш_сайт.ру/replace.php
В результате работы скрипта мы получим извещения о выполненной работе. И если он не выдаст ошибок, смело удаляем с хостинга файл replace.php
Походу универсальное решение, если нет доступа к phpMyAdmin.
А также, наверное, самое быстрое по исполнению (не надо заморачиваться с sql-бекапами
После смены домена обязательно нужно зайти через панель управления на хостинге в phpMyAdmin и в своей базе данных во вкладке “SQL” выполнить следующие 3 запроса:
UPDATE wp_options SET option_value = REPLACE(option_value, 'stariy.com', 'noviy.com') WHERE option_name = 'home' OR option_name = 'siteurl'; UPDATE wp_posts SET guid = REPLACE(guid, 'stariy.com','noviy.com'); UPDATE wp_posts SET post_content = REPLACE(post_content, 'stariy.com', 'noviy.com');
Обратите внимание на указания доменов: stariy.com и noviy.com – вместо них вы должны подставить свой старый домен и новый. После выполнения этих SQL запросов сайт будет работать корректно (все ссылки открываться по новым адресам, картинки на своих местах и т.д.).
Маловато запросов. А как же?
UPDATE wp_posts SET guid = REPLACE (guid, 'старый.com', 'новый.com') WHERE post_type = 'attachment'; UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'старый.com','новый.com');
Также следует учитывать, что у владельца сайта могут быть плагины и темы, хранящие данные в своих полях. Так что избранными SQL запросами не решить проблему массовой замены старого домена на новый на сайте WordPress
На среднестатистическом сайте ВП, 3-ех указанных SQL запросов вполне достаточно!
Я всегда делаю следующим образом:
- Выгружаю БД через phpMyAdmin в sql-бекап
- Открываю в текстовом редакторе sql-бекап базы данных и через “Искать и Заменить” заменяю все вхождения старого домена на новый.
- Отредактированный sql-бекап загружаю снова через phpMyAdmin (удалив предварительно с базы все таблицы).
Таким образом решается проблема массовой замены старого домена на новый во всей базе данных сайта WordPress.