Автоматическое сохранение черновиков — важная функция для любого сайта на WordPress, особенно если вы часто работаете с длинными или сложными материалами. Стандартный механизм автосохранения WordPress сохраняет контент каждые 60 секунд, но иногда этого недостаточно, или нужно добавить дополнительные возможности по контролю и уведомлениям. В этой статье мы подробно рассмотрим, как реализовать более гибкое и надежное автоматическое сохранение черновиков с помощью собственного кода и полезных плагинов.
Почему стандартного автосохранения WordPress может быть недостаточно
Встроенный механизм автосохранения WordPress сохраняет изменения каждые 60 секунд, создавая отдельный ревизионный пост-черновик. Это работает, но у него есть ряд ограничений:
- Интервал автосохранения нельзя изменить через настройки, нужна доработка кода.
- Нет информирования пользователя о сохранении или проблемах.
- Автосохранения не всегда защищают от потери данных, если браузер или сессия неожиданно закрываются.
- Отсутствует возможность кастомизации логики сохранения для специализированных типов записей.
Поэтому часто необходимо расширить функционал автосохранения, особенно для сайтов с большим объемом контента и сложной структурой.
Как изменить интервал автосохранения черновиков в WordPress
Для начала разберемся, как сделать более частое или редкое автосохранение. WordPress использует константу AUTOSAVE_INTERVAL, которую можно переопределить в файле wp-config.php или в теме/плагине.
define('AUTOSAVE_INTERVAL', 30); // интервал в секундах, например 30 секунд
Если вы хотите сделать это динамически в плагине или functions.php темы, можно использовать фильтр autosave_interval:
add_filter('autosave_interval', 'wpgenerate_autosave_interval');
function wpgenerate_autosave_interval() {
return 30; // автосохранение каждые 30 секунд
}
Это простое решение, но его стоит использовать с осторожностью, чтобы не перегружать сервер слишком частыми запросами.
Добавление уведомлений о статусе автосохранения
Пользователь должен понимать, что данные успешно сохранились. Для этого можно добавить в редактор визуальный индикатор статуса автосохранения с помощью JavaScript, используя события WordPress и REST API.
Пример простого скрипта, который выводит уведомление в админке при успешном автосохранении:
function wpgenerate_autosave_notification() {
?>
<script>
jQuery(document).ready(function($) {
$(document).on('autosave', function() {
$('#wpgenerate-autosave-status').remove();
$('<div id="wpgenerate-autosave-status" style="position: fixed; bottom: 10px; right: 10px; background: #46b450; color: white; padding: 5px 10px; border-radius: 3px; z-index: 9999;">Автосохранение успешно</div>').appendTo('body').fadeOut(3000);
});
});
</script>
<?php
}
add_action('admin_footer-post.php', 'wpgenerate_autosave_notification');
add_action('admin_footer-post-new.php', 'wpgenerate_autosave_notification');
Этот код добавляет небольшое всплывающее сообщение внизу экрана при срабатывании события автосохранения.
Улучшенные плагины для автосохранения и управления черновиками
Если хочется готовое решение с расширенными функциями, рекомендую обратить внимание на следующие плагины:
- WP Autosave — добавляет более частое автосохранение, поддерживает уведомления и позволяет настроить поведение.
- Clearfy Pro — платный плагин с набором оптимизаций, в том числе улучшенным автосохранением и контролем ревизий.
- WPRemark — позволяет добавлять заметки и комментарии к черновикам, что удобно при командной работе.
Как создать кастомное автоматическое сохранение для типов записей
Иногда нужно не просто автосохранение стандартного поста, а более сложная логика, например, для пользовательских типов записей (custom post types). Рассмотрим пример, как можно создать функцию, которая будет сохранять черновик кастомного типа 'product' через AJAX с дополнительной валидацией.
add_action('wp_ajax_wpgenerate_save_product_draft', 'wpgenerate_save_product_draft');
function wpgenerate_save_product_draft() {
if (!current_user_can('edit_posts')) {
wp_send_json_error('Нет прав на редактирование');
}
$post_id = intval($_POST['post_id']);
$title = sanitize_text_field($_POST['title']);
$content = wp_kses_post($_POST['content']);
if (empty($title)) {
wp_send_json_error('Заголовок обязателен');
}
$post_data = array(
'ID' => $post_id,
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
'post_type' => 'product',
);
$updated_id = wp_update_post($post_data, true);
if (is_wp_error($updated_id)) {
wp_send_json_error($updated_id->get_error_message());
}
wp_send_json_success('Черновик сохранен');
}
Далее на стороне JavaScript можно настроить периодический AJAX-запрос на этот обработчик для сохранения данных.
Пример JavaScript для периодического автосохранения
jQuery(document).ready(function($) {
setInterval(function() {
var postId = $('#post_ID').val();
var title = $('#title').val();
var content = tinymce.get('content').getContent();
$.post(ajaxurl, {
action: 'wpgenerate_save_product_draft',
post_id: postId,
title: title,
content: content
}, function(response) {
if (response.success) {
console.log('Черновик сохранен');
} else {
console.error('Ошибка сохранения: ' + response.data);
}
});
}, 30000); // каждые 30 секунд
});
Советы по оптимизации автосохранения и ревизий
Для крупных проектов важно контролировать количество ревизий и нагрузку от автосохранения. Рекомендации:
- Ограничьте количество ревизий в wp-config.php, например:
define('WP_POST_REVISIONS', 5); - Регулярно очищайте старые ревизии с помощью плагинов или SQL-запросов.
- Настраивайте интервал автосохранения так, чтобы балансировать между безопасностью и нагрузкой.
- Добавляйте уведомления и интерфейс для пользователей, чтобы они видели статус сохранения.
Правильная настройка автосохранения существенно снижает риск потери данных и повышает удобство работы с контентом.