После переноса сайта на другой домен пропали все изображения
Я перенес сайт с www.domain1.com
на www.domain2.com
Однако пути к изображениям всё ещё указывают на www.domain1.com/wp-content/uploads...
. Поэтому когда www.domain1.com
перестал работать, все мои изображения перестали отображаться.
Я обновил таблицу wp_posts
, где все вложения теперь указывают на www.domain2.com/wp-content/uploads...
, но изображения физически существуют на www.domain2.com
, и я всё равно не вижу ни одного изображения. Может быть проблема в кэшировании?

Похоже, вам нужно изменить URL-адреса для старых изображений. Самый простой и быстрый способ сделать это — выполнить поиск и замену в базе данных MySQL.
Вы можете использовать PHPMyAdmin (обычно предоставляется вашим хостинг-провайдером) или другое программное обеспечение для работы с MySQL, такое как Sequel Pro, чтобы вносить изменения в базу данных MySQL, не затрагивая админ-панель WordPress. Это означает, что вы можете делать масштабные изменения, выполняя SQL-запросы, вместо того чтобы вносить их по одному, что утомительно и занимает много времени.
Не забудьте сначала сделать резервную копию вашей базы данных. Чтобы сделать это в PHPMyAdmin, выберите вашу базу данных в боковой панели слева, затем нажмите "Экспорт". Метод "Простой" подойдет, но если вам нужно больше контроля, то метод "Пользовательский" предоставит вам множество опций.
После создания резервной копии перейдите на вкладку SQL и вставьте следующий код в текстовое поле:
UPDATE wp_options SET option_value = replace(option_value, 'oldurl', 'newurl') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = replace(guid, 'oldurl','newurl');
UPDATE wp_posts SET post_content = replace(post_content, 'oldurl', 'newurl');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'oldurl','newurl');
Замените "oldurl" на ваш старый URL и "newurl" на новый URL, сохраняя http://, но удаляя завершающие слеши. Проверьте все внимательно, и когда будете уверены, нажмите кнопку "Вперед".
Перейдите на ваш сайт и проверьте, работают ли изображения. Если нет, скорее всего, это опечатка, которую можно исправить, восстановив базу данных из резервной копии, сделанной в начале процесса, и попробовав снова.
Более подробное руководство по переносу домена WordPress можно найти на этом сайте, где также есть ссылка на скрипт для автоматического создания SQL-запроса.

Ответ должен быть чем-то большим, чем просто ссылка. Этот пример находится на грани, но обязательно ознакомьтесь с "Как написать хороший ответ?": "Ссылки на внешние ресурсы приветствуются, но пожалуйста, добавляйте контекст вокруг ссылки, чтобы другие пользователи понимали, что это и зачем она нужна. Всегда цитируйте наиболее релевантную часть важной ссылки на случай, если целевой сайт окажется недоступен или перестанет существовать."

