В процессе работы сайта на WordPress часто возникает необходимость автоматически удалять устаревшие записи, например, посты новостей, акции или кастомные типы записей, которые потеряли актуальность. Ручное удаление – трудоемкий и ошибкоопасный процесс, особенно при большом объеме контента. Решением является использование встроенного планировщика задач WP-Cron для автоматизации удаления старых записей.
Что такое WP-Cron и зачем он нужен для удаления записей
WP-Cron — это имитация системного cron, встроенная в ядро WordPress. Она срабатывает при обращении к сайту и позволяет запускать запланированные задачи (хук-обработчики) через определенные интервалы времени. Благодаря WP-Cron вы можете создавать свои расписания для регулярного выполнения функций, например, удаления старых записей.
Главное преимущество — не нужно иметь доступ к системному планировщику, все работает на уровне WordPress, что удобно для хостингов с ограничениями.
Однако у WP-Cron есть свои особенности: задачи срабатывают только при посещении сайта, что может влиять на точность запуска. Для критичных задач рекомендуется настраивать системный cron или использовать сервисы внешнего мониторинга.
Как реализовать автоматическое удаление старых записей — пример кода
Рассмотрим пример, как настроить удаление записей старше 30 дней в стандартном типе постов post. Для кастомных типов (my_custom_post) алгоритм аналогичен.
Добавьте следующий код в functions.php вашей темы или в отдельный плагин:
function wpskill_schedule_old_posts_deletion() {
if ( ! wp_next_scheduled( 'wpskill_delete_old_posts_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpskill_delete_old_posts_hook' );
}
}
add_action( 'wp', 'wpskill_schedule_old_posts_deletion' );
function wpskill_delete_old_posts() {
$days = 30; // количество дней для хранения
$date_query = array(
'before' => date('Y-m-d', strtotime("-{$days} days")),
'inclusive' => true,
);
$query_args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array( $date_query ),
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_posts = get_posts( $query_args );
if ( ! empty( $old_posts ) ) {
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, true ); // true — безвозвратное удаление
}
}
}
add_action( 'wpskill_delete_old_posts_hook', 'wpskill_delete_old_posts' );Объяснение кода:
wpskill_schedule_old_posts_deletion— функция проверяет, запланирована ли уже задача удаления, и если нет — создает ее, чтобы запускать ежедневно.wpskill_delete_old_posts— функция, которая ищет все посты старше 30 дней и удаляет их без возможности восстановления.- Хук
wpskill_delete_old_posts_hookсвязывает расписание с функцией удаления.
Как адаптировать код под кастомные типы записей
Для удаления кастомных типов записей (my_custom_post) замените в $query_args значение post_type:
'post_type' => 'my_custom_post',Если вы хотите не удалять записи, а менять их статус на черновик, замените функцию wp_delete_post на wp_update_post:
wp_update_post( array(
'ID' => $post_id,
'post_status' => 'draft'
) );Как проверить работу и отладить WP-Cron задачи
Чтобы убедиться, что задача работает корректно, можно использовать плагин WP Crontrol. Он позволяет просматривать, редактировать и запускать запланированные задачи вручную.
Советы по отладке:
- Проверьте, что на сайте вообще вызывается WP-Cron. Для этого можно добавить временный лог или выводить информацию.
- Убедитесь, что не запланировано несколько одинаковых задач.
- Проверьте права пользователя, под которым выполняется код (для удаления постов нужны права администратора или соответствующие возможности).
Примеры плагинов для автоматизации очистки контента
Если вы не хотите писать код, можно воспользоваться готовыми решениями:
- Auto Delete Posts — позволяет настроить удаление постов по дате публикации с гибкими условиями.
- WP Bulk Delete — мощный плагин для массового удаления записей по различным критериям, включая дату.
- Clearfy Pro — расширенный инструмент для оптимизации и очистки сайта, который может помочь с автоматизацией.
Однако написанный вручную код дает максимум контроля и позволяет встроить логику в вашу бизнес-модель.
Рекомендации по безопасности и резервному копированию
Удаление записей безвозвратно уничтожает данные. Перед внедрением автоматического удаления обязательно:
- Создайте резервную копию базы данных.
- Проверьте работу скрипта на тестовом сайте.
- Добавьте дополнительные условия фильтрации, если нужно сохранять важные записи.
Для более сложных сценариев можно добавить логирование удаленных записей или отправку уведомлений администратору.
Итоги
Использование WP-Cron для автоматического удаления старых записей — простой и эффективный способ поддерживать порядок на сайте, освобождать базу данных и улучшать производительность. Приведенный пример легко адаптируется под любые типы записей и требования. При необходимости используйте плагины для удобства, либо комбинируйте их с собственным кодом для максимальной гибкости.
Подробнее о плагинах и инструментах для оптимизации WordPress смотрите на WPSHOP.ru.