В процессе работы с WordPress часто возникает необходимость массово удалять записи, которые содержат в своих мета-полях устаревшие даты. Например, если вы используете кастомное мета-поле для хранения даты события или публикации, и хотите удалить все записи, дата которых старше определённого срока, стандартных средств в админке WordPress нет. В этой статье разберёмся, как эффективно и безопасно это сделать с помощью кода и плагинов.
Почему возникает необходимость удаления записей по дате в мета-поле
Часто в проектах на WordPress для хранения дополнительной информации о записи используются мета-поля. Например, для событий — дата проведения, для заказов — дата выполнения, и т.п. Со временем часть данных становится неактуальной, и чтобы не засорять базу, нужно удалить устаревшие записи.
Удаление по дате в самом WordPress по умолчанию возможно только по дате публикации записи, но не по кастомному мета-полю. Поэтому нужно писать кастомный запрос.
Если таких записей много, ручное удаление не подходит, также это может повлиять на производительность сайта, если не оптимизировать запросы.
Используем WP_Query для поиска записей по мета-полю с датой
Первый шаг — получить список записей, у которых дата в мета-поле меньше нужной. Предположим, что мета-поле называется wpin_event_date, и в нём хранится дата в формате YYYY-MM-DD.
Для выборки используем класс WP_Query с параметром meta_query:
$args = [
'post_type' => 'post', // или ваш тип записи
'meta_query' => [
[
'key' => 'wpin_event_date',
'value' => '2023-01-01', // дата отсечки
'compare' => '<',
'type' => 'DATE',
]
],
'posts_per_page' => -1,
'fields' => 'ids', // чтобы получить только ID
];
$query = new WP_Query($args);
$old_post_ids = $query->posts;Так мы получим ID всех записей с датой в мета-поле раньше 1 января 2023 года.
Удаление найденных записей через wp_delete_post
Теперь, когда у нас есть массив ID, можно пройтись по ним и удалить записи программно. Важно использовать функцию wp_delete_post с параметром $force_delete = true, если нужна полная физическая очистка без перемещения в корзину.
foreach ($old_post_ids as $post_id) {
wpin_delete_old_records_wp_delete_post($post_id);
}
function wpin_delete_old_records_wp_delete_post($post_id) {
wp_delete_post($post_id, true); // Удаляет запись без корзины
}Такой подход безопасен, так как запускает все хуки и очищает связанные данные.
Автоматизация задачи с помощью WP-CLI и планировщика задач WordPress
Если необходимо регулярно удалять устаревшие записи, лучше автоматизировать процесс:
- Создать WP-CLI команду, которая запускает удаление;
- Добавить планировщик событий через
wp_schedule_event, чтобы запускать её ежедневно или еженедельно; - Либо настроить cron на сервере для вызова WP-CLI команды.
Пример регистрации планировщика для удаления:
add_action('wp', function() {
if (!wp_next_scheduled('wpin_delete_old_records_cron')) {
wp_schedule_event(time(), 'daily', 'wpin_delete_old_records_cron');
}
});
add_action('wpin_delete_old_records_cron', function() {
$args = [
'post_type' => 'post',
'meta_query' => [
[
'key' => 'wpin_event_date',
'value' => date('Y-m-d', strtotime('-1 year')),
'compare' => '<',
'type' => 'DATE',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
});Плагины для управления и удаления записей с условиями по мета-полям
Если вы не хотите писать код, можно использовать специализированные плагины, которые позволяют фильтровать и удалять записи по мета-полям:
- Bulk Delete — позволяет создавать условия по мета-полям, дате, категориям и массово удалять записи;
- WP Bulk Delete — похожий функционал с возможностью автоматизации;
- Advanced Database Cleaner — помогает чистить базу, в том числе устаревшие записи и метаданные.
Минус плагинов — иногда сложнее настроить точные условия, а код даёт максимальную гибкость и контроль.
Особенности и предостережения при удалении записей по мета-дате
Перед массовым удалением обязательно сделайте резервную копию базы данных. Если мета-поле используется в других местах — убедитесь, что удаление не нарушит логику сайта.
Также помните, что при большом количестве записей стоит разбивать удаление на порции (например, по 50 штук), чтобы избежать таймаута и нагрузки на сервер.
Если на сайте есть кеширование, после удаления стоит выполнить его очистку, чтобы не показывать устаревший контент.
Выводы и рекомендации
Удаление записей по дате в мета-поле — частая задача при работе с кастомными типами записей и метаданными. Использование WP_Query с мета-запросом и функция wp_delete_post дают полный контроль и надежность.
Автоматизация через WP-CLI и планировщик позволяет не забывать про чистку и поддерживать базу в порядке.
Если код кажется сложным — плагины Bulk Delete и аналоги помогут быстро решить задачу с минимальными усилиями.