Как перенести сайт с Joomla 1.x на Joomla 3. Личный опыт
В данной статье описывается, как я перенес большой сайт, с более чем 10000 статей, написанных на кириллице и с использованием специальных символов, с Joomla 1.x до Joomla 3. Также, в конце статьи описан отличный совет по быстрому массовому изменению алиасов материалов Joomla!
Задача: перенести веб-сайт preminportal.com.mk с Joomla 1.х на Joomla 3.х. Сайт работал на Joomla 1.0.13, с базой данных 320 МБ и корневым каталогом 3,5 ГБ.
Если описать более подробно, то в базе данных содержится:
- jos_content = 15493 строк;
- jos_menu = 131 строк;
- jos_modules = 457 строк;
- jos_sections = 23 ряда;
- jos_categories = 127 строк;
- jos_users = 402 строк.
Чтобы избежать больших пауз в работе сайта и возможных ошибок, я решил, что всю работу проведу на своем компьютере, а не на хостинге. А после просто перенести его на хостинг сайта. Папки с изображениями, музыкой и другим документам я не переносил на компьютер, потому что я решил не менять их расположение (типа из images/stories в images/) и избежать значительных изменений путей во всех статьях.
Однако для работы мне понадобится локальный сервер и для его создания я использовал USBWebServer. Для того, чтобы импортировать базу данных (в дальнейшем буду сокращать до БД) пришлось увеличить параметры memory_limit, upload_max_filesize и post_max_size в php.ini на значения больее 400МБ.
В корне USBWebServer я создал папку под названием 'oldsite', и в нее я извлек папки из старого сайта (только папки ядра Joomla 1.0.x). На USBWebServer я создал базу данных с именем 'oldsite', и конечно выставил кодировку базы данных в UTF8, потому что сайт на кириллице (к слову, имя базы данных 'oldsite' это просто пример и в вашем случае вам нужно использовать имя вашей реальной БД).
В configuration.php я изменил эти строки:
- $mosConfig_db = 'oldsite';
- $mosConfig_absolute_path = 'C:/USBWebserver-za-Premin\root' (здесь нужно указать реальный путь к USBWebServer);
- $mosConfig_live_site = 'C:/USBWebserver-za-Premin\root' (также реальный путь к папке root);
- $mosConfig_error_reporting = '0' ;
- $mosConfig_password = 'usbw' (стандартный пароль для USBWebserver, если вы его изменили - используйте свой);
- $mosConfig_user = 'root' (стандартное пользовательское имя, если вы его изменили - также используйте свое);
- $mosConfig_live_site = 'http://localhost:8080' (стандартный url для корневой папки USBWebserver ,и он требуется для того, чтобы все части загружались правильно).
Для локальной работы с Joomla 1.0.х, я использовал версию USBWebSerever 8, которая поставляется с PHP 5.3.2. Это старая версия, но это было необходимо в данном случае, потому что он имеет magic_quotes_gpc, и они должны иметь значение On в php.ini-файл, для того, чтобы сайт мог быть открыт. В новых версиях PHP эти заявления не используются из соображений безопасности.
Теперь сайт полностью реплицируется локально (без картинок в статьях, но в итоге, когда сайт будет перенесен на сервер, они картинки появятся). Можно начинать перенос сайта на новую версию Joomla.
Я следовал инструкциям из http://docs.joomla.org/J1.5:Migrating_from_1.0.x_to_1.5_Stable (да, сначала необходимо перенести на Joomla 1.5.х, и после этого до последней версии). Поскольку сайт был на Joomla 1.0.13, я скачал рекомендуемый патч для устранения возможных ошибок.
Чтобы сэкономить ваше время: после переноса я обнаружил, что база данных увеличилась в два раза! А это значит, что миграция переход с версии 1.0 прошел неудачно и нужно делать все заново. После этого я нашел ответ на одном форуме, выяснилось что это могло быть из статей, которые находятся в корзине. Так что я открыл админку в Joomla версии 1.0 (!!!) и нашел более 700 статей, а также 20 меню в корзине, так что я их просто удалил. Поэтому, перед миграцией необходимо удалить все неопубликованные статьи, категории и разделы старого сайта. После этого можно продолжать обновление.
В файле ./administrator/components/com_content/admin_content.php в линии 145 находим указанных ниже параметр и его значение.
"c.state >= 0"
В данном случае 0 отображает не опубликованные статьи, а 1 опубликованные, поэтому немного изменим параметр:
"c.state = 0"
и теперь у меня отображаются только неопубликованные статьи, так что я могу выбрать их все и удалить.
Там было 830 неопубликованных статей, и почти 100 из них были в избранных, что, скорее всего и способствовало проблеме дублирования. После удаления всех ненужные вещей, я изменил строку в admin_content.php на ее оригинальное значение, и теперь менеджер материалов отображает 11296 статей, 3560 из них избранные и 2572 архивируются.
Я тоже удалил все неопубликованные категории и разделы, меню и подменю. Кроме того, я удалил все неопубликованные модули (кроме основных, таких как логин, потому что он не может быть удален). И, конечно же, были удалены все неиспользуемые расширения, модули, плагины, компоненты и прочее, шаблоны. А также все "отключенные" пользователи.
В общем, проведена глобальная чистка, чтобы уменьшить базу данных. После этого удалил все в менеджере корзины.
P.S. также рекомендую пройтись по базе данных и проверить, все ли удалилось из "ненужного".
Следующий шаг - установка компонента Migrator, который переносит базу данных из Joomla 1.0 в 1.5. Данный компонент создает один sql файл и импортирует его в чистую установку Joomla 1.5.
После этого я помещаю установочные файлы для Joomla 1.5.26 в каталог с названием 'oldsite15, и создаю новую базу данных с именем 'oldsite15' и UTF-8 кодировкой.
Я снова и снова пытался импортировать файл миграции в течение установки Joomla 1.5.26. Предлагаемая по умолчанию кодировка ISO-8859-1 не работает. Я пытался использовать только кодировку utf-8, но всегда получаю следующую ошибку:
Notice: iconv() [function.iconv]: Detected an illegal character in input string in ...\installation\installer\helper.php on line 873
Строка 873 в файле helper.php это:
$buffer = iconv( $srcEncoding, 'utf-8//TRANSLIT', $buffer );
После небольшого исследования форумов на вопрос функционирования функции и ее параметров, я решил попробовать следующее:
$buffer = iconv( $srcEncoding, 'utf-8//IGNORE', $buffer );
Я сделал это из-за первой ошибки, отображаемой в уведомлениях:
Error at the line 9: INSERT INTO jos_migration_backlinks
VALUES(1,"Дома","index.php?option=com_frontpage&Itemid=1","component/option,com_frontpage/Itemid,1/","");
Query:## Created using Migrator 1.3 for Joomla! 1.0
INSERT INTO jos_migration_backlinks VALUES(1,"�ома","index.php?option=com_frontpage&Itemid=1","component/option,com_frontpage/Itemid,1/","");
где в первом ряду Joomla распознала слово "Дома", но после этого она изменила его в странные символы 'Ð�° омÐ', так что я предположил, что проблема может быть не в транслитерации.
Сейчас обновление прошло только с двумя незначительными уведомлениями, и в конце появилось сообщение об успешном обновлении. Наконец-то я смог увидеть свой сайт на Joomla 1.5 с нормальной с нормальным текстом на кириллице.
В версии 1.5 я установил компонент Akeeba 3.4.6 и сделал резервную копию сайта на текущий момент.
Теперь, на новейшей версии USBWebServer (8.5), пробую установить новую Joomla 3 (3.3.6) и попробовать перенести сайт с 1.5.26. Чтобы сделать это возможным нужно иметь базы данных Joomla 1.5.26 и 3.3.6 на одном сервере, так что я собираюсь установить версию 1.5 из резервной копии.
Я создаю новую папку под названием 'newsite3' и базу данных под названием 'newsite3' с кодировкой utf8-general-ci для Joomla 3, и базу данных под названием 'oldsite15' с кодировкой utf8-general-ci для Joomla 1.5.
В чистой установке Joomla 3.3.6 я запускаю компонент redMigrator. В настройках я выбирал только перенос базу данных oldsite15. После 23% redMigrator встает в тупик. Я попытался несколько раз с некоторыми изменениями в настройках, но каждый раз происходило то же самое. Я пробовал увеличивать memory_limit после чего redMigrator удалось перенести более 3300 статей из 11296, прежде чем снова застрять.
Затем я попробовал компонент, называемый MigrateMe, который импортирует базу данных 1.5 и преобразует ее до версии 3. MigrateMe импортировал файл базы, начал ее анализа, но тут же застрял.
Я слышал, что SPupgrade довольно неплохо справляется с этой задачей, поэтому я дал ему попробовать в следующий раз, когда начинал новую установку Joomla 3.
После установки SPUpgrade, я оставил все настройки по умолчанию. Я подключил его к базе oldsite15', и он работал чуть больше чем два часа. За это время в Firefox единственным видимым признаком того, что плагин работал, был вращающийся значок в адресной строке. Время от времени я проверял в phpmyadmin состояние базы данных, и видел изменения в количестве строк. Это был хороший знак. После более чем двух часов ожидания, сайт открылся сам и представил страницу входа.
Я вошел в и увидел отчет о состоянии обновления от SPUpgrade о возможных изменениях, а внизу увидел сообщение: 'Successful migration'. Там были все меню, категории, модули и статьи. Следует отметить, что в старых Joomla 1.0 и 1.5 были разделы (секции) и категории, тогда как в Joomla 3 секции = категории, а категории = подкатегории.
После всех изменений и успешного обновления я перешел к базе данных. В ней я нашел таблицу ucm_history, которая содержит версии материалов. Данная таблица была размеров в 316 мегабайт. Я очистил эту таблицу, посколку статьи в Joomla 1.0 не имеют версии. Версии были реализованы в Joomla 3.
Статьи в Joomla 1.0 не имели человекопонятных URL-адресов, поэтому я решил исправить это: все статьи будут иметь человекопонятные URL-адреса. Обратите внимание, что в этом случае все старые ссылки с других сайтов на ваши старые нечеловекопонятные URL-адреса будут потеряны (либо их просто нужно изменить).
Все заголовки статей на сайте были в на македонской кириллице, поэтому мне необходимо было установить македонский язык и активировать его для административной части сайта. Это дало Joomla возможность автоматически транслитерировать названия македонский кириллицы в латинские символы. Для этого вам нужно открыть статью для редактирования, удалить старый псевдоним и сохраните статью. В процессе сохранения, Joomla автоматически создаст новую хорошуь транслитерацию псевдонимов. Но в моем случае - слишком много статей, поэтому мне нужно быстрое решение.
В интернете я нашел предложение использовать пакетную обработку. В базе данных в таблице xyz_content, все псевдонимы заменяются на "empty/nothing". Теперь создается новая Временная категория, в которую переносятся все выделеные пакетной обработкой (стандартной функцией Joomla 3) материалы. Когда Joomla переносит эти материалы - она автоматически создает для каждого из них алиас. А теперь нам остается просто вернуть эти материалы в их исходную категорию.
Хочу отметить, что во избежание путаницы и страшного беспорядка следует делать это для каждой категории отдельно, постепенно и очень внимательно.
P.S. данная функция не сработает для категорий и меню, их алиасы придется менять вручную, один за одним.
Я сделал новые псевдонимы для меню и категорий. Теперь для материалов. Сначала всем статьям, через phpmyadmin в таблице xyz _content я сменил псевдоним:
UPDATE `xyz_content` SET `alias`=''
и дальше сделал все так, как описал выше. Процесс идет, но очень медленно. Чтобы предотвратить версии материалов и раздувание БД, я временно отключил создание версий. Пакетный перенос во временную категорию шел очень медленно, по одной статье за раз. Но, возврат в оригинальную категорию проходил быстро. Я пришел к выводу, что этот путь решения проблемы займет слишком много времени, поэтому я решил найти решение непосредственно в базе данных.
Я задал вопрос на официальном форуме Joomla: http://forum.joomla.org/viewtopic.php?f=710&t=868696&sid=e10730d81ad7cbb61c2ed875d857e126. Manicakm предложил мне использовать команду:
SELECT `title`,replace(replace(lower (`title`),' ','-'),"'",'') FROM `xyz_content`
и проверить, подойдет ли вариант обработки для моих целей. Проверка показала, что все алиасы будут на кириллице.
После этого с помощью команды:
UPDATE `xyz_content`
SET alias=replace(replace(lower (`title`),' ','-'),"'",'')
Почти все стали выглядеть почти человекопонятными, но на кириллице. Это было не плохо, но я хотел пойти дальше и перевестивсе алиасы в латиницу.
pe7er предложил мне попробовать такой вариант:
SELECT alias, COUNT(*) c FROM xyz_content GROUP BY alias HAVING c > 1
и эта команда показала, что многие псевдонимы были совсем непонятными человеку и имели такие символы как: +,.„“()!?"’蔑ћђ✣✤ и др.
Теперь эти символы необходимо заменить знаком '-' или пробелом в соответствии с их положением и использования в названии.
Я сделал это с помощью команды:
UPDATE xyz_content
SET alias = REPLACE(alias,'+','')
или
UPDATE xyz_content
SET alias = REPLACE(alias,'✤','-')
После замены всех проблемных символов, я использовал тот же метод, чтобы заменить все символы кириллицы в их латинскую транслитерацию. Наконец-то у меня появились хорошие человекопонятные URL-адреса на латинице!
Сейчас я скопировал все изображения, музыку, флэш, PDF файлы, презентации и все прочие документы со старого сайта по пути в корневой папке нового сайта на Joomla 3. Я также установил новый шаблон и настроил его, установил последную версию компонента akeeba backup, загрузил сайта на хостинг, и теперь сайт полностью функционален.
Таким образом я смог обновить Joomla с версии 1.0 до 3! Надеюсь, что данная статья будет вам полезна!