В процессе работы с WordPress иногда возникает необходимость удалить записи определённого типа по заданному условию. Например, удалить все записи кастомного типа «product» с определённым метаполем или удалить устаревшие записи по дате. В этой статье я расскажу, как грамотно и безопасно реализовать такую задачу с помощью WP_Query и стандартных функций WordPress, а также дам пример кода, который легко адаптировать под свои нужды.
Почему стандартное удаление через админку не всегда подходит
Если записей много, удалять их вручную неудобно и долго. Кроме того, в админке нельзя задать сложные условия, например, удалить записи по значению метаполя или по кастомному полю. В таких случаях лучше использовать программный подход — он позволяет автоматизировать процесс и избежать ошибок.
Важно помнить, что массовое удаление записей — операция необратимая, поэтому всегда делайте резервные копии базы данных перед выполнением скриптов.
Как сформировать запрос для выборки записей по условию
Для выборки записей определённого типа и условия лучше всего использовать класс WP_Query. Это стандартный инструмент WordPress для выборки записей с возможностью задавать условия по метаполям, датам, таксономиям и другим параметрам.
Например, допустим, у вас есть кастомный тип записи product, и вы хотите удалить записи с метаполем status, равным obsolete. Вот пример запроса:
$args = [
'post_type' => 'product',
'posts_per_page' => -1, // выбрать все
'meta_query' => [
[
'key' => 'status',
'value' => 'obsolete',
'compare' => '='
]
]
];
$query = new WP_Query($args);Этот запрос выберет все записи продуктов, у которых метаполе status равно obsolete. Аналогично можно использовать условия по дате, таксономиям и другим параметрам.
Пример функции для удаления записей по условию
Далее рассмотрим пример функции, которая удалит записи с типом product и метаполем status=obsolete. Функция будет использовать wp_delete_post() с аргументом true для жесткого удаления (без перемещения в корзину).
function wpsource_delete_products_obsolete() {
// Параметры запроса
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => 'status',
'value' => 'obsolete',
'compare' => '='
]
],
'fields' => 'ids' // выбрать только ID для оптимизации
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
echo 'Нет записей для удаления.';
return;
}
foreach ($query->posts as $post_id) {
// Удаляем запись без возможности восстановления
wp_delete_post($post_id, true);
echo "Удалена запись ID: $post_id<br>";
}
}
// Вызов функции (например, можно подключить к хуку или запускать вручную)
wpsource_delete_products_obsolete();В этом коде мы сначала делаем выборку всех записей с нужным условием, затем удаляем каждую по одной. Использование параметра 'fields' => 'ids' уменьшает нагрузку, т.к. нам нужны только ID.
Удаление записей по дате или другим условиям
Аналогично можно выбрать записи по дате, например, удалить все записи типа news, опубликованные более года назад:
$args = [
'post_type' => 'news',
'posts_per_page' => -1,
'date_query' => [
[
'before' => '1 year ago'
]
],
'fields' => 'ids'
];
$query = new WP_Query($args);
// Далее удаление по тому же принципу
Это полезно, если нужно регулярно чистить архивы или устаревший контент.
Как интегрировать удаление в админ-панель или планировщик задач
Для удобства можно добавить кнопку в админку, которая будет запускать удаление, или настроить WP-Cron для периодического запуска функции.
Например, для запуска по крону:
if (!wp_next_scheduled('wpsource_delete_obsolete_hook')) {
wp_schedule_event(time(), 'daily', 'wpsource_delete_obsolete_hook');
}
add_action('wpsource_delete_obsolete_hook', 'wpsource_delete_products_obsolete');Так вы будете автоматически удалять устаревшие записи ежедневно.
Рекомендации и предосторожности
- Перед удалением сделайте бэкап базы данных.
- Тестируйте код на тестовом окружении.
- Убедитесь, что правильно задали условие выборки, чтобы не удалить нужный контент.
- Для массовых операций используйте
fields = 'ids'для оптимизации. - При большом объёме записей лучше реализовать удаление пакетами, чтобы избежать превышения лимита памяти и таймаута.
Альтернативные плагины для массового удаления записей
Если не хотите писать код, можно использовать плагины, например:
- Clearfy Pro – содержит инструменты для очистки базы и массового удаления контента по условиям.
- WPRemark – расширение с удобными настройками для массовых операций с записями.
Тем не менее, программный подход всегда гибче и позволяет полностью контролировать процесс.