Ведение сайта WordPress нередко требует регулярного очищения устаревшего контента. Особенно это актуально, если на вашем ресурсе используются таксономии, например, категории или метки, для структурирования записей. В этой статье подробно разберём, как автоматизировать удаление старого контента именно по таксономиям, используя PHP-код и поддерживая безопасность сайта.
Почему важно удалять старый контент по таксономиям
Удаление устаревших записей помогает сохранять базу данных в оптимальном состоянии, ускорять работу сайта и улучшать индексирование поисковиками. Если просто удалять по дате, можно нечаянно удалить важные материалы, относящиеся к определённым темам. Поэтому фильтрация по таксономиям позволяет более тонко контролировать процесс.
Например, если у вас есть таксономия «новости» и «обзоры», вы можете настроить удаление новостей старше 1 года, а обзоры сохранять дольше.
Подготовка к автоматизации удаления
Перед любыми действиями с удалением необходимо:
- Сделать полную резервную копию сайта и базы данных.
- Проверить, что у вас есть доступ к файловой системе и возможность добавлять код в functions.php или создавать небольшой плагин.
- Понять структуру таксономий и какие именно нужно обрабатывать.
Для автоматизации будем использовать WP Cron — встроенный планировщик задач WordPress.
Создание функции для удаления записей по таксономиям и дате
Ниже приведён пример функции, которая удаляет все записи, относящиеся к заданной таксономии, старше определённой даты.
function wpcource_delete_old_posts_by_taxonomy() {
$taxonomy = 'category'; // Замените на нужную таксономию
$term_slug = 'novosti'; // Слаг термина таксономии
$days = 365; // Удалять записи старше 365 дней
$date_query = array(
array(
'column' => 'post_date',
'before' => date('Y-m-d', strtotime("-{$days} days"))
),
);
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'date_query' => $date_query,
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $term_slug,
),
),
'fields' => 'ids',
'post_status' => 'publish',
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true); // true — удалить без возможности восстановления
}
}
}
В этом коде мы ищем все опубликованные записи, относящиеся к категории с слагом novosti, которым больше 365 дней, и удаляем их без возможности восстановления.
Автоматизация с WP Cron
Чтобы запускать функцию регулярно, например, раз в сутки, добавим планировщик.
function wpcource_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wpcource_daily_old_posts_deletion')) {
wp_schedule_event(time(), 'daily', 'wpcource_daily_old_posts_deletion');
}
}
add_action('wp', 'wpcource_schedule_old_posts_deletion');
add_action('wpcource_daily_old_posts_deletion', 'wpcource_delete_old_posts_by_taxonomy');
Этот код регистрирует ежедневное событие, которое будет запускать функцию удаления.
Разделение удаления по разным таксономиям
Если нужно удалять по нескольким таксономиям с разными условиями, можно расширить функцию и использовать массив настроек.
function wpcource_delete_old_posts_multiple_taxonomies() {
$settings = array(
array('taxonomy' => 'category', 'term' => 'novosti', 'days' => 365),
array('taxonomy' => 'category', 'term' => 'obzory', 'days' => 730),
);
foreach ($settings as $setting) {
$date_query = array(
array(
'column' => 'post_date',
'before' => date('Y-m-d', strtotime("-{$setting['days']} days"))
),
);
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'date_query' => $date_query,
'tax_query' => array(
array(
'taxonomy' => $setting['taxonomy'],
'field' => 'slug',
'terms' => $setting['term'],
),
),
'fields' => 'ids',
'post_status' => 'publish',
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
}
Использование плагинов для управления удалением
Если вы не хотите писать код, можно использовать плагины, которые помогают управлять устаревшим контентом по таксономиям:
- Delete Posts By Date — позволяет удалять посты по дате и категориям через интерфейс.
- WP Bulk Delete — мощный плагин с возможностью фильтрации по таксономиям и дате, поддерживает планирование удаления.
Эти плагины можно найти на wpshop.ru с подробными инструкциями по установке и настройке.
Советы по безопасности и оптимизации
Перед тем как автоматизировать удаление:
- Обязательно делайте резервные копии базы данных.
- Тестируйте код сначала на тестовом сайте.
- Используйте wp_delete_post() с параметром
trueдля полного удаления, иначе запись попадёт в корзину. - Если записей много, разбивайте удаление на части, чтобы избежать ошибок по времени исполнения.
Пример разбивки удаления по 50 записей за раз:
function wpcource_delete_old_posts_batch() {
$taxonomy = 'category';
$term_slug = 'novosti';
$days = 365;
$date_query = array(
array(
'column' => 'post_date',
'before' => date('Y-m-d', strtotime("-{$days} days"))
),
);
$args = array(
'post_type' => 'post',
'posts_per_page' => 50,
'date_query' => $date_query,
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $term_slug,
),
),
'fields' => 'ids',
'post_status' => 'publish',
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
Запускайте эту функцию по Cron с нужной периодичностью, чтобы контролировать нагрузку.
Резюме
Автоматизация удаления старого контента по таксономиям — отличный способ поддерживать порядок на сайте и оптимизировать работу. Используйте приведённые примеры кода как основу и адаптируйте под свои задачи, а при необходимости дополняйте функционал плагинами. Важно тщательно тестировать любые изменения и всегда иметь резервные копии.