Про популярные SQL-запросы к базе данных wordpress в поиске Яндекса и Гугла можно найти несколько статей. Большинство из них — рерайт одного англоязычного текста, которому уже много лет и который писался под старые версии вордпресса. Многие запросы из этих статей не работают. Я предлагаю выборку SQL-запросов, актуальных на 12 декабря 2013 года, протестированных для версии wordpress 3.7.1
ИТАК:
Если у вас есть сайт на WordPress, то иногда вы встречаетесь с задачами, которые неудобно, а то и невозможно, решать через панель управления. Но, даже если Ваш сайт взломан и Вы не можете попасть в админку (ситуация не самая типичная, но мне неоднократно встречалась), для многих проблем есть другой путь решения: SQL-запросы для wordpress. Для начала давайте разберемся, что это.
База данных
Вся информация сайта — записи, страницы, пользователи, комментарии и тому подобное — хранится на сервере баз данных MySQL. Доступ к нему, как правило, осуществляется через админку хостинга и приложение, с которым мы будем работать, называется PhpMyAdmin — оно нужно для управления базой данных. Войдя в него, мы увидим примерно такую картину:
Перед вами база данных вашего сайта. Все сведения в ней хранятся в упорядоченном виде. Грубо говоря, это таблицы, состоящие из строк и столбцов, в которых находится пронумерованная информация (по этим номерам осуществляются связи между таблицами). Вот, например, таблица с постами:
ID — это номер записи, а post_author — ID автора и т.д.
Структура базы данных и префиксы таблиц Wordpress
Теперь рассмотрим, что же именно хранится в наших таблицах.
1) wp_posts — основная таблица, в которой хранится контент — записи, их название, авторство, дата создания, статус записи, разрешено ли комментирование и многое другое.
2) wp_postmeta — дополнительные данные о записях, таки как прикрепленные файлы и произвольные поля, появляющиеся, например, при установке плагинов.
3) wp_users — данные о всех пользователях сайта: их логины, пароли, электронная почта etc.
4) wp_usermeta — профили пользователей и их настройки.
5) wp_comments — комментарии для статей
6) wp_commentmeta — дополнительная информация о комментариях, например, помечен ли комментарий как спам.
7) wp_terms — категории и тэги, к которым может относиться статья.
8) wp_term_taxonomy — в этой таблице хранится иерархия категорий, то есть она служит для построения дерева вложенности.
9) wp_term_relationships — в этой таблице задается вхождение статьи в какую-либо категорию.
10) wp_links — все ссылки (блогролл) и информацию о них.
11) wp_options — все настройки вордпресса: и стандартные, и настройки плагинов.
SQL
SQL — Structured Query Language — это специальный язык для манипуляций с данными. Мы не будем вдаваться в тонкости программирования, поэтому рассмотрим его в общих чертах, чтобы понимать, что именно делают полезные запросы, о которых ниже.
Нас будут интересовать три типа запросов:
1) SELECT — выборка данных. Обращаясь к каким-либо таблицам и задавая условия, мы можем получить от базы данных любую выборку. Например, все е-мэйлы комментаторов. Синтаксис такого запроса выглядит так:
SELECT что_выбрать FROM откуда_выбрать WHERE условия;
2) UPDATE — изменение данных. Точно также, как и для SELECT, изменить какую-то выборку данных, ограниченных условиями, то есть в общем случае изменяется множество строк таблицы за один раз. Синтаксис:
UPDATE изменяемая_таблица SET что_меняем = на_что_меняем WHERE условия;
3) DELETE — удаление данных. Будьте осторожнее с этим оператором, так как данные удаляются из таблиц насовсем. Единственное, что можно сделать, если вы нечаянно удалили лишнее — восстановить базу из резервной копии.
DELETE откуда_удалить WHERE условия;
Полезные запросы к БД вордпресс
Первое, что нужно сделать, когда вы хотите выполнить какой-то запрос, — это сохранить резервную копию ваших данных. Это можно сделать прямо в PhpMyAdmin, в разделе экспорт. Если ваш сайт достаточно большой, выберите способ компресси, например, zip.
Все запросы, о которых мы будем говорить далее, нужно запускать, пользуясь вкладкой SQL.
После выполнения запроса вы не должны видеть никаких сообщений об ошибке. (Если вы их видите, значит что-то пошло не так, и лучше восстановить резервную копию.) Результат выполнения запроса должен быть похож на:
Смена пароля wordpress
Если по какой-то причине вы потеряли доступ к админке сайта (например, он взломан) и восстановление на почту не работает, то вы можете поменять пароль с помощью запроса
UPDATE wp_users SET user_pass = '$P$BLIwZyiB0J2XvUAsNyKQI1hyEMox0A0', user_activation_key= '' WHERE user_login = 'admin'
После выполнения такого запроса вы сможете зайти в админку с паролем 12345. Не забудьте сразу после входа с этим паролем поменять его на более сложный!
Что именно мы делаем? В поле user_pass таблицы wp_users хранится пароль в зашифрованном виде. Мы меняем его для пользователя с логином admin.
Если вы меняли логин, то вместо ‘admin’ в тексте запроса вы можете смело написать ваш логин.
Если же логин был заменен злоумышленником, то можно попробовать восстановить пароль по ID пользователя, а также вернуть первому пользователю имя admin.
UPDATE wp_users SET user_pass = '$P$BLIwZyiB0J2XvUAsNyKQI1hyEMox0A0', user_activation_key= '',user_login = 'admin' WHERE ID=1;
Кстати, в сети можно встретить множество запросов со сменой пароля с помощью функции MD5. Имейте ввиду, что такой метод не работает и уже довольно давно.
Смена логина wordpress
Если вам не нужно менять пароль, а хочется только сменить логин, то вам поможет следующий запрос:
UPDATE wp_users SET user_login='boss' WHERE user_login='admin'
Здесь мы меняем логин пользователя admin на boss. В дальнейшем в админку можно входить по логину boss с тем же паролем, что был у admin.
Закрыть комментарии в категории wordpress
Мы не будем рассматривать, как в принципе закрыть комментирование, потому что сейчаc это легко делается через админку сайта. А закрытие комментариев в какой-либо категории удобно сделать с помощью запроса.
UPDATE wp_posts p LEFT JOIN wp_term_relationships rel ON ( p.ID = rel.object_id ) LEFT JOIN wp_term_taxonomy tax ON ( tax.term_taxonomy_id = rel.term_taxonomy_id ) LEFT JOIN wp_terms tm ON ( tm.term_id = tax.term_id ) SET p.comment_status = 'closed' WHERE tm.slug = 'Uncategorized'
Мы закрываем комментарии для категории Uncategorized. Вместо этого имени вы можете подставить любое свое название категрии. А если установить comment_status равным не ‘closed’, а ‘open’, комментарии будут открыты. Установка этого поля в значение ‘registered_only’ позволит комментировать только зарегистрированным пользователям.
Закрыть комментарии в старых постах wordpress
Аналогичным образом можно закрыть комментарии в старых постах.
UPDATE wp_posts SET comment_status = 'closed' WHERE post_date < '2013-01-01' AND post_status = 'publish'
Здесь post_date – дата создания записи, и мы закроем комментарии ко всем опубликованным записям, созданным ранее 2013 года.
Изменение сайта комментатора
Если комментаторы на сайте злоупотребили возможностью указать URL и понаписали туда всякого спама, то этот URL можно удалить. Давайте рассмотрим две ситуации:
1) Множество комментаторов с одинаковым URL
В таком случае удобнее всего заменить URL во всех комментариях разом
UPDATE wp_comments SET comment_author_url = REPLACE(comment_author_url, 'wordpress.org', 'sales-text.ru')
Используя функцию REPLACE, мы заменяем адрес сайта ‘wordpress.org’ на ‘sales-text.ru’, независимо от того, кто оставил этот комментарий. Естественно, вместо ‘wordpress.org’ и ‘sales-text.ru’ можно подставить любые нужные вам слова.
2) Один комментатор, спамящий разными URL
UPDATE wp_comments SET comment_author_url = 'http://wordpress.org' WHERE comment_author = 'Mr WordPress' AND comment_author_email = 'wordpress@wordpress.org'
Таким образом, мы заменим адрес сайта комментатору Mr WordPress с e-mail wordpress@wordpress.org во всех его комментариях. В принципе, можно удалить из этого запроса последнюю строчку и не указывать e-mail, но тогда есть риск затронуть других комментаторов, если они указали то же имя (оно совершенно не обязано быть уникальным). И, естественно, вместо ‘http://wordpress.org’ можно указать любой другой сайт.
Собрать все e-mail комментаторов wordpress
Это можно сделать, используя совсем простой запрос.
SELECT DISTINCT comment_author_email FROM wp_comments
После его выполнения в PhpMyAdmin вы увидите выборку уникальных e-mail комментаторов. Отметив их все и воспользовавшись кнопкой Экспорт, вы можете сохранить их в файл и использовать в дальнейшем по собственному усмотрению.
Удаление уведомлений wordpress
Комментарии, которые уведомляют вас о том, что на вас кто-то сослался, часто бывают не нужны – популярные записи могут собирать огромное множество таких уведомлений. Если вы решили их удалить, это можно сделать с помощью такого запроса:
DELETE FROM wp_comments WHERE comment_type = 'pingback';
Pingback здесь обозначает, что комментарий является таким уведомлением.
Смена домена wordpress
Если вы хотите перенести сайт на новый домен, это также можно быстро и эффективно сделать с помощью запросов. (Если вы переносите сайт на новый хостинг, не забудьте предварительно скопировать туда все файлы. А также импортировать старую базу данных с помощью вкладки Импорт в PhpMyAdmin.)
Замена домена производится несколькими запросами. Первым делом нам надо откорректировать имя в настройках вордпресса – в таблице wp_option.
UPDATE wp_options SET option_value = 'http://new-site.ru/' WHERE option_name = 'home' OR option_name = 'siteurl'
Мы меняем значение двух опций – home и siteurl. Не забудьте вписать имя вашего нового домена вместо ‘http://new-site.ru/’.
Теперь нужно поменять имя домена в записях.
UPDATE wp_posts SET post_content = REPLACE (post_content, 'http://old-site.ru', 'http://new-site.ru')
Здесь и далее ‘http://old-site.ru’ – старое доменное имя, а ‘http://new-site.ru’ – новое, на которое мы заменяем.
Следующим пунктом надо исправить домен в произвольных полях.
UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'http://old-site.ru','http://new-site.ru')
Осталось поправить только GUID.
UPDATE wp_posts SET guid = REPLACE (guid, 'http:// old-site.ru', 'http://new-site.ru')
Готово! Замена домена выполнена!
Замена любого текста в записях wordpress
Также в записях можно поменять не только доменное имя, но и абсолютно любой текст. Например, вы захотели сделать во всех записях сайта из какого-то слова ссылку.
UPDATE wp_posts SET post_content = REPLACE (post_content, 'мой сайт', ' <a href="http://my-site.ru">мой сайт</a> ')
Здесь мы делаем из слов ‘мой сайт’ ссылку на my-site.ru в поле post_content, которое содержит текст записи.
Аналогично можно заменить и что угодно другое. Синтаксис функции REPLACE такой:
REPLACE(имя_поля, что_меняем, на_что_меняем)
Удаление ревизий записей wordpress
По умолчанию в вордпрессе включены ревизии записи. (Ревизии – это промежуточные редакции записи.) Иногда они бывают нужны, и многие не хотят их отключать. А некоторые просто не знают о такой возможности. Тем временем, база сайта забивается огромным количеством этих ревизий и иногда для улучшения производительности сайта их следует удалять.
DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'
Здесь мы удаляем все записи, и всю связанную с ними информацию, если их тип ‘revision’.
Деактивация всех плагинов wordpress
Иногда какой-то плагин работает некорректно, и на страницу их настройки зайти становится невозможно. Это можно исправить, не удаляя плагин физически, с помощью запроса, деактивирующего все плагины.
UPDATE wp_options SET option_value = '' WHERE option_name = 'active_plugins'
Не забудьте после этого зайти в настройки плагинов и активировать те, которые нужны.
На этом всё. Если Вы хотите узнать, как выполнить какие-то другие полезные запросы – пишите в комментариях.
Как изменить размеры всех изображений в старых постах?
Сам не делал, но думаю так:
1) экспортировать базу сайта Mysql через phpMyadmin на компьютер
2) Открыть её в блокноте или Notepade++
3) Заменить через ctrl+H все стандартные куски кода с размерами изображений (например widht=150 на widht=125), сохранить
4) Импортировать базу обратно в phpMyadmin
Николай, здравствуйте.
Хочу спросить: у Вас в посте смена домена у ВП описана в 4х запросах. А можно их все объединить в один и выполнить за один раз? Или обязательно поочерёдно?
Могу ошибаться, но наверное нельзя)
А в чём сложность выполнения запросов поочерёдно?
Да ни в чём, в принципе, просто хотел оптимизировать и ускорить нажимание кнопок…
Я попробую выполнить все запросы сразу, о результатах отпишу.
Буду благодарен, если отпишетесь и приведёте запрос. Я к слову — сам пользуюсь этой статьёй, когда меняю домены.) Единственный момент — может остаться код со старым доменом в виджете «Текст», можно сменить ручками.
Да, сразу всё в одном выполнить не получилось, выдало мне ошибку #1064 — You have an error in your SQL syntax; со ссылкой на ту строку, где заканчивался певый запрос и начинался второй.
По отдельности всё сработало.
спасибо за этот царский пост очень помог мне