В работе с WordPress часто возникает необходимость автоматически удалять записи, которые соответствуют определённым условиям. Один из распространённых вариантов — удаление записей по заданному значению custom field (meta-атрибута). В этой статье подробно разберём, как реализовать удаление таких записей через встроенный механизм cron WordPress. Это решение особенно полезно для сайтов с большим количеством контента, где нужно периодически чистить устаревшие или неактуальные записи по мета-данным.
Почему стоит использовать cron для удаления записей по meta
Удаление записей по meta-атрибуту вручную — трудоёмкая и рискованная задача, особенно если записей много и фильтрация сложная. Автоматизация через cron позволяет:
- Регулярно очищать базу без вашего постоянного участия;
- Снижать нагрузку на сайт за счёт удаления ненужного контента;
- Избегать ошибок при ручном удалении;
- Настраивать удаление по любым условиям, заданным в meta-полях.
Для примера возьмём ситуацию, когда нужно удалять записи типа post с meta-ключом wplike_expire_date, у которых дата истекла.
Настройка WP cron: планирование задачи удаления записей
WordPress имеет встроенный псевдокрон — WP-Cron. Для автоматизации удаления создадим задачу, которая будет запускаться, например, раз в сутки.
Регистрация события cron
Добавьте в файл functions.php вашей темы или в собственный плагин следующий код:
// Регистрируем новую задачу cron с интервалом в сутки
if (!wp_next_scheduled('wplike_cron_delete_expired_posts')) {
wp_schedule_event(time(), 'daily', 'wplike_cron_delete_expired_posts');
}
Если нужен нестандартный интервал, можно добавить свой интервал через фильтр cron_schedules:
add_filter('cron_schedules', 'wplike_add_cron_interval');
function wplike_add_cron_interval($schedules) {
$schedules['every_six_hours'] = [
'interval' => 6 * 3600,
'display' => __('Каждые 6 часов')
];
return $schedules;
}
Создание функции удаления записей
Теперь напишем функцию, которая будет вызываться по cron и удалять записи:
add_action('wplike_cron_delete_expired_posts', 'wplike_delete_expired_posts');
function wplike_delete_expired_posts() {
global $wpdb;
$today = date('Y-m-d');
// Получаем ID записей с истекшей датой в meta
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID
WHERE pm.meta_key = %s
AND pm.meta_value < %s
AND p.post_type = 'post'
AND p.post_status = 'publish'",
'wplike_expire_date', $today
));
if (!empty($post_ids)) {
foreach ($post_ids as $post_id) {
wp_delete_post($post_id, true); // true — удаление без перемещения в корзину
}
}
}
Обратите внимание, что в meta_value хранится дата в формате YYYY-MM-DD. Если формат другой — нужно адаптировать сравнение.
Отладка и проверка работы cron задачи
Для проверки, что cron работает корректно, можно использовать плагин WP Crontrol. Он позволяет смотреть список запланированных задач, запускать их вручную и удалять.
Также полезно добавить логирование удаления, чтобы видеть, когда и какие записи удалялись:
function wplike_delete_expired_posts() {
global $wpdb;
$today = date('Y-m-d');
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID
WHERE pm.meta_key = %s
AND pm.meta_value < %s
AND p.post_type = 'post'
AND p.post_status = 'publish'",
'wplike_expire_date', $today
));
if (!empty($post_ids)) {
foreach ($post_ids as $post_id) {
wp_delete_post($post_id, true);
error_log('Удалена запись ID: ' . $post_id);
}
} else {
error_log('Нет записей для удаления по cron ' . date('Y-m-d H:i:s'));
}
}
Дополнительные советы и рекомендации
1. Если на сайте много записей, лучше запускать удаление партиями, например по 50 штук за один запуск, чтобы не перегружать сервер.
2. Для более сложных условий можно использовать WP_Query с meta_query, но для массового удаления быстрее будет прямой SQL-запрос.
3. Убедитесь, что cron запускается регулярно. На некоторых хостингах WP-Cron не срабатывает без посещений сайта. Для надёжности настройте системный cron, который вызывает wp-cron.php.
Полезные плагины для управления cron и удалением записей
- Clearfy Pro — содержит инструменты для оптимизации и управления задачами cron;
- WP Crontrol — визуальный менеджер cron задач;
- Quizle, WPRemark — пригодятся для сайтов с пользовательским контентом, где тоже могут понадобиться подобные автоматизации;
- Если нужен более гибкий контроль — можно написать отдельный плагин с вашей логикой удаления.
Таким образом, автоматическое удаление записей по мета-атрибуту через cron — удобный и эффективный способ поддерживать базу данных WordPress в актуальном состоянии, снижать нагрузку и автоматизировать процессы администрирования.