Аккуратная замена префикса таблиц базы данных WordPress

Здравствуйте, уважаемые читатели и посетители блога 4remind.ru. Многие знают, что нередко случаются взломы блогов и сайтов на движке WordPress. Одна из причин происходящего кроется в массовом применении начинающими вебмастерами настроек блога WordPress по умолчанию, например использование одного и того же префикса таблиц базы данных WordPress. В этой статье речь пойдет о методе замены всем известного префикса «wp_» на более надежный, который труднее будет угадать и подобрать злоумышленникам.

Замена префикса таблиц базы данных WordPress


Я распишу все по шагам, которые сам проделывал для замены префикса таблиц в базе данных своего блога и блогов знакомых. Так что все проверено на личном опыте. Последняя проверка производилась на WordPress 3.3.1.

Итак, друзья, приступим к аккуратной замене префикса таблиц базы данных WordPress.

Этап №1 — Бэкап базы данных

Для начала необходимо обязательно сделать бэкап текущей Базы Данных и сохранить его в надежном месте!!!

Идем дальше… Предположим, что мы собираемся заменить установленный по умолчанию префикс таблиц «wp_» на новый, более надежный, поэтому далее в тексте будут использоваться следующие условные обозначения:

«wp_» — старый префикс таблиц базы данных WordPress;
«NEWPREF_» — новый префикс таблиц базы данных WordPress;

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

Этап №2 — Создание таблиц базы данных с новым префиксом

Приступим к процедуре замены префикса таблиц базы данных используя phpMyAdmin.

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

Забегая вперед скажу, что конечно можно было бы на этом шаге взяться за банальное переименование существующих таблиц, чтобы сменить префикс у них, например с помощью запросов типа

RENAME TABLE OLDPREFIX_table TO NEWPREFIX_table

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

Создаем список SQL-запросов, в которых должны быть перечислены практически все таблицы, которые используются в базе данных вашего блога, включая таблицы, созданные плагинами (если таковые конечно имеются). В этом списке после слова «TABLE» вставляются имена таблиц с новым префиксом, а после слова «FROM» вставляются имена таблиц со старым префиксом.

CREATE TABLE NEWPREF_blc_filters SELECT * FROM wp_blc_filters;
CREATE TABLE NEWPREF_blc_instances SELECT * FROM wp_blc_instances;
CREATE TABLE NEWPREF_blc_links SELECT * FROM wp_blc_links;
CREATE TABLE NEWPREF_blc_synch SELECT * FROM wp_blc_synch;
CREATE TABLE NEWPREF_commentmeta SELECT * FROM wp_commentmeta;
CREATE TABLE NEWPREF_comments SELECT * FROM wp_comments;
CREATE TABLE NEWPREF_links SELECT * FROM wp_links;
CREATE TABLE NEWPREF_options SELECT * FROM wp_options;
CREATE TABLE NEWPREF_postmeta SELECT * FROM wp_postmeta;
CREATE TABLE NEWPREF_posts SELECT * FROM wp_posts;
CREATE TABLE NEWPREF_terms SELECT * FROM wp_terms;
CREATE TABLE NEWPREF_term_relationships SELECT * FROM wp_term_relationships;
CREATE TABLE NEWPREF_term_taxonomy SELECT * FROM wp_term_taxonomy;
CREATE TABLE NEWPREF_usermeta SELECT * FROM wp_usermeta;
CREATE TABLE NEWPREF_users SELECT * FROM wp_users;

Теперь заходим в phpMyAdmin, снова выбираем нужную нам базу данных и переходим на закладку «SQL». Вставляем в поле для выполнения SQL-запросов приготовленный нами список запросов и выполняем их.
Можно в принципе запросы выполнять и по одному, по очереди, если есть желание.
После выполнения запросов вы получите примерно такой отчет:

Создание таблиц с новым префиксом


Этап №3 — Замена упоминаний префикса в записях таблиц

Идем дальше. Теперь нам обязательно нужно в некоторых полях из двух новых созданных таблиц заменить упоминание старого префикса на новый. Это таблицы «NEWPREF_options» и «NEWPREF_usermeta».

