Сменить домен после переноса сайта 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” выполнить следующие SQL запросы:
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'); UPDATE wp_posts SET guid = REPLACE (guid, 'stariy.com', 'noviy.com') WHERE post_type = 'attachment'; UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'stariy.com','noviy.com');
Обратите внимание на указания доменов: stariy.com и noviy.com - вместо них вы должны подставить свой старый домен и новый. После выполнения этих SQL запросов сайт будет работать корректно (все ссылки открываться по новым адресам, картинки на своих местах и т.д.).
Я всегда делаю следующим образом:
- Выгружаю БД через phpMyAdmin в sql-бекап
- Открываю в текстовом редакторе sql-бекап базы данных и через "Искать и Заменить" заменяю все вхождения старого домена на новый.
- Отредактированный sql-бекап загружаю снова через phpMyAdmin (удалив предварительно с базы все таблицы).
Таким образом решается проблема массовой замены старого домена на новый во всей базе данных сайта WordPress.
