Удаление проблемных постов в WordPress по заданным условиям

При работе с WordPress иногда возникает необходимость автоматизировать удаление постов, которые соответствуют определённым критериям — например, устаревшие, неактуальные, содержащие ошибки или нарушающие правила сайта. В этой статье мы разберём, как создавать кастомные функции для поиска и удаления таких постов по заданным условиям, а также как запускать их автоматически через WP-Cron.

Почему важна автоматизация удаления проблемных постов

Удаление постов вручную может занимать много времени, особенно если их сотни или тысячи. Кроме того, забыв удалить устаревшую или неправильную информацию, вы рискуете ухудшить пользовательский опыт и SEO. Автоматизация позволяет:

  • регулярно очищать базу данных от нежелательного контента;
  • поддерживать актуальность и качество сайта;
  • экономить время и силы администратора;
  • снизить нагрузку на сервер за счёт уменьшения размера базы данных.

Для реализации этой задачи нам понадобятся базовые знания PHP, WP_Query и WP-Cron.

Как создать функцию для удаления постов по условию

Для начала определимся с условиями, по которым будем удалять посты. Например, удалим все опубликованные записи, у которых в метаполе review_status стоит значение rejected. Такой сценарий часто используется для сайтов с модерацией пользовательских публикаций.

Создадим функцию wpbe_delete_rejected_posts, которая найдёт такие записи и удалит их.

function wpbe_delete_rejected_posts() {
    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'meta_key' => 'review_status',
        'meta_value' => 'rejected',
        'posts_per_page' => -1
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            wp_delete_post(get_the_ID(), true); // true - удаление без перемещения в корзину
        }
        wp_reset_postdata();
    }
}

Функция ищет все публикации с метаполем review_status и значением rejected, затем полностью удаляет их из базы.

Расширение условий поиска постов

Вы можете легко менять условия в массиве $args. Например, удалять посты, опубликованные раньше определённой даты, или с определённой категорией.

Пример удаления постов, опубликованных более 1 года назад:

function wpbe_delete_old_posts() {
    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'date_query' => array(
            array(
                'before' => '1 year ago'
            ),
        ),
        'posts_per_page' => -1
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            wp_delete_post(get_the_ID(), true);
        }
        wp_reset_postdata();
    }
}

Автоматический запуск удаления с помощью WP-Cron

Чтобы не запускать удаление вручную, создадим задание WP-Cron, которое будет запускать функцию по расписанию.

Регистрация события WP-Cron

Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:

if (!wp_next_scheduled('wpbe_delete_rejected_posts_event')) {
    wp_schedule_event(time(), 'daily', 'wpbe_delete_rejected_posts_event');
}

add_action('wpbe_delete_rejected_posts_event', 'wpbe_delete_rejected_posts');

Этот код регистрирует ежедневное выполнение события wpbe_delete_rejected_posts_event, которое вызывает функцию удаления.

Удаление планировщика при деактивации плагина или темы

Чтобы избежать возможных проблем, рекомендуется очищать расписание при отключении плагина:

function wpbe_deactivate_cleanup() {
    $timestamp = wp_next_scheduled('wpbe_delete_rejected_posts_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpbe_delete_rejected_posts_event');
    }
}
register_deactivation_hook(__FILE__, 'wpbe_deactivate_cleanup');

Дополнительные советы и рекомендации

Безопасность и резервное копирование

Удаление постов — необратимая операция, особенно с параметром $force_delete = true. Обязательно делайте резервные копии базы данных перед внедрением автоматического удаления. Можно также настроить отправку уведомления на email после выполнения удаления, чтобы отслеживать процесс.

Оптимизация производительности

При большом количестве постов не стоит удалять все сразу. Лучше обрабатывать по частям, добавив параметр 'posts_per_page' => 50 и запуская удаление несколько раз по расписанию.

Использование плагинов для расширения функционала

Если хочется упростить процесс, посмотрите плагин Clearfy Pro. Он содержит инструменты для массового редактирования и удаления постов по разным условиям, а также оптимизирует работу сайта.

Также можно использовать WP-Cron Manager для удобного управления задачами WP-Cron через админку.

Выводы

Автоматическое удаление проблемных постов в WordPress — мощный инструмент для поддержки чистоты и актуальности сайта. С помощью кастомных функций и WP-Cron можно гибко настраивать условия удаления и запускать процесс по расписанию. Обязательно учитывайте безопасность, делайте бэкапы и контролируйте работу системы, чтобы избежать потери важных данных.

⭐⭐⭐⭐⭐