8 полезных приёмов для базы данных WordPress
28 июля 2009
Web-разработка
Надо отдать должное WordPress. Это действительно потрясающая система для построения блогов и даже полноценных сайтов. Симпатичная и логичная админка (особенно в версии 2.7, вкусняшка), немалое количество достаточно качественных шаблонов… да и вообще всё очень приятно и относительно просто. Хочу воздать этой системе должное и сделать для её пользователей что-нибудь полезное. Ну, например, перевести одну свежую замечательную статью, суть которой отражена в заголовке. Я люблю вольные переводы, поэтому не проверяйте меня по каждому слову как в школе, ага?
За последние 10 лет MySQL стала невероятно популярна в сети. Каждый блог WordPress имеет в своей основе именно базу MySQL, в которой хранятся все ваши записи, настройки, комментарии и многое другое.
Хотя плагины и даже, так называемые, хаки кода (предпочитаю «вставки кода») могут решить некоторые задачи, иногда у вас нет иного выбора, кроме как вводить SQL-запросы в phpMyAdmin или напрямую в базу через SSH. Так что давайте посмотрим на 8 полезных приёмов для базы данных WordPress. Каждый раздел этого поста представляет собой описание возникшей проблемы и способа её решения.
1. Создание бэкапа вашей базы
Проблема. Хотя советы в этой статье были проверены, вам не стоит их применять на практике до создания резервной копии вашей базы MySQL (мало ли что…)
Решение. Чтобы создать вручную резервную копию вашей базы, следуйте за этими простыми шагами:
1. Для начала надо залогиниться в phpMyAdmin и выбрать там свою базу WordPress.
2. Готово? Тогда кликните на кнопке «Экспорт» (Export), которая находится в горизонтальном меню.
3. Выберите метод сжатия данных (лично я использую gzip) и нажмите на кнопочку «Пошёл» (Execute).
4. Ваш браузер спросит хотите ли вы скачать бэкап. Разумеется скажите ему твёрдое Да и сохраните файл куда-нибудь на свой компьютер.
Примечание. Учтите, что создание резервных копий базы WordPress гораздо удобнее делать с помощью специального плагина WP-DB-Backup. Пользователи WordPress могут не задумываясь, прямо сейчас устанавить себе этот плагин если по каким-то причинам всё ещё этого не сделали (вот я сделал, я молодец).
2. Пакетное удаление ревизий записей
Проблема. Ревизии записей — это новая фишка WordPress начиная с версии 2.6. Она может быть очень полезной, а может также увеличить размер базы MySQL. Разумеется, вы можете вручную удалять ревизии постов с админки. Но это очень долго и нудно. Есть решение получше.
Решение. А решение проблемы очень простое: мы пакетно, то бишь всё одним махом, удаляем ревизии постов используя простой SQL-запрос. Результат может быть потрясающим, если у вас много записей. Ваша база данных может похудеть вдвое!
1. Надо залогиниться в phpMyAdmin и выбрать там свою базу WordPress.
2. Потом нажать на кнопочку «SQL». Появится окошко, в которое надо вставить следующий запрос:
DELETE FROM wp_posts WHERE post_type = "revision";
3. Вот и всё! В зависимости от количества записей, вы сэкономили кучу драгоценного времени и почистили базу. Супер, да?
Объяснение кода. В таблице wp_posts есть поле под названием post_type. Это поле может иметь множество значений, таких как post, page или revision. Когда мы хотим избавиться от ревизий записей, то просто запускаем команду, чтобы та удалила все значения в таблице wp_posts, в поле post_type которой стоит значение revision. Вот как.
3. Удаляем 5000 спаммерских комментариев за одну секунду
Проблема. Правдивая история: мой друг недавно открыл свой собственный блог и начал активно его пиарить по всему интернету. Через несколько недель интенсивной работы он провёл пару дней в отпуске, без сети.
Когда он вернулся домой и заглянул в свой блог… то увидел больше 5000 сообщений, которые ожидали модерации! Разумеется большинство из них было спамом, но надо было проверить их все, чтобы не удалить нормальный комментарий от одного из постоянных читателей. Как быть?
Решение. К своему счастью, мой друг рассказал мне о своей проблеме с долбаными спамерами. Он уже успел потратить 45 минут на ручную проверку и удаление спама, как я показал ему очень полезный трюк:
1. Логинимся в phpMyAdmin и выбираем там свою базу WordPress.
2. Нажимаем на кнопочку «SQL». Появится окошко, в которое надо вставить следующий запрос:
DELETE from wp_comments WHERE comment_approved = '0';
3. И прощайте спамеры! Наслаждаемся чистотой и уютом в базе…
Объяснение. В таблице wp_comments содержится поле comment_approved, в котором хранится булевое значение (1 или 0). Утверждённые комментарии имеют значение 1, а комментарии которые ожидают модерации — 0. Вышеуказанная команда просто удаляет неутверждённые комментарии. Всё просто.
Но будьте осторожными! Хотя это решение офигенно удобное для автоматического удаления миллионов спамерских комментариев, но оно также удаляет и нормальные неутверждённые комментарии. Если вы всё ещё не используете плагин Akismet, то самое время начать, чтобы предотвратить заспамление блога.
4. Как изменить атрибут записи
Проблема. Когда вы устанавливаете WordPress, создаётся аккаунт «admin» по-умолчанию. Некоторые блоггеры делают ошибку, используя этот аккаунт для создания своих записей, пока они не понимают, что это как-то безлико.
Решение. Модификация атрибута автора для каждой записи занимает туеву хучу времени. К счастью, SQL может нам помочь:
1. Логинимся в phpMyAdmin и выбираем там свою базу WordPress.
2. Для начала нам надо определить правильные ID пользователей. Так что нажимаем на кнопочку «SQL». Появится окошко, в которое надо вставить следующий запрос:
SELECT ID, display_name FROM wp_users;
3. phpMyAdmin отобразит список «айдишников», которые привязаны к пользователям WordPress. К слову, NEW_AUTHOR_ID это ID самого свежесозданного автора, а OLD_AUTHOR_ID это ID оригинального админского аккаунта.
4. После того как вы определили «айдишники» NEW_AUTHOR_ID и OLD_AUTHOR_ID, выполните следующую команду:
UPDATE wp_posts SET post_author=NEW_AUTHOR_ID WHERE post_author=OLD_AUTHOR_ID;
5. Это всё. Все записи, которые были привязаны к аккаунту admin теперь будут собственностью того пользователя, которого вы выбрали.
5. Сброс пароля
Проблема. Чтобы защитить свои блоги, люди часто выбирают сильные пароли, такие как 7*KoF5i8_. Это, конечно, похвально, но все слышали множество историй о том как админы забывают свои пароли :)
Решение. Когда вы забываете свой пароль, WordPress может отправить вам ссылку для его сброса на email. Но если у вас нет доступа к мылу, которое указано в базе WordPress, или если вы считаете, что вопрос можно решить как-то иначе, то вот вам способ «взлома»:
1. Логинимся в phpMyAdmin, выбираем там свою базу WordPress и открываем окно SQL.
2. Вводим следующую команду (с учётом, что вашим логином был «admin»):
UPDATE 'wp_users' SET 'user_pass' = MD5('PASSWORD') WHERE 'wp_users'.'user_login' = 'admin' LIMIT 1;
3. Ну вот, собственно, и всё. Ваш пароль успешно обновится на тот, что вы указали в месте, помеченном как «PASSWORD».
Объяснение. Пароли пользователей хранятся в таблице wp_users. Разумеется используется хэш MD5, чтобы защитить их от просмотра.
Мы отправили SQL-запрос «UPDATE» и использовали встроенную функцию MySQL — MD5(), чтобы конвертировать наш пароль в MD5 и обновить его. Использование «WHERE» гарантирует, что мы обновили только пароль администратора. Тот же запрос, но без использования параметра «WHERE» обновит все пароли в базе!
6. Изменение вашего доменного имени
Проблема. Хотя это и не рекомендуется, но вы можете в какой-то момент захотеть изменить доменное имя вашего блога и при этом сохранить все его данные. Так как WordPress хранит доменное имя в базе, вам прийдётся немного изменить базу, чтобы связать ваш новый домен и блог WordPress.
Решение.
1. Как вы уже могли догадаться: логинимся в phpMyAdmin, выбираем там свою базу WordPress и открываем окно SQL
2. Чтобы изменить URL Вордпресса, запускаем вот такую команду:
UPDATE wp_options SET option_value = replace(option_value, 'http://www.oldsite.com', 'http://www.newsite.com') WHERE option_name = 'home' OR option_name = 'siteurl';
3. Потом нам нужно заменить относительный URL (GUID) для каждой записи. Следующая команда сделает это за вас:
UPDATE wp_posts SET guid = replace(guid, 'http://www.oldsite.com','http://www.newsite.com');
4. Это почти конец. Осталось только найти и заменить абсолютные URL в таблице wp_posts table для убедительного финала:
UPDATE wp_posts SET post_content = replace(post_content, 'http://www.oldsite.com', 'http://www.newsite.com');
5. А вот это уже конец. Можете зайти в админку своего блога используя новый урл :)
7. Отображение количества SQL-запросов вашего блога.
Проблема. Когда пытаешься оптимизировать время загрузки блога, знание количества запросов к базе данных весьма очень помогает. Для того чтобы уменьшить количество запросов, первым делом надо узнать сколько запросов происходит на какой-либо странице.
Решение. А вот теперь прикол: нам не надо заходить в phpMyAdmin :) Надо только открыть на редактирование файлик footer.php (он точно есть в вашей теме) и добавить туда вот эти волшебные строки кода:
<?php if (is_user_logged_in()) { ?>
<?php echo get_num_queries(); ?> queries in <?php timer_stop(1); ?> seconds.
<?php } ?>
Сохраните файл и посетите свой блог. В «подвале» вы увидите количество запросов к базе Вордпресса и время, затраченное на их создание.
Примечание. Сложилось впечатление, что многие пользователи WordPress не в курсе это чудесной возможности. Функция get_num_queries() возвращает количество созданных запросов во время загрузки страницы.
Учтите, что код, приведённый выше, отображает количество запросов только залогиненым пользователям, так как гости блога и поисковые боты не обязаны знать эту информацию. Но если вам не стыдно, можете сделать отображение публичным, просто убрав условный оператор if (is_user_logged_in()) с кода.
8. Восстановление вашей базы данных
Проблема. Скажем… по некоторым причинам, таким как взлом или проблема с обновлением, вы можете потерять данные вашего блога или обнаружить их безнадёжно испорченными. Так что если у вас есть резервная копия (правда же есть, да?), вам стоит импортировать её в свою базу ВордПресса. И тогда всё будет хорошо. Скорее всего.
Решение.
1. Логинимся в phpMyAdmin, выбираем там свою базу WordPress.
2. Жмём на кнопку «Импорт» (Import) в горизонтальном меню. Если её там нет — поищите в другом меню :)
3. Нажмите кнопку «Открыть» (Browse) и выберите самую свежую копию базы со своего диска.
4. Жмём на кнопку «Пошёл» (Execute). Если всё пройдёт удачно и боги будут на вашей стороне, база данных будет снова полностью функциональна.
Это пост — авторский перевод статьи 8 Useful WordPress SQL Hacks. Права на перевод принадлежат всем. Спасибо Jean-Baptiste Jung’у, автору оригинала. Надеюсь кому-то это всё пригодится :)

