В процессе ведения сайта на WordPress часто возникает необходимость автоматизировать удаление устаревших записей. Например, новостные сайты или блоги с большим объемом контента могут перегружать базу данных и замедлять работу, если старые посты неактуальны и их нужно периодически удалять. В этой статье мы рассмотрим, как с помощью WPDetect можно создать эффективное решение для автоматического удаления старых постов по дате публикации и статусу, используя как готовые плагины, так и собственный код.
Зачем нужна автоматизация удаления старых постов в WordPress
Ручное удаление записей – процесс трудоемкий и рискованный, особенно если контента много. Автоматизация позволяет:
- Поддерживать базу данных в актуальном состоянии.
- Уменьшить нагрузку на сервер.
- Избежать накопления мусорного контента.
- Экономить время администратора сайта.
Однако важно правильно настроить критерии удаления, чтобы не потерять важные материалы.
Выбор плагина для автоматического удаления старых постов
Плагин WP Crontrol для создания задач удаления
WP Crontrol позволяет управлять и создавать задачи cron в WordPress. Мы можем написать функцию, которая удаляет посты по условию, и запускать её по расписанию.
Установка:
- Перейдите в «Плагины» → «Добавить новый».
- В поиске введите «WP Crontrol» и установите плагин.
- Активируйте его.
После установки создадим функцию удаления и зарегистрируем задачу:
function wpdetect_delete_old_posts() {
$args = array(
'date_query' => array(
array(
'before' => '1 year ago', // Удаляем посты старше года
'inclusive' => true,
),
),
'post_type' => 'post',
'post_status' => 'publish',
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_posts = get_posts($args);
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // Удаляем без возможности восстановления
}
}
// Регистрация события cron
if (! wp_next_scheduled('wpdetect_delete_old_posts_hook')) {
wp_schedule_event(time(), 'daily', 'wpdetect_delete_old_posts_hook');
}
add_action('wpdetect_delete_old_posts_hook', 'wpdetect_delete_old_posts');
Эта функция удалит все опубликованные посты старше одного года. Задача будет запускаться ежедневно.
Плагин Auto Post Scheduler с фильтрацией по дате
Auto Post Scheduler позволяет автоматически публиковать, а также удалять посты. В настройках можно задать параметры для удаления устаревших записей. Однако гибкость ограничена по сравнению с собственным кодом.
Создание собственного плагина для WPDetect: удаление постов по дате и статусу
Если нужна максимальная кастомизация, создадим минимальный плагин. Для этого создайте в папке wp-content/plugins директорию wpdetect-auto-delete и в ней файл wpdetect-auto-delete.php со следующим содержимым:
<?php
/**
* Plugin Name: WPDetect Auto Delete Old Posts
* Description: Автоматическое удаление старых постов по дате и статусу.
* Version: 1.0
* Author: WPDetect
*/
function wpdetect_auto_delete_old_posts() {
$args = array(
'date_query' => array(
array(
'before' => '6 months ago', // Удаляем посты старше 6 месяцев
'inclusive' => true,
),
),
'post_type' => 'post',
'post_status' => array('draft', 'pending', 'trash'), // Можно указать несколько статусов
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_posts = get_posts($args);
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // Без возможности восстановления
}
}
register_activation_hook(__FILE__, 'wpdetect_auto_delete_schedule');
register_deactivation_hook(__FILE__, 'wpdetect_auto_delete_unschedule');
function wpdetect_auto_delete_schedule() {
if (! wp_next_scheduled('wpdetect_auto_delete_hook')) {
wp_schedule_event(time(), 'weekly', 'wpdetect_auto_delete_hook');
}
}
function wpdetect_auto_delete_unschedule() {
wp_clear_scheduled_hook('wpdetect_auto_delete_hook');
}
add_action('wpdetect_auto_delete_hook', 'wpdetect_auto_delete_old_posts');
Этот плагин будет раз в неделю удалять посты со статусом «черновик», «ожидает проверки» и «корзина», которые старше 6 месяцев.
Как избежать нежелательных удалений: рекомендации и фильтры
Важно перед удалением проверять, нет ли у поста важных метаданных или связей с другими элементами сайта. Например, можно добавить фильтр по категории:
function wpdetect_filter_posts_to_delete($post_id) {
$categories = wp_get_post_categories($post_id);
// Не удалять посты из категории "Важное"
$protected_cat_id = 10;
if (in_array($protected_cat_id, $categories)) {
return false;
}
return true;
}
function wpdetect_auto_delete_old_posts_safe() {
$args = array(
'date_query' => array(
array(
'before' => '1 year ago',
'inclusive' => true,
),
),
'post_type' => 'post',
'post_status' => 'publish',
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_posts = get_posts($args);
foreach ($old_posts as $post_id) {
if (wpdetect_filter_posts_to_delete($post_id)) {
wp_delete_post($post_id, true);
}
}
}
Таким образом, можно защитить ключевой контент от удаления.
Дополнительные советы по работе с удалением постов
- Перед автоматическим удалением делайте резервную копию базы данных.
- Тестируйте скрипты на тестовом сайте, чтобы избежать потерь.
- Используйте локальные статусы и метки для более тонкой фильтрации.
- Настраивайте расписание cron под нагрузку вашего хостинга.
В итоге автоматизация удаления старых постов с помощью WPDetect и собственных решений позволит поддерживать ваш сайт в чистоте и порядке, сохраняя актуальность контента и снижая нагрузку на систему.