Зачем автоматизировать удаление старых записей в WordPress
С течением времени на сайте WordPress накапливается большое количество записей, которые могут быть уже неактуальными или неинтересными для пользователей. Это не только загромождает админ-панель, но и замедляет работу сайта, влияет на производительность базы данных и усложняет навигацию.
Ручное удаление всех устаревших материалов — трудоёмкий процесс, особенно если их сотни или тысячи. Поэтому автоматизация удаления старых записей — важная задача для поддержания здоровья сайта и оптимизации его работы.
В этой статье рассмотрим, как настроить автоматическое удаление записей по дате, используя кастомный код и готовые плагины. Приведём примеры практических решений, которые можно адаптировать под свои нужды.
Автоматическое удаление старых записей через пользовательский код
Самый гибкий способ — добавить в файл functions.php вашей темы или в отдельный плагин кастомный код, который будет запускаться по расписанию и удалять записи старше заданного срока.
Создание cron-задачи для удаления записей
WordPress содержит встроенную систему планировщика задач — WP-Cron. Мы можем зарегистрировать свою задачу, которая будет запускаться, например, раз в сутки и удалять записи старше 1 года.
function wplesson_schedule_old_posts_deletion() {
if ( ! wp_next_scheduled( 'wplesson_delete_old_posts_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wplesson_delete_old_posts_hook' );
}
}
add_action( 'wp', 'wplesson_schedule_old_posts_deletion' );
function wplesson_delete_old_posts() {
global $wpdb;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( '-1 year' ) );
// Получаем ID записей старше 1 года
$old_posts = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' AND post_date < %s",
$date_threshold
) );
if ( ! empty( $old_posts ) ) {
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, true ); // true — удаляет без возможности восстановления
}
}
}
add_action( 'wplesson_delete_old_posts_hook', 'wplesson_delete_old_posts' );Этот код создаёт ежедневное событие, которое удаляет все опубликованные записи старше одного года. Можно менять условие фильтрации, например, тип записи или срок хранения.
Добавление настройки срока хранения в админке
Для удобства можно добавить опцию в меню настроек, чтобы менять период хранения записей без правки кода. Вот простой пример добавления поля с настройкой:
function wplesson_register_settings() {
add_options_page(
'Настройки удаления старых записей',
'Удаление старых записей',
'manage_options',
'wplesson-delete-old-posts',
'wplesson_delete_old_posts_settings_page'
);
}
add_action( 'admin_menu', 'wplesson_register_settings' );
function wplesson_delete_old_posts_settings_page() {
if ( isset( $_POST['wplesson_days'] ) && check_admin_referer( 'wplesson_save_settings' ) ) {
update_option( 'wplesson_days', intval( $_POST['wplesson_days'] ) );
echo '<div class="updated"><p>Настройки сохранены</p></div>';
}
$days = get_option( 'wplesson_days', 365 );
?>
<div class="wrap">
<h1>Настройки удаления старых записей</h1>
<form method="post">
<?php wp_nonce_field( 'wplesson_save_settings' ); ?>
<label>Удалять записи старше (дней):</label>
<input type="number" name="wplesson_days" value="<?php echo esc_attr( $days ); ?>" min="1" />
<input type="submit" class="button button-primary" value="Сохранить">
</form>
</div>
<?php
}
// Изменяем функцию удаления, чтобы использовать настройку
function wplesson_delete_old_posts() {
global $wpdb;
$days = get_option( 'wplesson_days', 365 );
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$old_posts = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' AND post_date < %s",
$date_threshold
) );
if ( ! empty( $old_posts ) ) {
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, true );
}
}
}Теперь администратор сможет менять период хранения записей через настройки WordPress.
Использование плагинов для удаления старых записей
Если вы не хотите писать код, существуют плагины, которые решают задачу удаления устаревших записей автоматически.
Плагин WP Bulk Delete
WP Bulk Delete — мощный и гибкий плагин для массового удаления записей по разным условиям, включая дату создания, категорию, таксономии и метаданные.
Основные возможности:
- Удаление записей старше заданного количества дней.
- Фильтрация по типу записи, статусу, категории, тегам.
- Настройка расписания для автоматического удаления.
- Логирование удалённых записей.
Для установки и настройки:
- Установите плагин через админку WordPress или скачайте с официального репозитория.
- Перейдите в меню WP Bulk Delete > Delete Posts.
- Выберите условия удаления, например, «Posts older than X days».
- Настройте расписание, чтобы удаление происходило автоматически.
- Сохраните и активируйте задачу.
Плагин Auto Delete Posts
Auto Delete Posts — простой плагин, который позволяет удалить записи автоматически через заданный период после публикации. Очень удобно для сайтов с временным контентом, например, новостей или акций.
Для настройки:
- Установите плагин из репозитория WordPress.
- В настройках укажите, через сколько дней после публикации записи нужно удалять.
- Плагин будет автоматически очищать старые записи.
Минус — меньше гибкости по сравнению с WP Bulk Delete, но для базовых задач подойдёт отлично.
Особенности и рекомендации при автоматическом удалении
Резервное копирование перед удалением
Перед автоматическим удалением любых данных всегда делайте резервную копию базы данных. Это позволит вернуть записи в случае ошибки или если удалились нужные материалы.
Рекомендуется использовать плагины для бэкапов, например, UpdraftPlus или WPBackItUp.
Проверка условий удаления
Чётко задавайте условия для удаления, чтобы не потерять важные записи. Например, можно исключить определённые категории или посты с определёнными метками.
В коде это можно реализовать дополнительными условиями в SQL-запросе или фильтрах в плагинах.
Отслеживание результатов удаления
Полезно вести лог операций удаления, особенно если процесс автоматизирован. Так вы будете знать, какие записи и когда были удалены.
В плагине WP Bulk Delete есть встроенное логирование, для кастомного кода можно добавить запись в специальный файл или таблицу.
Пример расширения кода: исключение определённых категорий
Если нужно удалить старые записи, но сохранить материалы из определённых категорий, можно добавить условие в SQL-запрос:
function wplesson_delete_old_posts_exclude_categories() {
global $wpdb;
$days = get_option( 'wplesson_days', 365 );
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Указываем ID категорий, которые не нужно удалять
$excluded_cats = array(1, 5); // замените на ваши ID
$excluded_cats_placeholders = implode( ',', array_fill( 0, count( $excluded_cats ), '%d' ) );
$query = $wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->term_relationships} tr ON (p.ID = tr.object_id)
LEFT JOIN {$wpdb->term_taxonomy} tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
WHERE p.post_type = 'post' AND p.post_status = 'publish'
AND p.post_date < %s
AND (tt.taxonomy != 'category' OR tt.term_id NOT IN ($excluded_cats_placeholders))",
array_merge( array( $date_threshold ), $excluded_cats )
);
$old_posts = $wpdb->get_col( $query );
if ( ! empty( $old_posts ) ) {
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, true );
}
}
}Так вы защитите важные категории от удаления при автоматической очистке.