Если ваш сайт достаточно небольшой, вы можете...
- Войти в phpMyAdmin.
- Экспортировать вашу базу данных в SQL-файл.
- Сделать копию SQL-файла базы данных, чтобы у вас была резервная копия оригинальной базы на случай ошибок.
- Открыть SQL-файл базы данных в текстовом редакторе.
- Найти и заменить
domain1.com
наdomain2.com
. - Сохранить SQL-файл базы данных.
- Войти в phpMyAdmin снова.
- Импортировать SQL-файл базы данных.
ОБНОВЛЕНИЕ 18.03.2016
ПОСЛЕ выполнения вышеуказанных шагов, выполните следующую процедуру:
Шаг 1 – Создайте функцию для использования.
function mbe_migrate_widgets() {
}
Шаг 2 – Укажите, что искать и на что заменять.
function mbe_migrate_widgets() {
$old_domain = 'http://dev.';
$new_domain = 'http://beta.';
}
Шаг 3 – Получите все виджеты WordPress.
function mbe_migrate_widgets() {
$old_domain = 'http://dev.';
$new_domain = 'http://beta.';
global $wpdb;
// Получить все виджеты
$widgets = $wpdb->get_results(
"
SELECT `option_id`, `option_name`
FROM $wpdb->options
WHERE `option_name`
LIKE '%widget_%'
"
);
}
Шаг 4 – Пройдитесь по всем виджетам WordPress и получите информацию для каждого.
function mbe_migrate_widgets() {
$old_domain = 'http://dev.';
$new_domain = 'http://beta.';
global $wpdb;
// Получить все виджеты
$widgets = $wpdb->get_results(
"
SELECT `option_id`, `option_name`
FROM $wpdb->options
WHERE `option_name`
LIKE '%widget_%'
"
);
if ( ! $widgets ) {
return false;
}
$actions = array();
foreach ( $widgets as $widget ) {
// Получить данные виджета.
$widget_data = get_option( $widget->option_name );
}
return $actions;
}
Шаг 5 – Выполните поиск и замену в данных виджета и обновите записи в базе данных.
function mbe_migrate_widgets() {
$old_domain = 'http://dev.';
$new_domain = 'http://beta.';
global $wpdb;
// Получить все виджеты
$widgets = $wpdb->get_results(
"
SELECT `option_id`, `option_name`
FROM $wpdb->options
WHERE `option_name`
LIKE '%widget_%'
"
);
if ( ! $widgets ) {
return false;
}
$actions = array();
foreach ( $widgets as $widget ) {
// Получить данные виджета.
$widget_data = get_option( $widget->option_name );
// Обновить данные виджета, заменив старый домен на новый.
$update = update_option(
$widget->option_name,
recursive_array_replace( $old_domain, $new_domain, $widget_data )
);
if ( $update ) {
$actions['success'][] = $widget->option_id;
} else {
$actions['failed'][] = $widget->option_id;
}
}
return $actions;
}
Шаг 6 – Добавьте пользовательскую рекурсивную функцию замены в массиве.
// Рекурсивная замена строки - recursive_array_replace(mixed, mixed, array);
function recursive_array_replace( $find, $replace, $array ) {
if ( ! is_array( $array ) ) {
return str_replace( $find, $replace, $array );
}
$newArray = array();
foreach ( $array as $key => $value ) {
$newArray[ $key ] = recursive_array_replace( $find, $replace, $value );
}
return $newArray;
}
Вот и всё. Запустите эту функцию один раз, и все ваши виджеты должны снова начать работать.
Примечание: Вам решать, где разместить этот код или как его выполнить. Также замените переменные $old_domain
и $new_domain
соответствующими значениями.
Дополнительное примечание: Учтите, что этот пример влияет только на виджеты. Если у вас есть другие части сайта, содержащие URL-адреса в сериализованных данных, измените запрос к базе данных соответствующим образом. (Речь идёт о этой части кода: SELECT option_id, option_name FROM $wpdb->options WHERE option_name LIKE '%widget_%'
).
Я бы опубликовал ссылку на свою статью по этой теме, но не хочу выглядеть "спаммером". По сути, это копия/вставка из статьи, которую я написал на своём сайте от 18.03.2016. Содержимое этого ответа может устареть, а статья на моём сайте может быть более актуальной в будущем. Если вам интересно, проверьте мой профиль для ссылки на мой сайт.
Полезное объяснение сериализованных данных: Анатомия сериализованного значения.

Не делайте так! Некоторые настройки могут повредиться из-за этого! Если вы сохраняете массив в WordPress, он сохраняется в таком синтаксисе: a:1:{i:0;s:6: "setting"}. Цифры обозначают длину строки (1 массив, ключ 0, строка длиной 6), поэтому если вы измените с mysite.com на mynewsite.com, длина не будет совпадать, что приведет к повреждению массива.

