В некоторых проектах на WordPress возникает необходимость автоматически удалять записи, у которых определённое метаполе указывает на дату или срок устаревания. Это может быть полезно для новостных сайтов, каталогов, сайтов с акциями или временными предложениями. В этой статье разберём, как грамотно и эффективно реализовать автоматическое удаление старых записей по значению метаполя, используя WP Cron и кастомный PHP-код.
Почему важно удалять устаревшие записи автоматически
Ручное удаление устаревших материалов не всегда удобно и быстро, особенно если на сайте много записей. Автоматизация процесса позволяет:
- Поддерживать базу данных в оптимальном состоянии, не захламляя её миллионами неактуальных записей.
- Избежать показа пользователям устаревшего контента и ошибок в логике сайта.
- Снизить нагрузку на сервер и улучшить скорость работы сайта.
Для реализации такого функционала в WordPress нам потребуется написать функцию, проверяющую метаполе и удаляющую записи, срок которых истёк, а также настроить WP Cron для регулярного запуска этой функции.
Определяем метаполе и формат даты
Для примера предположим, что у нас есть метаполе с ключом expiration_date, в котором хранится дата истечения срока записи в формате YYYY-MM-DD. При достижении этой даты запись должна быть удалена.
Если у вас другой формат или ключ, заменяйте их в коде соответственно.
Создаём функцию для удаления устаревших записей
Ниже пример функции wpdeveloper_delete_expired_posts(), которая делает запрос к базе, получает записи с установленным метаполем и датой истечения не позже текущей, и удаляет их программно.
function wpdeveloper_delete_expired_posts() {
$today = date('Y-m-d');
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'expiration_date',
'value' => $today,
'compare' => '<=',
'type' => 'DATE',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$expired_posts = get_posts($args);
if (!empty($expired_posts)) {
foreach ($expired_posts as $post_id) {
wp_delete_post($post_id, true); // true - удалить без возможности восстановления
}
}
}Обратите внимание, что мы используем wp_delete_post с параметром true для полного удаления. Если хотите сначала отправлять записи в корзину, замените true на false или опустите параметр.
Настраиваем WP Cron для регулярного запуска функции
Чтобы функция автоматически запускалась, нужно зарегистрировать событие WP Cron. Например, чтобы проверять устаревшие записи раз в сутки.
if (!wp_next_scheduled('wpdeveloper_daily_expired_posts_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpdeveloper_daily_expired_posts_cleanup');
}
add_action('wpdeveloper_daily_expired_posts_cleanup', 'wpdeveloper_delete_expired_posts');Этот код добавьте в файл functions.php активной темы или в отдельный плагин. Он проверит, запланировано ли уже событие, и если нет, создаст ежедневное задание, которое будет запускать нашу функцию.
Обработка ошибок и логирование
Для отладки и контроля полезно добавить логирование в файл, чтобы знать, когда и какие записи удаляются.
function wpdeveloper_delete_expired_posts() {
$today = date('Y-m-d');
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'expiration_date',
'value' => $today,
'compare' => '<=',
'type' => 'DATE',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$expired_posts = get_posts($args);
if (!empty($expired_posts)) {
foreach ($expired_posts as $post_id) {
if(wp_delete_post($post_id, true)) {
error_log('wpdeveloper: удалена запись ID ' . $post_id . ' по дате истечения ' . $today);
} else {
error_log('wpdeveloper: не удалось удалить запись ID ' . $post_id);
}
}
} else {
error_log('wpdeveloper: нет записей для удаления на ' . $today);
}
}Это поможет отследить работу скрипта в файле журнала ошибок PHP.
Дополнительные рекомендации и плагины
Для более сложных случаев можно расширить функционал:
- Удалять записи не сразу, а переводить в черновики или кастомный статус перед удалением.
- Отправлять уведомления администратору о списке удалённых записей.
- Добавлять пользовательский интерфейс в админке для управления настройками автоудаления.
Если хочется использовать готовые решения, обратите внимание на плагины:
- Post Expirator — позволяет назначать даты удаления или изменения статуса постов прямо из редактора.
- Clearfy Pro — содержит расширенные инструменты оптимизации, включая управление автоматизацией.
Заключение по теме автоудаления по метаполю
Автоматическое удаление записей по дате в метаполе — удобный и мощный инструмент управления контентом WordPress. Правильно настроенный код и cron-задача помогут поддерживать сайт в актуальном состоянии без лишних усилий. При необходимости расширения функционала можно интегрировать уведомления, дополнительные статусы и пользовательские настройки.