В таблице с новым префиксом «NEWPREF_options» в поле «option_name>» понадобится заменить значение

«wp_user_roles» на «NEWPREF_user_roles»

В таблице с новым префиксом «NEWPREF_usermeta» нужно заменить все значения поля «meta_key», у которых в начале есть старый префикс.
Это могут быть следующие значения:

  • wp_user_level
  • wp_user-settings-time
  • wp_user-settings
  • wp_capabilities
  • wp_dashboard_quick_press_last_post_id
  • wp_autosave_draft_ids
  • wp_metaboxorder_post
  • wp_usersettings
  • wp_usersettingstime

Конечно не все из выше перечисленных значений могут быть у вас в таблице «NEWPREF_usermeta». Все зависит от конфигурации и версии движка вашего блога.
Но мы все же для подстраховки проверим и заменим все найденные значения, это не помешает.

Для замены вышеупомянутых значений на новые в phpMyAdmin снова выбираем нужную нам базу данных и переходим на закладку «SQL».
Вводим там и выполняем следующие команды:

UPDATE NEWPREF_options SET option_name = 'NEWPREF_user_roles' WHERE option_name = 'wp_user_roles';

UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_user_level' WHERE meta_key = 'wp_user_level';
UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_user-settings-time' WHERE meta_key = 'wp_user-settings-time';
UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_user-settings' WHERE meta_key = 'wp_user-settings';
UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_capabilities' WHERE meta_key = 'wp_capabilities';
UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_dashboard_quick_press_last_post_id' WHERE meta_key = 'wp_dashboard_quick_press_last_post_id';
UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_autosave_draft_ids' WHERE meta_key = 'wp_autosave_draft_ids';
UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_metaboxorder_post' WHERE meta_key = 'wp_metaboxorder_post';
UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_usersettings' WHERE meta_key = 'wp_usersettings';
UPDATE NEWPREF_usermeta SET meta_key = 'NEWPREF_usersettingstime' WHERE meta_key = 'wp_usersettingstime';

После выполнения запросов вы получите примерно такой отчет:

После выполнения запросов для замены префикса в полях таблиц


Этап №4 — Замена префикса в файле wp-config.php

Теперь, когда в таблицах базы данных WordPress все замены произведены, заходим в файл wp-config.php, который находится в корневом каталоге блога, находим там строку

$table_prefix = 'wp_';

и заменяем в ней префикс на новый

$table_prefix = 'NEWPREF_';

Этап №5 — Проверка блога после замены префикса

Теперь запусаем браузер, открываем свой блог и проверяем, что админ без проблем входит в панель управления и там все работает.
Проверяем работоспособность всего блога.

Этап №6 — Проверка блога после удаления старых таблиц

Если на Этапе №5 все было в порядке, то снова заходим в phpMyAdmin, выбираем нужную нам базу и теперь уже можно удалить все таблицы со старым префиксом.

Напоследок еще раз для подстраховки выполняем проверку, как на Этапе №5. И если обнаружится какая-то проблема, то придется восстановить из бэкапа таблицы со старым префиксом и вернуть на место прежнее значение префикса в конфигурационном файле wp-config.php ( строка $table_prefix = ‘wp_’; ), который находится в корневом каталоге блога.

Удачной Вам замены префиксов таблиц базы данных WordPress.

Метки: WordPress, база данных, безопасность, префикс

Поделитесь материалом с другими, воспользуйтесь этими кнопками:
Получать обновления и новые материалы блога по E-mail

21 комментарий к “Аккуратная замена префикса таблиц базы данных WordPress”

  1. Alex:

    А не проще будет открыть файл базы данных в AkelPad и заменить wp_ на NEWPREF_ ?

    • Можно и так конечно, для тех, кто знает что делает.
      Но мне уже приходилось помогать реанимировать БД, отредактированные в стандартном Notepad.exe и потом импортированные обратно. Основная ошибка у многих новичков в том, что они не обращают внимание на кодировку символов, которая выставлена в настройках БД, к примеру сохраняют в ANSI и заливают в БД, которая настроена под UTF-8, а потом у них либо что-то не работает, либо нечитаемые тексты на выходе.

  2. Серёга:

    Огромное спасибо! ))) Я сразу поставил в AkelPad кодировку по умолчанию -UTF-8

  3. Kef:

    спасибо за статью,
    после самостоятельной смены префикса возникли проблемы — было не войти в админку. сделал по вашей инструкции — работает.

  4. Владислав:

    А у меня печалька вышла. Все делал четко по инструкции. Сначала показалось, что все окей. Но когда попытался добавить новую запись в блог, увидел вместо кнопки «Опубликовать» кнопку «Отправить на утверждение», хотя я имею права администратора…
    Wordpress 3.3.1
    Что теперь делать, пока не знаю, гугл пока не особо помогает, а префикс сменить очень надо.

    • Владислав, вероятно Вы пропустили «Этап №3 — Замена упоминаний префикса в записях таблиц» или он выполнен с ошибками. Если же нет, то восстановите из бэкапа вашу БД, затем повторите все действия по смене префикса заново, но перед этим обязательно отключите все плагины.
      После смены префикса проверьте работу блога, и если все ок, то включайте поочередно плагины.

      • Владислав:

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

        • Владислав, предполагаю, что возможно в ваших таблицах (особенно в таблице «wp_user_roles») еще остались записи со ссылками на старый префикс «wp_». Попробуйте зайти в phpMyAdmin и выполнить поиск по БД (во всех таблицах) на предмет наличия подстроки «wp_». Если найдутся, то подкорректируйте их вручную, не забыв при этом заранее записать себе куда-нибудь что и где вы меняли, т.к. не факт, что все, что начинается с «wp_» обязательно менять.
          Кстати, проанализировать таблицы можно и без доступа к БД, т.е. в файлах .sql, предварительно сделав временный бэкап (экспорт в файлы .SQL) таблиц или всей БД после замены префикса по инструкции.
          Да, и еще, перед проверкой после замены префикса не помешает почистить кэш браузера и кэш блога на хостинге (если у Вас есть конечно доступ к кэшу).

          • Владислав:

            Ради эксперимента заменил «wp_» на новый префикс во всех строках БД, где искомое встречалось — заработало. Но я полагаю, и вы тоже подметили, что менять все — не есть хорошо. Как вариант, установлю по новой WP но при установке укажу другой префикс, там уже в БД будет видно, где можно менять «wp_», а где не стоит этого делать.
            Благодарю за внимание.

          • Как вариант, согласен с вашим решением. После установки «с нуля» с измененным префиксом ради интереса запустите поиск по БД на предмет наличия «wp_», и если найдутся совпадения, то будет понятно, где менять подстроку не стоит.

          • Владислав:

            Вы знаете, сначала я решил сделать вариант по проще, сделал замену префикса по другой, зарубежной инструкции:
            tdot-blog.com/wordpress/6-simple-steps-to-change-your-table-prefix-in-wordpress

            Все ок, только там не все значения указаны из таблицы «wp_usermeta», я заменил префикс во всех значениях, как указано в вашей инструкции, надеюсь это было правильным решением )

            Существенное отличие в зарубежной инструкции — это изменение в таблице wp_options… В столбце options_name следует заменить wp_user_roles на НОВЫЙ-ПРЕФИКС_user_roles. Из-за этого, недостающего в вашей инструкции, момента у меня и были проблемы, судя по всему.

          • Владислав:

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

  5. Андрей Мизов:

    Сейчас вот слил базы 4 в одну. Префикс поменял очень просто! Сделал дамп базы, открыл в блокноте и произвел замену wp_ на 1234wp_ вот вам самая простая инструкция! Все работает все отлично! (Единственное что в моем случае был интернет магазин WooComerce и пришлось миниатюры поменять, в остальном все отлично. Видимо особенность плагина). Ваша инструкция больше поучительная как работать с phpmyadmin.

    • Игорь А.:

      Ну как кому, а мне так лучше делать все в БД через phpmyadmin, потому что там видишь конкретно что и где меняешь или еще что-то делаешь, заодно и практикуешься в работе с MySQL-запросами и так далее. Вон некоторые новички могут вообще напортачить когда правят в тексте, например не в той кодировке файл сохранят, пунктуацию нарушат или еще чего, а потом мучаются. Но конечно же полюбому перед работой с БД обязательно нужно экспортировать (делать бэкап) или конкретных таблиц, в которых что-то изменяешь, или вообще всю БД целиком для большей надежности.

  6. Дмитрий:

    Заменял префиксы таблиц WordPress при помощи кнопочки в плагине Better WP Security… Пришлось пережить пару неприятных минут, любуясь сначала на «Циклическая ссылка», потом «504 ошибка», потом «Добро пожаловать в знаменитую пятиминутную установку WordPress» :)

    Плагин в базе данных префикс поменял, а в wp-config.php — нет. Пришлось ручками через ftp

  7. prostolinux:

    А вы не пробовали использовать вот этот плагин — Better WP Security — он сам всё делает. Но я пока боюсь его запускать, чтобы ничего не сломать.

    • Better WP Security — хороший и полезный плагин, а бояться ничего не нужно, просто перед установкой чего-то нового сделайте полный бэкап вашего сайта и базы данных. как говорится «вирусов бояться — в интернет не ходить» :)

  8. B.X:

    А почему не сделать ту же самую операцию, но только через CONCAT?

    Хотя, как точно сделать я сказать не могу (не владею языком SQL), но я например знаю, что

    SELECT CONCAT(‘RENAME TABLE ‘,table_name,’ TO ‘,’ваш_новый_префикс_’,substring_index(table_name,’_’,-15),’;’) AS query_to_run
    FROM information_schema.TABLES
    WHERE table_schema = ‘ваша БД’

    выводит префикс спереди таблицы и до 15 подчёркиваний с конца НЕ отрезает. Тут всего две операции. Ввести эту команду, выбрать обязательно ПОЛНЫЙ ПОКАЗ строк из того, что выдаст MySQL и потом ввести эту выборку в нашу страницу. Вот и всё, таблицы с префиксами.

    • Да конечно можно использовать и CONCAT, да еще к тому же и CONCAT_WS, но зачем усложнять все?
      Чем больше разных операторов в запросах, тем больше вероятность возникновения проблем, связанных с опечатками и прочими ошибками.

  9. B.X:

    Да и как всегда (а если немного подумать)… хех…
    Можно этот вывод в том же текстовом редакторе изменить на то, что нужно…
    Это всё лучше и быстрее, чем редактировать саму базу данных и проще, чем вышеизложенный (в заметке) вариант.

    Вывод получается таким:
    RENAME TABLE oldpref_rules_config TO newpref_oldpref_rules_config;
    RENAME TABLE oldpref_rules_dependencies TO newpref_oldpref_rules_dependencies;
    RENAME TABLE oldpref_rules_tags TO newpref_oldpref_rules_tags;
    RENAME TABLE oldpref_rules_trigger newpref_oldpref_rules_trigger;
    RENAME TABLE oldpref_semaphore TO newpref_oldpref_semaphore;
    RENAME TABLE oldpref_sequences TO newpref_oldpref_sequences;

    копируем этот вывод в любой текстовой редактор. Найти newpref_oldpref_ Заменить на superpref_ и всё… дальше полученное вставляем в SQL поле PhpMyAdmin и наша задача решена без всяких сложностей и хлопот…

    • Может и такой вариант пригодиться (я правда не проверял), но для большинства начинающих вебмастеров это может показаться не совсем внятным и излишне сложным, да к тому же такой вариант может не срабатывать из-за не совсем стандартной конфигурации БД на сервере MySQL и ее версии.

Оставить комментарий к Владислав

Уважаемые посетители, пожалуйста, пишите осмысленные и исчерпывающие комментарии. Короткие фразы типа «спасибо автору», «возьму на заметку», «мне помогло» и т.п. будут удаляться. Исключение, когда Вы отвечаете на чей-то вопрос или благодарите за помощь.

Ссылки на Ваш сайт получат статус DoFollow после третьего комментария.

Для вставки кода в комментарии можно использовать BB-коды:
[text] [/text], [php] [/php], [html] [/html]

Подписаться на обновления блога 4remind.ru по RSS
Новости блога в социальных сетях

4remind.ru - персональный блог вебмастера



Наверх
Наверх