Рискуя ответить на вопрос просто ссылкой, я думаю, что следующие шаги на этой странице (http://codex.wordpress.org/Moving_WordPress) — это то, что вам нужно:
Изменение имени домена и URL-адресов
Вам нужно безопасно заменить все упоминания старого домена на новый в базе данных. Это можно сделать одним из следующих способов:
Выполнить поиск и замену только в таблице wp_posts.
Использовать скрипт поиска и замены для баз данных WordPress, чтобы безопасно изменить все вхождения. (Если вы разработчик, используйте этот вариант. Это одношаговый процесс в отличие от 15-шаговой процедуры ниже).
По желанию, можно также воспользоваться онлайн-инструментом (если не хочется загружать скрипты на сервер) — Online WordPress Serialized PHP Search and Replace, который позволяет заменить старый домен или URL на новый, одновременно исправляя сериализованные данные.
На этой странице также много другой полезной информации о миграции WordPress.

Похоже, у вас уже есть ответ, но я настоятельно рекомендую использовать DBSR (db search replace) для замены ВСЕХ вхождений domain1 на domain2. Для этого существуют специальные инструменты. Этот довольно удобный: https://github.com/interconnectit/Search-Replace-DB
Весь процесс подробно описан. Интерфейс удобный.
Таким образом вы будете уверены, что все записи в базе данных корректны.

Хотя вы утверждаете, что обновили данные в таблице wp_posts
на www.domain2.com
, остаются записи home
и siteurl
в таблице wp_options
, которые также необходимо изменить, среди прочего.
Чтобы убедиться, что все данные обновлены для вашего нового домена, выполните следующие шаги:
- Скачайте скрипт поиска и замены в базе данных от Interconnect IT здесь
- Разархивируйте файл и загрузите папку (через FTP) в корневую директорию вашего WordPress, переименовав её в
replace
(скриншот) - Перейдите в созданную папку через браузер (например:
http://www.domain2.com/replace
), и вы увидите инструмент поиска/замены - Дальше всё интуитивно понятно: введите старый URL в поле
search for…
, а новый URL в полеreplace with…
Вы можете нажать кнопку dry run в разделе actions, чтобы увидеть, какие изменения будут внесены, перед запуском скрипта. После завершения не забудьте удалить папку /replace/
.

очень простой способ
Установите плагин Velvet в админку вашего WordPress.
Теперь перейдите в настройки Velvet, введите старый домен и новый домен. Нажмите кнопку "Обновить". Готово!

Используйте WP Migrate DB для экспорта данных в zip-архиве с заменой URL.
С этим плагином вы не потеряете виджеты или сериализованные данные.

Вы можете использовать плагин для WordPress: Go Live Update Urls
Это действительно просто и быстро.

После входа в cPanel найдите категорию "Базы данных" и нажмите на значок инструмента phpMyAdmin. Теперь вы находитесь на главной странице phpMyAdmin. Найдите только что добавленную базу данных и кликните по её названию в левой боковой панели. В нашем примере база данных называется testdb. Это откроет базу данных, и экран обновится, показывая список таблиц. Снова используя боковую панель, найдите и кликните по таблице wp-posts. В верхней части экрана вы увидите несколько вкладок. Нажмите на вкладку SQL. Теперь вы находитесь на экране редактора MySQL. В области для кода скопируйте следующий фрагмент MySQL:
UPDATE wp_posts SET post_content=(REPLACE (post_content, 'dommain1.com','domain2.com'));
Сработает?

Чем это отличается от другого ответа? В базе данных есть больше ссылок на изображения, чем просто содержимое поста.

Привет, если вы работаете с базой данных, используйте следующие шаги.
- Войдите в phpMyAdmin.
- Экспортируйте вашу базу данных в SQL-файл.
- Сделайте копию SQL-файла базы данных, чтобы у вас была резервная копия оригинальной базы на случай ошибок.
- Откройте SQL-файл базы данных в текстовом редакторе.
- Найдите и замените domain1.com на domain2.com.
- Сохраните SQL-файл базы данных.
- Снова войдите в phpMyAdmin.
- Импортируйте ваш SQL-файл базы данных.
