# 20+ Полезных SQL Запросов для WordPress
Админка WordPress, как и любая другая панель управления, является по сути панелью управления базой данных для вашего сайта. Почти вся информация о сайте хранится в базе данных, и иногда изменения определенного контента могут занять много времени. Например, если необходимо закрыть комментарии на всех записях, это будет непросто, особенно если у вас около 5000 таких записей. Лишь те, кто не знает, что это можно сделать с помощью SQL-запросов, попытаются сделать это вручную. Ниже приведены примеры таких запросов.
## Содержание
- Удаление неиспользуемых элементов таксономии из базы данных одним SQL-запросом
- Как сбросить пароль пользователя
- Как изменить логин пользователя
- Комментарии
- Пинги и уведомления
- Теги
- Изменение домена
- Замена текста в записях
- Пользовательские поля (postmeta)
- Изменение авторов
- Удаление ревизий запи��ей
- Деактивация всех плагинов
- Очистка кэша ленты
- Получение имен всех колонок (полей) в таблице
В этой статье я собрал лучшие примеры из подобных статей и добавил свои, сделав некоторые правки.
SQL-запросы можно выполнять с помощью маленького и абсолютно безвредного плагина: SQL Executioner.
Или используя конструкцию:
```php
global $wpdb;
$wpdb->query("ваш SQL код");
Эту конструкцию можно использовать в файлах темы, например, в functions.php
или в шаблонах статических страниц. Главное — это включить ее.
Не забудьте сделать резервные копии базы данных перед выполнением запросов, иначе вы можете сильно об этом пожалеть.
wp_
в примерах нужно заменить, если префикс таблиц в вашей базе данных другой.
Удаление неиспользуемых элементов таксономии из базы данных одним SQL-запросом
Недавно я удалял ненужные записи с сайта клиента и заметил, что на сайте осталось много ненужных тегов (записей без постов). Они загрязняют базу данных, и желательно удалить такие пустые теги. Чтобы избежать ручного удаления, я написал следующий запрос:
DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE count
= 0);
DELETE FROM wp_term_taxonomy WHERE term_id NOT IN (SELECT term_id FROM wp_terms);
DELETE FROM wp_term_relationships WHERE term_taxonomy_id NOT IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);
Три запроса удаляют строки из таблиц: wp_terms
, wp_term_taxonomy
, wp_term_relationships
. Первый запрос находит все термины с нулевым значением count
и удаляет их. Второй и третий запросы удаляют строки из таблиц wp_term_taxonomy
и wp_term_relationships
для соответствия с wp_terms
.
Этот запрос удаляет все пустые термины из всех существующих таксономий (категорий, тегов). Если вам нужно ограничить удаление, например, только для тегов, первая строка должна выглядеть следующим образом:
DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE taxonomy='post_tag' AND count=0);
После удаления данных из базы данных рекомендуется оптимизировать таблицы, чтобы очистить неиспользуемые индексы и дефрагментировать файлы данных. Это полезно делать, когда из таблицы удалено большое количество информации. Таблицы оптимизируются следующим запросом:
OPTIMIZE TABLE wp_terms
, wp_term_taxonomy
, wp_term_relationships
;
Как сбросить пароль пользователя
Иногда нужно сбросить или просто изменить пароль, но доступа к админке сайта нет. Для изменения пароля вы можете использовать следующий SQL-запрос:
UPDATE wp_users SET user_pass = MD5('новый_пароль') WHERE user_login = 'логин_пользователя';
Где пароль — это новый_пароль
, а логин — это тот, чей пароль нужно изменить.
Если вы забыли логин, но точно помните, что вы были первым пользователем на блоге, и ваш ID равен 1, вы можете определить пользователя для изменения пароля по ID:
UPDATE wp_users SET user_pass = MD5('новый_пароль') WHERE ID=1;
Как изменить логин пользователя
По умолчанию в WordPress логин создается один раз и изменению не подлежит. Однако это не совсем так. Вы можете изменить логин с помощью следующего SQL-запроса:
UPDATE wp_users SET user_login = 'новый_логин' WHERE user_login = 'старый_логин';
Здесь мы меняем логин на новый_логин
для пользователя с логином старый_логин
.
Комментарии
Часто необходимо массово закрыть или открыть комментарии или сделать что-то другое с комментариями. Для таких манипуляций можно использовать следующие SQL-запросы:
Закрыть комментарии для всех постов
UPDATE wp_posts SET comment_status = 'closed';
Открыть комментарии для всех постов
UPDATE wp_posts SET comment_status = 'open';
Комментирование только для зарегистрированных пользователей
UPDATE wp_posts SET comment_status = 'registered_only';
Удаление спам-комментариев
Некоторые антиспам плагины позволяют всем комментариям проходить, но помечают подозрительные как спам. Если накопилось много спам-комментариев, очищение вручную — занятие крайне трудоемкое. Можно воспользоваться простым SQL-запросом:
DELETE FROM wp_comments WHERE comment_approved = 'spam';
Если вам нужно удалить все неподтвержденные комментарии, используйте:
DELETE FROM wp_comments WHERE comment_approved = 0;
Удаление URL из всех комментариев
Чтобы очистить значения поля URL для всех комментариев, можно использовать этот запрос:
UPDATE wp_comments SET comment_author_url='';
Закрыть комментарии в категории
Если нужно закрыть комментарии только в определенной категории, можно использовать следующий SQL-запрос, который закроет возможность комментирования для всех постов в категории с slug
равным stat
:
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 = 'stat';
stat
— это категория, в которой мы закрываем комментарии.
Закрыть комментирование на старых постах
Чтобы отключить во��можность оставлять комментарии для старых постов, например, опубликованных до 1 января 2010 года, используйте следующий SQL-запрос:
UPDATE wp_posts SET comment_status = 'closed'
WHERE post_date < '2010-01-01' AND post_status = 'publish';
Удаление комментариев с плохими URL
Можно удалить комментарии на основе шаблона, например, если URL комментатора содержит слово "poker":
DELETE a,b
FROM wp_comments a
LEFT JOIN wp_commentmeta b ON ( a.comment_ID = b.comment_id )
WHERE a.comment_author_url LIKE '%poker%';
Изменение сайта комментатора
Теоретически, URL, который комментатор указывает в поле "сайт", можно изменить при редактировании комментария. Однако, если комментариев много, процесс будет очень долгим. Проще сделать это запросом:
UPDATE wp_comments SET comment_author_url = 'http://example.com'
WHERE comment_author = 'Kama'
AND comment_author_email = '[email protected]';
Где example.com
— это URL, который мы хотим установить для комментатора Kama
, и [email protected]
— его email. Я указал никнейм и email, чтобы точно идентифицировать комментатора.
Изменение ID родительского комментария
Иногда пользователи неправильно размещают вложенные комментарии — при ответе на комментарий не используют кнопку "ответить", что приводит к тому, что ответ теряется. Чтобы исправить это, можно изменить ID родительского комментария:
UPDATE wp_comments SET comment_parent=21 WHERE comment_ID=97;
Где 21
— это родительский комментарий, а 97
— комментарий, который нужно исправить.
Email адреса комментаторов
Чтобы собрать все email адреса комментаторов, например, для рассылки, можно использовать следующий SQL-запрос:
SELECT DISTINCT comment_author_email FROM wp_comments;
В результате вы получите список уникальных email адресов.
Пинги и уведомления
Так же, как и комментарии, можно управлять пингами. Вот несколько примеров таких манипуляций:
Закрыть возможность получать пинги
Если на блоге наблюдается высокая нагрузка на сервер из-за пингов, которые, по сути, не нужны, можно закрыть их с помощью следующего запроса:
UPDATE wp_posts p SET p.ping_status = 'closed';
Открыть возможность получать пинги
UPDATE wp_posts p SET p.ping_status = 'open';
Удалить все уведомления
Уведомления — это то же самое, что и пинги. Если вы решили, что эти комментарии не нужны, вы можете удалить их массово с помощью этого SQL-запроса:
DELETE FROM wp_comments WHERE comment_type = 'pingback';
После удаления пингов логично закрыть возможность их полу��ения (см. предыдущий пример) и закрыть пинги в настройках.
Теги
Несмотря на то, что WordPress предоставляет довольно гибкий интерфейс для управления тегами, вам могут быть полезны следующие SQL-запросы.
Получение пустых тегов
После нескольких лет ведения блога могут появиться пустые теги — теги без постов. В более поздних версиях WP такие теги можно удалить на странице настроек тегов, отсортировав их по количеству постов. Однако в более ранних версиях сделать это невозможно. Для такой операции можно использовать следующий SQL-запрос, который получит все теги без постов:
SELECT * FROM wp_terms wt
INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id
WHERE wtt.taxonomy='post_tag' AND wtt.count=0;
Вместо post_tag
вы можете указать любую другую таксономию, например, категории.
Удаление пустых тегов
Используя предыдущий пример, мы получим пустые теги, и теперь просто удалим их:
DELETE a,b,c FROM wp_terms a
LEFT JOIN wp_term_taxonomy c ON a.term_id = c.term_id
LEFT JOIN wp_term_relationships b ON b.term_taxonomy_id = c.term_taxonomy_id
WHERE (
c.taxonomy = 'post_tag' AND
c.count = 0
);
Если вы измените c.count = 0
на c.count < 2
, то удалятся все теги с 0 и 1 постом.
Изменение домена
Изменение домена в настройках
При переходе на другой домен, помимо замены домена в шаблоне, необходимо также изменить записи в базе данных в двух местах — в таблице настроек (wp_options
):
UPDATE wp_options SET option_value = 'http://example.com/'
WHERE option_name = 'home' OR option_name = 'siteurl';
Этот запрос изменит значения полей siteurl
и home
. Не забудьте заменить example.com
на ваш новый домен!
Исправление домена в записях
При смене домена необходимо убедиться, что внутренние ссылки в записях корректные, т.е. ссылки из статей на другие статьи блога после смены домена могут стать неработоспособными. Обычно для этого настраивают редирект с старого домена на новый в .htaccess
или PHP с 301 редиректом. Но дополнительно эстетически правильно сделать так, чтобы в статьях не оставалось ссылок на старый домен. С помощью следующего запроса мы заменим все типы ссылок, включая ссылки на изображения:
UPDATE wp_posts
SET post_content = REPLACE(post_content, 'http://old-example.com', 'http://new-example.com');
old-example.com
и new-example.com
— это старый и новый домены соответственно. Не забудьте их заменить.
Аналогично, вы можете заменить любую строку, например, слово "Вордпресс" на "WordPress".
Изменение домена в пользовательских полях
В пользовательских полях также могут быть записи, хранящие любые URL на старом домене. Поэтому при смене домена может понадобиться заменить домен и в пользовательских полях:
UPDATE wp_postmeta
SET meta_value = REPLACE(meta_value, 'http://old-example.com', 'http://new-example.com');
Редактирование GUID
При изменении домена сайта рекомендуется убедиться, что все записи имеют корректное значение в поле guid
в таблице wp_posts
.
Это поле используется как уникальный идентификатор для идентификации записи в RSS-ленте. Также говорят, что оно необходимо для правильного редиректа с некорректных URL, но это не так.
UPDATE wp_posts
SET guid = REPLACE(guid, 'http://www.oldblog.ru', 'http://www.newblog.ru');
Для некоторых проектов я использую поле guid
для других целей.
Замена текста в записях
Вы можете заменить текст в записях и сделать это напрямую в базе данных. Например, вы можете добавить атрибут target="blank"
ко всем ссылкам с атрибутом rel="nofollow"
:
UPDATE wp_posts SET post_content = REPLACE(post_content, 'rel="nofollow"', 'target="blank" rel="nofollow"');
Также можно добавить внутренние ссылки с конкретным якорем. Например, заменить слово "WordPress" на ссылку на соответствующую страницу, чтобы повысить ее значимость. Однако для этой цели существуют специальные плагины, которые не модифицируют текст в базе данных, а создают ссылки на лету:
UPDATE wp_posts SET post_content = REPLACE(post_content, ' WordPress ', ' WordPress ');
Пользовательские поля (postmeta)
Удаление ненужных пользовательских полей
Если плагин создал пользовательские поля, а затем стал ненужным и вы его удалили, но в базе данных остались сиротские, ненужные пользовательские поля, их можно удалить простым SQL-запросом:
DELETE pm FROM wp_postmeta pm WHERE pm.meta_key = 'meta_name';
Если название пользовательского поля (meta_name
) на кириллице, убедитесь, что кодировка файла, из которого будет выполняться SQL-запрос, соответствует кодировке блога (обычно UTF-8 без BOM).
Получение всех пользовательских полей с пустым значением
Несмотря на то, что в админке создание пользовательского поля без указания значения невозможно, такие "пустые" пользовательские поля могут все же оказаться в вашей базе данных. Например, они могут остаться от различных плагинов или неаккуратных действий. Чтобы проверить наличие таких полей и решить их судьбу, воспользуйтесь следующим SQL-запросом:
SELECT *
FROM wp_postmeta pm
LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
WHERE wp.ID IS NULL;
Изменение авторов
В общем, приписывать ваше имя к чужой статье — не хорошо, но в этом примере предполагается, что вы изменили имя пользователя или приобрели весь контент с авторскими правами, и вам нужно изменить авторство статей. Для изменения автора статьи с одного пользователя на другого (оба пользователя должны быть зарегистрированы, конечно) можно использовать следующий SQL-запрос:
UPDATE wp_posts SET post_author=1 WHERE post_author=2;
Где 1
— это новый пользователь, а 2
— старый пользователь. Найдите ID пользователей в админке.
Удаление ревизий записей
По умолчанию WordPress включает ревизии постов. Они засоряют базу данных и редко действительно необходимы. Если ревизии включены, я рекомендую очищать их хотя бы один раз в год. Это можно сделать с помощью следующего запроса в phpMyAdmin:
-- Зависимости с таксономиями
DELETE FROM wp_term_relationships WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type = 'revision');
-- Метаполя
DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'revision');
-- Самих ревизий
DELETE FROM wp_posts WHERE post_type = 'revision';
Этот запрос удалит ревизии постов и авто-сохранения. Он также удалит ассоциированные метаполя (если есть) и ассоциации ревизий с таксономиями (если есть).
Второй способ
В качестве альтернативного запроса можно использовать следующий пример удаления с помощью JOIN
:
DELETE a,b,c,d
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)
LEFT JOIN wp_comments d ON (a.ID = d.comment_post_ID)
WHERE a.post_type = 'revision';
Здесь я также добавил удаление строк из таблицы wp_comments
, на случай если к ревизиям есть комментарии. Их не должно быть.
Деактивация всех плагинов
Бывают ситуации, когда вы не можете получить доступ к странице плагинов из-за неправильной работы одного из плагинов. Вы можете удалить такой плагин через FTP, или просто деактивировать все плагины с помощью SQL-запроса, чтобы получить доступ к странице настроек плагинов:
UPDATE wp_options SET option_value = '' WHERE option_name = 'active_plugins';
Очистка кэша ленты
WordPress сохраняет кэш ленты в таблице опций и обновляет его при публикации новой записи или через определенный промежуток времени. Если вам нужно очистить кэш ленты, вы можете использовать этот запрос:
DELETE FROM wp_options
WHERE option_name
LIKE ('_transient%_feed_%');
Получение имен всех колонок (полей) в таблице
Чтобы получить имена всех колонок в таблице, можно использовать следующий запрос:
SHOW COLUMNS FROM my_posts;
Или
global $wpdb;
$data = $wpdb->get_results("SHOW COLUMNS FROM $wpdb->posts");
print_r( $data );
Этот запрос вернет все столбцы в таблице wp_posts
и их свойства, такие как тип данных, разрешены ли они пустыми значениями и т.д.