В процессе эксплуатации сайта на WordPress иногда возникает необходимость автоматически удалять устаревший или неактуальный контент. Это может быть полезно для новостных сайтов, блогов с временными акциями, тестовых проектов или сайтов с ограниченным хранилищем. В этой статье подробно разберем, как создать собственное решение для автоматического удаления постов, страниц или кастомных типов записей по дате их создания или последнего обновления.
Зачем нужно удалять старый контент автоматически
Сохранение слишком большого объема устаревших записей обычно негативно влияет на производительность сайта. Старый контент может не только занимать место в базе данных, но и ухудшать UX, если посетители натыкаются на неактуальную информацию. В ряде случаев, например, при работе с временными акциями или событиями, устаревшие записи просто не нужны и их лучше удалять автоматически.
Автоматизация этого процесса позволяет сэкономить время и снизить риск человеческой ошибки, когда кто-то забывает очистить контент вручную.
Основные способы реализации автоматического удаления
Использование плагинов
Существует несколько плагинов, которые позволяют настроить автоматическое удаление постов по разным правилам. Например:
- Post Expirator — позволяет назначать дату «истечения» для постов, после чего они могут удаляться, изменять статус или перемещаться в архив.
- Auto Delete Posts — плагин для массового удаления записей старше определенного срока.
Хотя плагины удобны, их функционал может быть избыточным или не полностью подходить под конкретные задачи. В таких случаях лучше сделать кастомное решение.
Создание собственного плагина для удаления контента
Давайте рассмотрим, как написать простой плагин, который будет автоматически удалять посты старше 30 дней. Код можно адаптировать под свои нужды — например, выбрать тип записи или изменить период.
<?php
/*
Plugin Name: WPSystem Auto Delete Old Posts
Description: Автоматическое удаление постов старше 30 дней
Version: 1.0
Author: WPsysten.ru
*/
// Функция удаления постов
function wpsystem_delete_old_posts() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '30 days ago',
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true - удаление без перемещения в корзину
}
}
}
// Запускаем функцию ежедневно с помощью cron
add_action('wpsystem_daily_event', 'wpsystem_delete_old_posts');
// Регистрируем событие, если оно не запущено
function wpsystem_activate_cron() {
if (!wp_next_scheduled('wpsystem_daily_event')) {
wp_schedule_event(time(), 'daily', 'wpsystem_daily_event');
}
}
register_activation_hook(__FILE__, 'wpsystem_activate_cron');
// Отключаем cron при деактивации плагина
function wpsystem_deactivate_cron() {
$timestamp = wp_next_scheduled('wpsystem_daily_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpsystem_daily_event');
}
}
register_deactivation_hook(__FILE__, 'wpsystem_deactivate_cron');
?>Этот плагин создает ежедневное задание, которое ищет все опубликованные посты старше 30 дней и удаляет их без перемещения в корзину.
Чтобы изменить тип записи, например, на кастомный product, достаточно заменить параметр 'post_type' => 'post' на 'post_type' => 'product'.
Расширение функционала: удаление по статусу и кастомным метаданным
Иногда требуется удалять не просто по дате, а учитывать статус записи или дополнительные метаданные. Например, удалять только черновики старше 7 дней или посты с определенной меткой.
Для этого в запрос get_posts можно добавить дополнительные параметры:
- Для статуса:
'post_status' => 'draft' - Для мета-запроса:
'meta_query' => array(
array(
'key' => 'wpsystem_delete_flag',
'value' => 'yes',
'compare' => '='
)
)Пример функции с проверкой мета-поля:
function wpsystem_delete_old_flagged_posts() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array('before' => '30 days ago'),
),
'meta_query' => array(
array('key' => 'wpsystem_delete_flag', 'value' => 'yes', 'compare' => '='),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$posts = get_posts($args);
foreach ($posts as $post_id) {
wp_delete_post($post_id, true);
}
}Таким образом, можно гибко настраивать условия удаления.
Практические рекомендации по работе с автоматическим удалением
При реализации автоматического удаления важно помнить:
- Всегда делайте резервные копии базы данных перед включением автоматического удаления.
- Тестируйте работу скриптов сначала на тестовом стенде, чтобы избежать случайных потерь данных.
- Если данные критичны, рассмотрите вариант не удаления, а изменения статуса или перемещения в архив.
- Для повышения безопасности можно добавить логирование удаляемых записей, чтобы отслеживать процесс.
Интеграция с плагином Clearfy Pro для оптимизации
Плагин Clearfy Pro предлагает множество инструментов для оптимизации и очистки WordPress, включая удаление ревизий и мусорных записей. Его можно использовать в связке с собственным плагином для комплексного управления контентом.
Clearfy Pro позволяет настроить автоматическую очистку базы данных по расписанию, что хорошо дополняет кастомные решения для удаления старых постов.
Выводы и полезные ссылки
Автоматическое удаление старого контента — полезная функция для поддержания чистоты и производительности сайта. Используйте готовые плагины для простых задач или создавайте собственные решения для гибкой настройки. Не забывайте о безопасности и тестировании.
Полезные ссылки: