В процессе работы с WordPress часто возникает необходимость автоматически удалять старые записи, например, устаревшие посты, события или пользовательские типы записей, чтобы поддерживать актуальность контента и оптимизировать базу данных. В этой статье мы подробно рассмотрим, как реализовать автоматическое удаление старых записей через AJAX, что позволит выполнять эту задачу без перезагрузки страницы и с возможностью тонкой настройки.
Почему стоит использовать AJAX для удаления старых записей
Удаление старых записей — это типичная задача обслуживания сайта, которую можно реализовать несколькими способами. Самый простой — запускать cron-задачи на сервере, однако это не всегда удобно, особенно если нужно дать администратору контроль над процессом через интерфейс.
AJAX позволяет отправлять запросы к серверу асинхронно, без перезагрузки страницы, что удобно для взаимодействия с пользователем, например, для запуска очистки из админки и отображения результата в реальном времени. Кроме того, AJAX позволяет ограничить нагрузку, удаляя записи порциями.
Подготовка: выбор типа и критерия удаления
Для начала определимся, какие записи будем удалять. Это могут быть стандартные посты (post), страницы (page) или кастомные типы записей (custom_post_type). В примерах мы будем использовать стандартные записи и удалять все посты старше определённой даты.
Критерий удаления — дата публикации. Например, удалять посты, опубликованные более 180 дней назад. Такой подход подходит для новостных сайтов, где важно хранить только свежие материалы.
Создание AJAX-обработчика в WordPress
Добавим в functions.php вашей темы или в собственный плагин следующий код, который реализует AJAX-обработчик:
add_action('wp_ajax_wpma_delete_old_posts', 'wpma_delete_old_posts_callback');
function wpma_delete_old_posts_callback() {
// Проверяем права пользователя
if (!current_user_can('manage_options')) {
wp_send_json_error('Нет доступа');
}
// Безопасность
check_ajax_referer('wpma_delete_nonce', 'security');
$days = isset($_POST['days']) ? intval($_POST['days']) : 180;
$date_query = array(
'before' => date('Y-m-d', strtotime("-{$days} days")),
'inclusive' => true,
);
$args = array(
'post_type' => 'post',
'date_query' => array($date_query),
'posts_per_page' => 20, // удаляем по 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) . ' записей удалено');
}
Обратите внимание на проверку прав и nonce для безопасности. Также мы ограничиваем удаление пачками по 20 записей, чтобы избежать тайм-аутов.
Добавление JavaScript для вызова AJAX из админки
Теперь добавим скрипт, который будет отправлять AJAX-запрос при нажатии кнопки. Для удобства создадим простую панель в админке с кнопкой запуска удаления.
В functions.php добавим регистрацию страницы и подключение скрипта:
add_action('admin_menu', 'wpma_register_delete_old_posts_page');
function wpma_register_delete_old_posts_page() {
add_submenu_page(
'tools.php',
'Удаление старых записей',
'Удаление старых записей',
'manage_options',
'wpma-delete-old-posts',
'wpma_delete_old_posts_page_callback'
);
}
function wpma_delete_old_posts_page_callback() {
?>
<div class="wrap">
<h1>Удаление старых записей через AJAX</h1>
<p>Нажмите кнопку, чтобы удалить записи старше указанного количества дней.</p>
<input type="number" id="wpma-days" value="180" min="1" /> дней<br><br>
<button id="wpma-delete-btn" class="button button-primary">Удалить старые записи</button>
<div id="wpma-result" style="margin-top:20px;"></div>
</div>
<script>
jQuery(document).ready(function($) {
$('#wpma-delete-btn').on('click', function() {
var days = parseInt($('#wpma-days').val()) || 180;
$('#wpma-result').html('Удаление...');
$.post(ajaxurl, {
action: 'wpma_delete_old_posts',
days: days,
security: '<?php echo wp_create_nonce('wpma_delete_nonce'); ?>'
}, function(response) {
if(response.success) {
$('#wpma-result').html('<span style="color:green;">' + response.data + '</span>');
} else {
$('#wpma-result').html('<span style="color:red;">Ошибка: ' + response.data + '</span>');
}
});
});
});
</script>
<?php
}
Этот интерфейс позволяет администратору задать количество дней и запустить удаление. Результат отображается сразу.
Расширение: удаление пользовательских типов записей и по таксономиям
Если у вас есть кастомные типы записей, например, «события» (event) или «продукты» (product), вы можете расширить функцию wpma_delete_old_posts_callback следующим образом:
$post_types = array('post', 'event', 'product');
$args = array(
'post_type' => $post_types,
'date_query' => array($date_query),
'posts_per_page' => 20,
'fields' => 'ids',
'post_status' => 'any',
);
Также можно добавить фильтр по таксономиям, например, удалять только записи из определённой категории:
$args['tax_query'] = array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'novosti',
),
);
Такая гибкость позволяет точно настроить удаление под нужды сайта.
Использование плагина Clearfy Pro для автоматизации
Если вы хотите более простой способ с графическим интерфейсом и дополнительными возможностями, обратите внимание на плагин Clearfy Pro. Этот плагин содержит инструменты для очистки базы, удаления ревизий, старых записей и оптимизации сайта без написания кода.
Советы по безопасности и производительности
Удаление записей — операция, которая может повлиять на данные сайта, поэтому:
- Всегда проверяйте права пользователя и nonce в AJAX-запросах.
- Ограничивайте количество удаляемых записей за один запрос, чтобы избежать тайм-аутов.
- Рекомендуется делать резервные копии перед массовым удалением.
- Тестируйте скрипты на тестовой среде.
Следуя этим рекомендациям, вы сможете безопасно и эффективно автоматизировать удаление старых записей на вашем сайте WordPress.