20+ полезных SQL запросов для управления WordPress данныеой. Удаление неактуальных тегов, изменение пароля пользователей, деактивация плагинов и другие манипуляции.

# 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 и их свойства, такие как тип данных, разрешены ли они пустыми значениями и т.д.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *