Автоматизация удаления неиспользуемых постов в WordPress помогает поддерживать базу данных в чистоте и улучшает производительность сайта. В этой статье мы подробно рассмотрим, как с помощью WPDetect создать скрипт, который будет удалять посты определённых типов и статусов, используя встроенные возможности WordPress и пример плагина с кодом.
Почему важно удалять неиспользуемые посты
С течением времени на вашем сайте могут накапливаться посты, которые больше не нужны: черновики, авто-сохранения, устаревшие записи, тестовые материалы. Они занимают место в базе данных и могут замедлять работу сайта, осложнять администрирование. Автоматическое удаление таких записей помогает:
- Оптимизировать размер базы данных.
- Уменьшить время отклика сайта.
- Облегчить поисковую индексацию.
- Упростить администрирование.
Ручное удаление не всегда удобно и надёжно, особенно если таких постов много. Автоматизация решает эту проблему.
Как работает удаление постов по типу и статусу в WordPress
WordPress хранит записи в таблице wp_posts, где у каждой записи есть поля post_type и post_status. Например, типы могут быть post, page, или кастомные типы. Статусы — publish, draft, trash, auto-draft и другие.
Удаление постов можно сделать либо через интерфейс, либо программно с помощью функции wp_delete_post(). Для массового удаления применяют WP_Query с нужными параметрами и циклом удаления.
Создаём плагин для автоматического удаления неиспользуемых постов
Для примера создадим простой плагин wpdetect-cleanup, который будет удалять посты с типом post и статусом draft, старше 30 дней. Его можно запускать вручную или настроить через cron.
<?php
/**
* Plugin Name: WPDetect Cleanup
* Description: Автоматическое удаление черновиков старше 30 дней.
* Version: 1.0
* Author: WPDetect
*/
// Основная функция удаления
function wpdetect_cleanup_delete_old_drafts() {
$args = [
'post_type' => 'post',
'post_status' => 'draft',
'date_query' => [
[
'before' => '30 days ago',
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
];
$query = new WP_Query($args);
if (empty($query->posts)) {
return;
}
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true); // true - без перемещения в корзину
}
}
// Регистрируем крон-задачу
register_activation_hook(__FILE__, function() {
if (!wp_next_scheduled('wpdetect_cleanup_cron_hook')) {
wp_schedule_event(time(), 'daily', 'wpdetect_cleanup_cron_hook');
}
});
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('wpdetect_cleanup_cron_hook');
});
// Хук на запуск задачи
add_action('wpdetect_cleanup_cron_hook', 'wpdetect_cleanup_delete_old_drafts');
// Для ручного запуска через админку можно добавить функцию или страницу
?>Расширяем функциональность: удаление по нескольким типам и статусам
В реальном проекте нужно удалять посты не только с типом post и статусом draft, но и, например, авто-сохранения, кастомные типы, или удалять только опубликованные с определёнными метками. Для этого достаточно расширить параметры WP_Query:
$args = [
'post_type' => ['post', 'custom_type'],
'post_status' => ['draft', 'auto-draft'],
'date_query' => [
[
'before' => '60 days ago',
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
];Такой подход позволяет гибко настраивать очистку базы и избегать случайного удаления нужного контента.
Советы по безопасности и бэкапу перед удалением
Перед автоматическим удалением важно:
- Настроить резервное копирование базы данных. Можно использовать плагины, например Backup plugins.
- Тестировать скрипт на копии сайта, чтобы убедиться, что удаляются только нужные записи.
- Временно использовать удаление с перемещением в корзину (
wp_delete_post($post_id, false)), чтобы иметь возможность восстановить случайно удалённые записи. - Логировать процесс удаления, чтобы отслеживать какие посты были удалены и когда.
Пример логирования удаления постов
Добавим в функцию логирование в файл wp-content/uploads/wpdetect-cleanup.log:
function wpdetect_cleanup_log($message) {
$upload_dir = wp_upload_dir();
$log_file = $upload_dir['basedir'] . '/wpdetect-cleanup.log';
$date = date('Y-m-d H:i:s');
file_put_contents($log_file, "[$date] $message\n", FILE_APPEND);
}
function wpdetect_cleanup_delete_old_drafts() {
$args = [
'post_type' => 'post',
'post_status' => 'draft',
'date_query' => [
[
'before' => '30 days ago',
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
];
$query = new WP_Query($args);
if (empty($query->posts)) {
wpdetect_cleanup_log('No drafts found to delete.');
return;
}
foreach ($query->posts as $post_id) {
if (wp_delete_post($post_id, true)) {
wpdetect_cleanup_log("Deleted post ID $post_id");
} else {
wpdetect_cleanup_log("Failed to delete post ID $post_id");
}
}
}Альтернативные плагины для автоматизации очистки
Если вы не хотите писать код, можно использовать готовые решения из репозитория WordPress или с wpshop.ru:
- WP-Sweep — очищает базу данных от ревизий, черновиков и мусора.
- Advanced Database Cleaner — позволяет создавать расписания очистки, удалять посты и метаданные.
- Clearfy Pro (на wpshop.ru) — содержит множество инструментов оптимизации, включая очистку базы.
Эти плагины часто имеют удобный интерфейс и гибкие настройки, но написание собственного кода даёт полный контроль и возможность интеграции в существующую систему.
Заключение по теме удаления неиспользуемых постов
Автоматизация удаления неиспользуемых постов по типу и статусу — важный шаг к поддержанию здоровья сайта на WordPress. Используя WPDetect подход с собственным плагином, вы можете точно контролировать, какие записи удаляются и когда, сохраняя при этом безопасность данных и давая себе возможность быстро восстанавливать записи в случае ошибки.
Не забывайте делать резервные копии и тестировать новые скрипты на тестовом окружении. При грамотном подходе автоматизация значительно облегчит вашу работу и повысит производительность сайта.