В работе с WordPress часто возникает задача автоматического удаления старых записей, чтобы поддерживать сайт в актуальном состоянии и не захламлять базу данных. В этой статье мы рассмотрим, как реализовать удаление устаревших постов через AJAX, что позволит выполнять процесс без необходимости вручную заходить в админку и обновлять страницу.
Почему стоит удалять старые записи автоматически? Преимущества и особенности
Удаление старых записей помогает оптимизировать базу данных, снижает нагрузку на сервер и повышает скорость сайта. Особенно актуально это для новостных порталов, блогов с большим количеством публикаций, а также для сайтов с временным контентом, например, акциями или событиями.
Автоматизация процесса через AJAX позволяет выполнять удаление без перезагрузки страницы, что удобно для администраторов и снижает вероятность ошибок при ручном удалении.
Также можно настроить регулярные задачи (cron), но AJAX даёт гибкость для выполнения удаления по требованию или с определённой периодичностью при взаимодействии с интерфейсом.
Реализация удаления старых записей через AJAX в WordPress
Создание AJAX обработчика в functions.php
Для начала нужно зарегистрировать AJAX обработчик, который будет принимать запросы на удаление старых постов. Допустим, мы хотим удалять записи старше 180 дней из типа записи post. Вставьте следующий код в файл functions.php вашей темы или в плагин:
function wporg_delete_old_posts_ajax() {
// Проверяем nonce для безопасности
if ( ! isset($_POST['wporg_nonce']) || ! wp_verify_nonce($_POST['wporg_nonce'], 'wporg_delete_old_posts') ) {
wp_send_json_error('Неверный nonce');
wp_die();
}
$days = 180; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => [
[
'before' => $date_threshold,
'inclusive' => true,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_posts = get_posts($args);
if (empty($old_posts)) {
wp_send_json_success('Нет старых записей для удаления');
wp_die();
}
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // принудительное удаление
}
wp_send_json_success(count($old_posts) . ' старых записей удалено');
wp_die();
}
add_action('wp_ajax_wporg_delete_old_posts', 'wporg_delete_old_posts_ajax');Этот код реализует AJAX-обработчик wporg_delete_old_posts, который удаляет все опубликованные записи старше 180 дней.
Добавление JavaScript для вызова AJAX
Чтобы отправлять AJAX-запрос из админки или фронтенда, нужно подключить скрипт и передать туда nonce и URL для AJAX запросов. Добавьте в functions.php:
function wporg_enqueue_admin_script() {
wp_enqueue_script('wporg-admin-ajax', get_template_directory_uri() . '/js/wporg-admin-ajax.js', ['jquery'], null, true);
wp_localize_script('wporg-admin-ajax', 'wporg_ajax_obj', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wporg_delete_old_posts'),
]);
}
add_action('admin_enqueue_scripts', 'wporg_enqueue_admin_script');Создайте файл js/wporg-admin-ajax.js в вашей теме и добавьте туда:
jQuery(document).ready(function($) {
$('#wporg-delete-old-posts-btn').on('click', function(e) {
e.preventDefault();
if (!confirm('Вы уверены, что хотите удалить все старые записи?')) {
return;
}
$.post(wporg_ajax_obj.ajax_url, {
action: 'wporg_delete_old_posts',
wporg_nonce: wporg_ajax_obj.nonce
}, function(response) {
if (response.success) {
alert(response.data);
} else {
alert('Ошибка: ' + response.data);
}
});
});
});Добавление кнопки в админку WordPress
Для удобства добавим кнопку на страницу «Инструменты» в админке, чтобы запускать удаление:
function wporg_register_tools_page() {
add_management_page(
'Удалить старые записи',
'Удалить старые записи',
'manage_options',
'wporg-delete-old-posts',
'wporg_tools_page_callback'
);
}
add_action('admin_menu', 'wporg_register_tools_page');
function wporg_tools_page_callback() {
?>
<div class="wrap">
<h1>Удаление старых записей</h1>
<p>Нажмите на кнопку ниже, чтобы удалить все записи старше 180 дней.</p>
<button id="wporg-delete-old-posts-btn" class="button button-danger">Удалить старые записи</button>
</div>
<?php
}
Использование плагинов для очистки устаревшего контента
Если вы предпочитаете использовать готовые решения, рассмотрите следующие плагины:
- WP Bulk Delete — мощный плагин для массового удаления постов и пользователей по различным критериям, включая дату публикации. Позволяет создавать расписания удаления.
- Auto Delete Posts — простой плагин для автоматического удаления записей по условию старости.
- Clearfy Pro — оптимизационный плагин с функцией удаления устаревших данных, включая посты, ревизии и т.д. Подробнее о нем можно узнать на wpshop.ru.
Преимущество собственных решений на AJAX — гибкость и возможность кастомизации под задачи конкретного сайта.
Советы по безопасности и производительности
При работе с удалением через AJAX обязательно учитывайте безопасность. Используйте wp_nonce для предотвращения CSRF-атак. Проверяйте права пользователя — в нашем примере доступ имеют только администраторы с правом manage_options.
Если записей очень много, удаление всех разом может привести к таймауту. В таких случаях лучше делать удаление партиями, например, по 50 записей за один AJAX-запрос, и запускать следующий запрос после успешного завершения предыдущего.
Вот пример расширения функции для пакетного удаления:
function wporg_delete_old_posts_ajax() {
// Проверка nonce и прав
if ( ! isset($_POST['wporg_nonce']) || ! wp_verify_nonce($_POST['wporg_nonce'], 'wporg_delete_old_posts') ) {
wp_send_json_error('Неверный nonce');
wp_die();
}
if ( ! current_user_can('manage_options') ) {
wp_send_json_error('Нет прав');
wp_die();
}
$days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$batch_size = 50;
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => [
[
'before' => $date_threshold,
'inclusive' => true,
],
],
'fields' => 'ids',
'posts_per_page' => $batch_size,
];
$old_posts = get_posts($args);
if (empty($old_posts)) {
wp_send_json_success('Все старые записи удалены');
wp_die();
}
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
wp_send_json_success(count($old_posts) . ' записей удалено в этом пакете');
wp_die();
}Таким образом, можно вызывать AJAX запросы несколько раз, пока не удалятся все старые записи. Это улучшит стабильность и снизит нагрузку.
Заключение
Удаление старых записей через AJAX — удобное и эффективное решение для управления контентом и оптимизации базы данных в WordPress. Комбинация собственного кода и проверенных плагинов позволяет выбрать подходящий способ для любого проекта.
Если хотите расширить функционал, обратите внимание на Clearfy Pro, который предлагает дополнительные инструменты для оптимизации и автоматизации.