В современном управлении сайтом на WordPress часто возникает необходимость регулярно удалять устаревшие записи — будь то новости, акции, или временный контент. Ручное удаление неудобно и занимает много времени, особенно если таких записей много. В этой статье разберем, как автоматизировать удаление устаревших постов с помощью AJAX, а также как связать эту логику с WP Cron для периодического запуска без участия пользователя.
Почему стоит использовать AJAX для удаления записей в WordPress
Удаление записей по расписанию удобно реализовать через WP Cron, но иногда требуется инициировать этот процесс вручную или с фронтенда, например, чтобы пользователь мог запускать очистку без перезагрузки страницы. AJAX позволяет отправлять запросы на сервер в фоне и получать ответ без перезагрузки, что улучшает UX.
С помощью AJAX вы можете:
- Запускать процесс удаления по кнопке в админке или на фронтенде;
- Отслеживать прогресс удаления и показывать уведомления;
- Обеспечить безопасность через проверку nonce и прав пользователя.
Создание AJAX-обработчика для удаления устаревших записей
Для начала создадим функцию, которая будет удалять записи старше определенной даты. Для примера возьмем посты типа post, опубликованные более 30 дней назад.
function wphow_delete_old_posts() {
if ( ! current_user_can('manage_options') ) {
wp_send_json_error('Нет прав на выполнение действия');
}
check_ajax_referer('wphow_delete_old_posts_nonce', 'security');
$args = array(
'post_type' => 'post',
'date_query' => array(
array(
'before' => '30 days ago',
),
),
'posts_per_page' => 20,
'fields' => 'ids',
'post_status' => 'any',
);
$old_posts = get_posts($args);
if ( empty($old_posts) ) {
wp_send_json_success('Нет устаревших записей для удаления');
}
foreach ( $old_posts as $post_id ) {
wp_delete_post($post_id, true);
}
wp_send_json_success(count($old_posts) . ' устаревших записей удалено');
}
add_action('wp_ajax_wphow_delete_old_posts', 'wphow_delete_old_posts');Здесь мы делаем запрос постов старше 30 дней, получаем их ID и удаляем принудительно ($force_delete = true), чтобы миновать корзину. Функция проверяет права пользователя и nonce для безопасности.
Регистрация скрипта и локализация данных для AJAX
Теперь добавим кнопку и JS, который будет отправлять AJAX-запрос. В functions.php подключим скрипт и передадим ему необходимые параметры.
function wphow_enqueue_admin_scripts() {
wp_enqueue_script('wphow-admin-ajax', get_template_directory_uri() . '/js/wphow-admin-ajax.js', array('jquery'), '1.0', true);
wp_localize_script('wphow-admin-ajax', 'wphowAjax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wphow_delete_old_posts_nonce'),
));
}
add_action('admin_enqueue_scripts', 'wphow_enqueue_admin_scripts');На странице админки (например, в собственном меню или в существующем разделе) выводим кнопку:
<button id="wphow-delete-old-posts">Удалить устаревшие записи</button>
<div id="wphow-delete-result"></div>JavaScript для обработки нажатия кнопки
jQuery(document).ready(function($) {
$('#wphow-delete-old-posts').on('click', function() {
$('#wphow-delete-result').text('Удаление...');
$.post(wphowAjax.ajax_url, {
action: 'wphow_delete_old_posts',
security: wphowAjax.nonce
}, function(response) {
if (response.success) {
$('#wphow-delete-result').text(response.data);
} else {
$('#wphow-delete-result').text('Ошибка: ' + response.data);
}
});
});
});Настройка автоматического удаления через WP Cron
Чтобы запускать удаление устаревших записей регулярно, например, раз в сутки, используем WP Cron. Добавим планировщик и свяжем его с нашей функцией удаления.
function wphow_schedule_old_posts_deletion() {
if ( ! wp_next_scheduled('wphow_cron_delete_old_posts') ) {
wp_schedule_event(time(), 'daily', 'wphow_cron_delete_old_posts');
}
}
add_action('wp', 'wphow_schedule_old_posts_deletion');
function wphow_cron_delete_old_posts_callback() {
$args = array(
'post_type' => 'post',
'date_query' => array(
array('before' => '30 days ago'),
),
'posts_per_page' => 20,
'fields' => 'ids',
'post_status' => 'any',
);
$old_posts = get_posts($args);
foreach ( $old_posts as $post_id ) {
wp_delete_post($post_id, true);
}
}
add_action('wphow_cron_delete_old_posts', 'wphow_cron_delete_old_posts_callback');Этот код проверяет, запланировано ли событие, и если нет — создает его на ежедневный запуск. Функция-обработчик удаляет записи по тому же принципу, что и AJAX-версия.
Рекомендации по безопасности и производительности
При автоматическом удалении важно учитывать нагрузку на сервер. Рекомендуется:
- Удалять ограниченное число записей за один запуск (например, 20), чтобы избежать тайм-аутов.
- Использовать транзиенты или опции для отслеживания прогресса при большом объеме.
- Обязательно проверять права и nonce в AJAX, чтобы избежать несанкционированных вызовов.
Также полезно добавить логирование действий удаления, чтобы можно было отследить, когда и какие записи были удалены.
Применение плагинов для расширения функционала
Если не хочется писать код с нуля, можно обратить внимание на плагины для автоматизации. Например, Clearfy Pro позволяет оптимизировать работу сайта и включает инструменты для очистки базы данных, которые можно настроить на удаление устаревших данных.
Для более гибкой настройки можно использовать плагин WPRemark, который позволяет создавать удобные интерфейсы для управления контентом и его очистки.
Итоги и советы
Автоматизация удаления устаревших записей через AJAX и WP Cron — мощный инструмент для поддержания чистоты и актуальности базы данных WordPress. Такой подход уменьшает нагрузку на администраторов и повышает производительность сайта.
Важно тщательно тестировать код на тестовом сайте, соблюдать безопасность и учитывать нагрузку на сервер при большом количестве данных.
Используйте приведенные примеры как основу, адаптируя под свои задачи и расширяя функциональность в зависимости от требований проекта.