Постоянно встаю на одни и те же грабли, когда разрабатываю сайт на локалке, а потом его надо залить на хостинг. WordPress пишет в базу абсолютные ссылки к некоторым файлам, скриптам и постам. Причём, в некоторых таблицах данные засериалайжены. А значит, их нельзя исправить простой заменой в строке, если длина ссылки на локалке отличается от длины ссылки на боевом хостинге. Раньше спасал плагин Relative Paths, но сейчас он не работает. Приходится прогонять такое (пример для этого сайта).
Сначала подрубаемся к базе (файл я кидаю прямо в корень сайта):
require 'wp-config.php';
require 'wp-load.php';
$db = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if (mysqli_connect_errno()) {
echo 'Не удалось подключиться к базе данных: '.mysqli_connect_error();
die();
}
if (!mysqli_set_charset($db, "utf8")) {
echo 'Ошибка базы данных'.mysqli_error($db);
die();
}
Code language: PHP (php)
Замена для постов (тут нет сериалайза):
$query = mysqli_query($db, "SELECT `ID`, `guid`, `post_content` FROM `wp_posts` WHERE `post_content` LIKE '%heavylogic.loc%' OR `guid` LIKE '%heavylogic.loc%'");
while ($row = mysqli_fetch_assoc($query)) {
$content = str_replace('https://heavylogic.loc', 'https://heavylogic.ru', $row['post_content']);
$content = str_replace('http://heavylogic.loc', 'https://heavylogic.ru', $content);
$guid = str_replace('https://heavylogic.loc', 'https://heavylogic.ru', $row['guid']);
$guid = str_replace('http://heavylogic.loc', 'https://heavylogic.ru', $guid);
$content = mysqli_real_escape_string($db, $content);
$guid = mysqli_real_escape_string($db, $guid);
mysqli_query($db, "UPDATE `wp_posts` SET `post_content`='$content', `guid`='$guid' WHERE `ID`=$row[ID]");
}
Code language: PHP (php)
Для wp_postmeta, куда плагины любят сериалайзить, включая Bricks:
function replace_in_array($arr, $search, $replace) {
foreach($arr as $key => $value) {
if (is_array($value)) {
$arr[$key] = replace_in_array($value, $search, $replace);
}
elseif (is_string($value)) {
$arr[$key] = str_replace($search, $replace, $value);
}
}
return $arr;
}
$query = mysqli_query($db, "SELECT `meta_id`, `meta_value` FROM `wp_postmeta` WHERE `meta_value` LIKE '%heavylogic.loc%'");
while ($row = mysqli_fetch_assoc($query)) {
$meta = @unserialize($row['meta_value']);
if ($meta === false) {
$meta = str_replace('https://heavylogic.loc', 'https://heavylogic.ru', $row['meta_value']);
$meta = str_replace('http://heavylogic.loc', 'https://heavylogic.ru', $meta);
} else {
$meta = replace_in_array($meta, 'heavylogic.loc', 'heavylogic.ru');
$meta = serialize($meta);
}
$meta = mysqli_real_escape_string($db, $meta);
mysqli_query($db, "UPDATE `wp_postmeta` SET `meta_value`='$meta' WHERE `meta_id`=$row[meta_id]");
}
Code language: PHP (php)