В повседневной работе с WordPress иногда возникает необходимость массово удалить записи — будь то устаревшие материалы, записи с определённым мета-полем или посты, которые соответствуют специфическим условиям. В этой статье я подробно расскажу, как эффективно и безопасно удалить записи по условию программно, используя стандартные средства WordPress и собственные функции.
Почему важно правильно удалять записи в WordPress
Простое удаление записей через админку подходит для единичных случаев, но если задача — очистить сотни или тысячи постов, ручной способ неэффективен. Использование SQL-запросов напрямую к базе данных опасно, так как можно нарушить целостность данных и потерять связи между записями (например, метаданные, таксономии, вложения). Поэтому правильное программное удаление через WordPress API — залог корректной работы сайта.
К тому же, WordPress обеспечивает вызов всех необходимых хуков и функций, например, wp_delete_post и удаляет связанные с записью данные.
Используем WP_Query для выборки записей по условию
Первый шаг — найти все записи, которые нужно удалить. Для этого удобно использовать класс WP_Query. Например, если нужно удалить все записи с мета-полем expired равным 1.
$args = [
'post_type' => 'post',
'meta_query' => [
[
'key' => 'expired',
'value' => '1',
'compare' => '='
]
],
'posts_per_page' => -1,
'fields' => 'ids' // Чтобы получить только ID
];
$query = new WP_Query($args);
Использование 'fields' => 'ids' значительно ускоряет запрос, так как возвращаются только ID записей.
Удаление записей с помощью wp_delete_post
После получения ID можно пройтись по ним циклом и удалить каждую запись через wp_delete_post. Этот метод учитывает все зависимости, триггеры и безопасен.
foreach($query->posts as $post_id) {
wp_delete_post($post_id, true); // true — удаляет без перемещения в корзину
}
Если не указать второй параметр или выставить его в false, записи попадут в корзину. При большом объёме данных это может быть полезно для возможности восстановления, но требует дополнительного очищения корзины.
Обработка большого количества записей и время выполнения
При удалении тысяч записей важно избегать превышения времени выполнения скрипта. Чтобы это сделать, можно выполнять удаление пакетами, например, по 100 записей за раз, и запускать процесс через AJAX или WP-Cron.
Пример пакетной обработки:
$batch_size = 100;
$args['posts_per_page'] = $batch_size;
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
// Здесь можно запланировать следующий пакет
}
Такой подход предотвращает зависание и ошибки.
Пример функции expertreview_delete_posts_by_meta для переиспользования
Для удобства и повторного использования можно обернуть логику в функцию с префиксом домена:
function expertreview_delete_posts_by_meta($meta_key, $meta_value, $post_type = 'post', $batch_size = 100) {
$args = [
'post_type' => $post_type,
'meta_query' => [
[
'key' => $meta_key,
'value' => $meta_value,
'compare' => '='
]
],
'posts_per_page' => $batch_size,
'fields' => 'ids'
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
return 0; // Нет записей для удаления
}
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
return count($query->posts);
}
// Использование:
$deleted_count = expertreview_delete_posts_by_meta('expired', '1');
echo "Удалено записей: $deleted_count";
Плагины для массового удаления записей по условию
Если хотите избежать кода, рекомендую плагины:
- Bulk Delete — позволяет удалять записи по разным условиям (категории, мета-поля, дата и др.). Есть бесплатная версия и расширения.
- WP Bulk Delete — похожий функционал, удобный интерфейс для создания правил удаления.
Оба плагина хорошо подходят для регулярной очистки сайта и поддерживают работу с кастомными типами записей.
Рекомендации по безопасности и производительности
Перед массовым удалением обязательно сделайте резервную копию базы данных. Даже если используете wp_delete_post, ошибки могут привести к потере данных.
Для сайтов с большой базой данных лучше тестировать удаление сначала на копии или использовать пакетное удаление.
Если вы используете кастомные связи (например, плагин Expert Review для отзывов), убедитесь, что удаление записей корректно очищает связанные данные. Для этого можно добавить дополнительные хуки или расширить функцию удаления.
Заключение
Удаление записей по условию в WordPress — задача, решаемая с помощью комбинации WP_Query и wp_delete_post. Важно делать это через API, чтобы не повредить целостность данных. Для массовых операций рекомендуется пакетный режим и резервное копирование. Для тех, кто предпочитает готовые решения, подходят плагины Bulk Delete и WP Bulk Delete.
Используйте пример функции expertreview_delete_posts_by_meta как основу для своих задач, адаптируя под конкретные условия.
Подробнее о плагинах для оптимизации и автоматизации сайта вы можете узнать на WPSHOP.ru.