Anton 16 ноября 2009 0:32
Мне одна вещь интересна – почему бэкап SQL через плагин отличается размером от бэкапа через phpmyadmin?
автор вы не замечали этого? объяснить можете причину?
Veles 20 ноября 2009 7:17
phpMyAdmin бэкапит абсолютно все таблицы базы, в то время как плагин бэкапит только таблицы с пользовательскими данными, не копируя Вордпрессовские. Я так думаю. В любом случае плагин меня не подводил. Очень удобно раз в сутки получать по почте бэкапик полным автоматом.
bubastic 25 ноября 2009 20:25
Пакетное удаление ревизий записей
“DELETE FROM wp_posts WHERE post_type = “revision”;”
Это не совсем правильный подход
Так будет поправильней
DELETE `p`, `pm`, `c`, `tr`
FROM `wp_posts` AS `p`
LEFT JOIN `wp_postmeta` AS `pm`
ON `p`.`ID` = `pm`.`post_id`
LEFT JOIN `wp_comments` AS `c`
ON `p`.`ID` = `c`.`comment_post_ID`
LEFT JOIN `wp_term_relationships` AS `tr`
ON `p`.`ID` = `tr`.`object_id`
WHERE
`p`.`post_type` = ‘revision’;
Veles 28 ноября 2009 21:24
Уточните, пожалуйста, что именно делает ваш подход и чем он лучше предложенного?
bubastic 13 декабря 2009 2:33
елает то он “Пакетное удаление ревизий записей”, только не оставляет осиротевших записей в связанных таблицах.