Страх и ненависть к юкозу. Или история о том, как перенести сайт с ucoz на modx

У нас был сайт на юкозе, бэкап ради которого нужно было вставать в 6 утра, 5 txt файлов мощнейшей кислоты, полсолонки непонятных символов и гора старых файлов и всего такого, всех цветов, а ещё литр текилы, литр рома, ящик пива. Не то чтобы это всё было нужно в переносе сайта на modx, но раз начал коллекционировать дич, то иди в своём увлечении до конца. Единственное, что меня беспокоило — это modx. В мире нет никого более беспомощного, безответственного и безнравственного, чем человек в modx'овом запое. И я знал, что довольно скоро мы в это окунёмся.

Никогда не думал, что мне прийдется возвращаться в то, с чего всё начиналось, моего первого сайта, который я собрал ещё в школе (какраз для школы его и собирал) сайт на ucoz, который просуществовал на этой платформе 12 лет, но этой весной ucoz придумал супер обновление, теперь размещение на их платформе сайта без показа рекламы обойдется в 300р в месяц... Ну и это было звоночком, что пора переносить сайт.

Создание бэкапа

Но не всё так просто в переносе оказалось:

Создать резервную копию можно только с 00 до 09. В восходящую луну. Перед нажатием три раза плюнув через левое плечо. Затем надеяться, что сегодня ваш день и в надежде ждать заветный архив с бэкапом. И вот, о чудо! Архив с бэкапом готов! Но, стоп, а где же заветные дампы баз данных, о которых нас информировал текст перед созданием бэкапа?

Д как же я сразу не догадался!!! Надо же в архиве открыть папку _s1, а там всё что нужно! Что? Как это там нет sql дампов? Вот же news.txt. Как это не похоже на дамп бд? А если приглядеться, то этот файл похож на csv таблицу. Сохраним файл в csv формат, и продолжим перенос.

Подготовка данных к переносу

По сути из важного и нужного со старого сайта это старые новости, со всеми картинками, ссылками на файлы и тд. Все остальные ресурсы из важных не так много, а те что нужны на новом сайте быстрее и проще перенести вручную.

Дамп базы новостей находится в файле news.txt который предварительно сохранил в news.csv, но если сейчас данный файл попробовать открыть, то ничего нормального мы не увидим, надо предварительно подготовить его.

Открываем файл, заменяем /_новая_строка на пустое значение и заменяем /| на ---. Если что-то всё равно отображается не очень, то смотрим файл на предмет странных символов, переносов лишних (чаще всего это проявляется в контенте с тегами). Ну и после всех манипуляций становится более-менее читаемый файл, конвертируем его в более подходящий формат для переноса.

Сначала конвертируем в xlsx с помощью сервиса: https://www.convertcsv.com/csv-viewer-editor.htm

Затем открываем конвертированный файл и добавляем в шапку ключи для столбцов и удаляем лишнии столбцы. В итоге получится что-то типо такого:

Нужные поля:

  • заголовок
  • контент
  • кол-во просмотров
  • unixtime

Мне удобнее делать импорт из json массива, поэтому конвертируем в json http://beautifytools.com/excel-to-json-converter.php подгоняем массив под подходящий вид, проверяем, что файл сохраняем в кодировке utf-8, иначе при импорте могут возникнуть всякие бяки.

Всё! Данные готовы к переносу.

Импорт данных

Теперь у нас есть json файл с данными и можно эти данные перенести. Для этого написал простенький скрипт:

<?php
// показ всех ошибок
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Определяем константу
define('MODX_API_MODE', true);
// подключаем index.php
require $_SERVER['DOCUMENT_ROOT'].'/index.php';
$modx = new modX();
$pdoTools = $modx->getService('pdoTools');
 
// Включаем обработку ошибок
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

// получаем json с данными
$json_url = __DIR__."/data.json";
$json = file_get_contents($json_url);
$data = json_decode($json, true)["data"];

// перед началом импорта проверяем, что данные приходят корректно
// var_dump("<pre>");
// var_dump($data);
// var_dump("</pre>"); die;

$parent = 7;    // id родителя
$template = 3;  // id шаблона
$count = 0;     // счетчик кол-ва импортированных ресурсов
foreach ($data as $key_news => $value_news) {
    $content = $value_news["content"];
    $title = $value_news["title"];
    $alias = $value_news["alias"];
    $hits = $value_news["hits"];
    $unixtime = intval($value_news["unixtime"]);
    $unixtime2 = intval($value_news["unixtime-2"]);
    $time = $unixtime ?: $unixtime2;

    if(!$content && !$title && !$alias && !$unixtime) continue;

    $resource = $modx->newObject('modResource');
    $resource->set('show_in_tree', 0);      // показывать в дереве
    $resource->set('hidemenu', 1);          // скрыть в меню
    $resource->set('parent', $parent);      // id родителя
    $resource->set('template', $template);  // шаблон
    $resource->set('alias', $alias);        // алиас
    $resource->set('published', 1);         // опубликован
    $resource->set('publishedon', $time);   // дата публикации     
    $resource->set('createdon', $time);     // дата создания
    $resource->set('pagetitle', $title);    // заголовок
    $resource->set('content', $content);    // контент
    $resource->save();
    
    // записываем кол-во просмотров в TV
    $resID = $resource->get('id'); // получаем ID созданного ресурса
    $tv_hits = $modx->getObject('modTemplateVar',[ 'name' => 'hits' ]); // получаем TV по имени
    $tv_hits->setValue($resID, $hits);
    $tv_hits->save();

    unset($resource); unset($tv_hits); // Удаляем переменные
    $count++;
}

$modx->cacheManager->refresh();

echo "Импорт ресурсов завершен. Кол-во: ".$count;
?>

Данный скрипт не универсальный, его стоит расценивать как шаблон, от которого можно отталкиваться подгоняя под свои задачи.

Теперь после переноса проверяем, что всё перенеслось хорошо и радуемся, какие молодцы =)

После переноса

Некоторые страницы, которые импортировали, могут выглядеть очень плохо, это связано с тем, что ucoz редактор текста очень много инлайн стилей прописывает. Для их очистки можно воспользоваться сервисом: https://html-cleaner.com/

Небольшая история

Перед переносом не успевал заняться сайтом, поэтому решил оплатить его на месяц, чтобы не спеша начать его переносить. Прошел месяц, я уже забыл, что его оплачивал, и тут с меня снова снимают оплату (а предварительно я проверил, чтобы не стояли никакие галки об автопродлении при оплате). Пишу в техподдержку, почему с меня сняли деньги, мне в ответ присылают скриншот, на котором показано, что я соглашаюсь на продление подписки:

Но вот так незадача, я то оплачивал в их новом интерфейсе и у меня там ничего такого вообще нет:

После этого была неделя молчания от них, потом мне написали, что продление отключается через панель управления подписками (в новом интерфейсе так и не смогли объяснить где он находится).

Так что будьте внимательны и не забудьте отключить автопродление.

P.S.

Давно откладывал эту статью, скорее хотел написать её не как инструкцию, а как отправную точку тем, кому вдруг достанется участь переноса сайта на ucoz. Когда я этим занялся, информации в сети вообще не было, д и не будет наверное, так как те, кому это надо и так разберутся, ну и сам сервис ucoz сейчас уже не так популярен (я так думаю).

Сам подход не сказать что очень правильный, но он занял минимальное кол-во времени, цель выполнил, так что думаю всё сделано правильно))). В любом случае, это было интересное занятие по переносу сайта, д и некоторые ссылки на сервисы, которые упомянуты в статье в дальнейшем думаю будут полезны.