В процессе эксплуатации сайта на WordPress часто возникает необходимость автоматически удалять устаревший контент, например, посты, которым больше определённого времени. Это помогает поддерживать актуальность сайта и экономить ресурсы сервера. В этой статье мы подробно разберём, как создать собственный плагин для автоматического удаления старых постов, используя WordPress API и WP-Cron.
Почему стоит использовать собственный плагин для удаления старых постов?
Многие решают подобную задачу с помощью готовых плагинов, но в ряде случаев – особенно при уникальных требованиях – лучше написать собственное решение. Это даёт следующие преимущества:
- Полный контроль над логикой удаления.
- Возможность кастомизации под типы записей и условия.
- Отсутствие лишнего функционала и нагрузок от сторонних плагинов.
Примером может служить ситуация, когда нужно удалять только опубликованные записи старше 365 дней, но не трогать страницы или черновики.
Создание базового плагина: структура и подключение WP-Cron
Начнём с создания базового плагина. Создайте папку wpboard-auto-delete-posts в каталоге wp-content/plugins, а в ней файл wpboard-auto-delete-posts.php с таким содержимым:
<?php
/*
Plugin Name: WPBoard Auto Delete Old Posts
Description: Автоматическое удаление устаревших постов старше заданного срока.
Version: 1.0
Author: WPBoard
*/
// Защита от прямого запуска
if (!defined('ABSPATH')) {
exit;
}
// Активируем CRON задачу при активации плагина
register_activation_hook(__FILE__, 'wpboard_activate_auto_delete_cron');
function wpboard_activate_auto_delete_cron() {
if (!wp_next_scheduled('wpboard_cron_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpboard_cron_delete_old_posts');
}
}
// Отключаем CRON задачу при деактивации плагина
register_deactivation_hook(__FILE__, 'wpboard_deactivate_auto_delete_cron');
function wpboard_deactivate_auto_delete_cron() {
wp_clear_scheduled_hook('wpboard_cron_delete_old_posts');
}
// Подписываем функцию на событие
add_action('wpboard_cron_delete_old_posts', 'wpboard_delete_old_posts');
// Основная функция удаления
function wpboard_delete_old_posts() {
$days = 365; // Удалять посты старше 365 дней
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array($date_query),
'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 — принудительное удаление без корзины
}
}
}
Этот код создаёт ежедневное задание, которое удаляет все опубликованные посты старше 365 дней.
Настройка и расширение плагина: выбор типов записей и условий
В реальном проекте нужно часто более гибко настраивать условия удаления. Например, удалять записи только из определённой категории или исключать определённые посты. Для этого можно добавить настройки в админке.
Пример расширения для удаления постов только из категории с ID 10 и 15:
function wpboard_delete_old_posts() {
$days = 365;
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array($date_query),
'category__in' => array(10, 15),
'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);
}
}
}
Для добавления страницы настроек плагина используйте add_options_page и сохранение параметров через update_option. Это позволит администратору менять количество дней и категории через интерфейс.
Оптимизация и безопасность удалений
Удаление большого количества постов может вызвать нагрузку на сервер и проблемы с производительностью. Рекомендуется:
- Разбивать удаление на партии, например, по 20 постов за один запуск.
- Логировать удалённые посты для восстановления при ошибках.
- Использовать nonce и права доступа, если реализуется интерфейс управления.
Пример удаления партиями:
function wpboard_delete_old_posts() {
$days = 365;
$batch_size = 20;
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array($date_query),
'fields' => 'ids',
'posts_per_page' => $batch_size,
);
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
error_log("WPBoard: Deleted post ID {$post_id}");
}
}
}
Советы по отладке и мониторингу работы плагина
Для проверки работы плагина полезно:
- Временно запускать функцию удаления вручную через админку или WP-CLI.
- Использовать плагины для мониторинга запланированных задач, например, WP Crontrol, который позволит видеть и запускать cron задачи вручную.
- Проверять журналы ошибок сервера и логи плагина.
Альтернативные решения и полезные плагины
Если не хотите писать плагин с нуля, можно использовать готовые решения с похожим функционалом:
- Auto Delete Posts – простой плагин для удаления постов по возрасту.
- Clearfy Pro – в составе набора оптимизаций есть возможности по очистке и удалению устаревших данных. Подробнее на wpshop.ru.
Но собственный плагин всегда можно дополнить или интегрировать с ними для расширения функционала.