В процессе администрирования сайта на WordPress иногда возникает необходимость массово удалить записи, соответствующие определённым условиям. Например, удалить все записи из категории, которые старше определённой даты, или записи с определённым метаполем. В этой статье мы подробно разберём, как безопасно и эффективно выполнять такие операции с помощью встроенных функций WordPress и небольшого кода.
Почему важно удалять записи программно и безопасно
Удаление записей через административную панель WordPress при большом количестве контента неудобно и неэффективно. Использование SQL-запросов напрямую к базе данных может привести к потере данных или нарушению целостности, если не учитывать все связанные объекты, например, комментарии, метаданные, таксономии.
Поэтому правильным решением будет использование API WordPress — функций, которые обеспечивают нужные проверки и корректное удаление.
Важный момент — всегда делайте резервную копию базы данных перед массовыми операциями удаления.
Подготовка: выбор условий для удаления записей
Для примера рассмотрим удаление записей с пользовательским метаполем clearfy_status, значение которого равно draft, и которые были созданы более 6 месяцев назад.
Вы можете менять условия под свои задачи, используя параметры WP_Query:
- Параметры по дате —
date_query - Параметры таксономий —
tax_query - Параметры метаполей —
meta_query
Пример кода: удаление записей по условию с помощью WP_Query
Создадим функцию clearfy_delete_posts_by_condition(), которая выбирает записи и удаляет их программно.
function clearfy_delete_posts_by_condition() {
// Формируем запрос
$args = [
'post_type' => 'post',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => 'clearfy_status',
'value' => 'draft',
'compare' => '=',
],
],
'date_query' => [
[
'before' => date('Y-m-d', strtotime('-6 months')),
],
],
'fields' => 'ids', // Получаем только ID
];
$query = new WP_Query($args);
if (empty($query->posts)) {
echo 'Нет записей для удаления.';
return;
}
foreach ($query->posts as $post_id) {
// Удаляем запись без перемещения в корзину
wp_delete_post($post_id, true);
echo "Удалена запись с ID: $post_id<br>";
}
}Эту функцию можно вызвать через административный скрипт или добавить в файл functions.php темы (временно для выполнения и потом удалить).
Объяснение кода и рекомендации
Мы используем параметр posts_per_page = -1, чтобы получить все записи, соответствующие условию. При большом количестве записей стоит разбить выполнение на партии, чтобы избежать ограничения памяти и времени выполнения.
Параметр fields = 'ids' позволяет получить только ID записей, что экономит ресурсы.
Функция wp_delete_post($post_id, true) удаляет запись без помещения её в корзину. Если хотите, чтобы записи можно было восстановить, используйте false.
Удаление записей пакетами: пример с ограничением по количеству
Если записей много, лучше удалять по частям. Например, по 50 записей за запуск.
function clearfy_delete_posts_batch($batch_size = 50) {
$args = [
'post_type' => 'post',
'posts_per_page' => $batch_size,
'meta_query' => [
[
'key' => 'clearfy_status',
'value' => 'draft',
'compare' => '=',
],
],
'date_query' => [
[
'before' => date('Y-m-d', strtotime('-6 months')),
],
],
'fields' => 'ids',
];
$query = new WP_Query($args);
if (empty($query->posts)) {
echo 'Нет записей для удаления.';
return false; // Завершаем
}
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
echo "Удалена запись с ID: $post_id<br>";
}
return true; // Есть ещё записи
}Запускайте эту функцию циклом, например, через AJAX или WP-CLI, пока она возвращает true.
Использование WP-CLI для массового удаления записей
WP-CLI — мощный инструмент командной строки для управления WordPress.
Можно написать простое расширение или использовать встроенную команду:
wp post delete $(wp post list --post_type=post --meta_key=clearfy_status --meta_value=draft --date_query='before=6 months ago' --field=ID) --forceЭта команда удалит все посты, подходящие под условия, без помещения в корзину.
Безопасность и рекомендации
- Обязательно делайте резервные копии перед массовыми удалениями.
- Тестируйте код на локальной копии сайта.
- Если удаляете через интерфейс или скрипты, ограничьте доступ по правам.
- Регулярно оптимизируйте базу данных после больших удалений.
Заключение
Удаление записей по условию — частая задача в развитии и поддержке WordPress-сайтов. Использование WP_Query и функций API обеспечивает безопасность и гибкость. Пример кода из статьи можно адаптировать под любые ваши условия удаления.