Автоматическое сохранение черновиков — важная функция для любого сайта на WordPress, особенно если вы работаете с большими текстами или сложным контентом. Стандартный механизм автосохранения WordPress иногда не решает всех задач, и полезно иметь возможность настроить его под свои нужды или добавить дополнительные возможности.
Зачем нужен кастомный функционал автосохранения черновиков в WordPress
Стандартный автосейв в WordPress сохраняет черновики каждые 60 секунд, но это может быть слишком редко или слишком часто в зависимости от специфики проекта. Иногда нужно более гибкое управление — например, сохранять черновики при определённых действиях пользователя, или интегрировать автосохранение с внешними сервисами.
Также стандартное автосохранение не всегда удобно при работе с нестандартными типами записей (Custom Post Types) или при использовании сложных плагинов, которые добавляют свои поля. В таких случаях полезно иметь собственные хуки и функции для сохранения промежуточных данных.
Как реализовать кастомное автоматическое сохранение черновиков с помощью AJAX
Один из самых эффективных способов — использовать AJAX для отправки данных на сервер без перезагрузки страницы. Рассмотрим пример, как добавить такой функционал для записи с помощью собственных AJAX-запросов.
1. Регистрация AJAX обработчика в WordPress
Добавим в functions.php или в свой плагин следующий код для регистрации AJAX-обработчика:
add_action('wp_ajax_wpbono_autosave_draft', 'wpbono_autosave_draft_callback');
function wpbono_autosave_draft_callback() {
if (!current_user_can('edit_posts')) {
wp_send_json_error('Недостаточно прав');
wp_die();
}
$post_id = intval($_POST['post_id']);
$content = wp_kses_post($_POST['content']);
if (!$post_id || empty($content)) {
wp_send_json_error('Неверные данные');
wp_die();
}
$post = [
'ID' => $post_id,
'post_content' => $content,
'post_status' => 'draft'
];
$result = wp_update_post($post, true);
if (is_wp_error($result)) {
wp_send_json_error($result->get_error_message());
} else {
wp_send_json_success('Черновик успешно сохранён');
}
wp_die();
}Этот код проверяет права пользователя, получает ID записи и содержимое, и обновляет запись в статусе "черновик".
2. JavaScript для отправки данных на сервер
Добавим JS, который будет отправлять данные с определённой периодичностью или по событию:
jQuery(document).ready(function($) {
let timer;
const postId = $('#post_ID').val(); // или другой способ получить ID записи
function wpbono_autosave() {
const content = $('#content').val();
$.post(ajaxurl, {
action: 'wpbono_autosave_draft',
post_id: postId,
content: content
}, function(response) {
if(response.success) {
console.log('Черновик сохранён');
} else {
console.error('Ошибка сохранения:', response.data);
}
});
}
$('#content').on('input', function() {
clearTimeout(timer);
timer = setTimeout(wpbono_autosave, 5000); // сохраняем через 5 секунд после последнего ввода
});
});Этот скрипт отслеживает изменения в поле контента и запускает сохранение спустя 5 секунд после последнего изменения, что снижает нагрузку на сервер и не мешает работе пользователя.
Поддержка автосохранения для Custom Post Types и дополнительных полей
Если вы работаете с Custom Post Types, важно убедиться, что AJAX-обработчик корректно работает с ними. В примере выше можно добавить проверку типа записи:
$post_type = get_post_type($post_id);
if (!in_array($post_type, ['post', 'page', 'my_custom_post_type'])) {
wp_send_json_error('Неподдерживаемый тип записи');
wp_die();
}Для полей метаданных (custom fields) можно расширить AJAX-запрос и PHP-обработчик. Например, передавать дополнительные поля:
// JS
$.post(ajaxurl, {
action: 'wpbono_autosave_draft',
post_id: postId,
content: content,
meta_field_1: $('#meta_field_1').val()
});
// PHP
if (isset($_POST['meta_field_1'])) {
update_post_meta($post_id, 'meta_field_1', sanitize_text_field($_POST['meta_field_1']));
}Такой подход позволяет сохранять не только основной контент, но и все дополнительные данные, что крайне полезно для сложных проектов.
Плагины для расширенного автосохранения и управления черновиками
Если вы не хотите писать код самостоятельно или хотите получить расширенный функционал, обратите внимание на следующие плагины:
- Clearfy Pro — улучшает производительность и безопасность, включает оптимизацию автосохранения и очистку базы данных.
- WPStories — плагин для создания сторис, который тоже активно использует механизм автосохранения для предотвращения потери данных.
Использование профессиональных плагинов может значительно упростить задачу и добавить полезные функции без необходимости писать код.
Советы по оптимизации автосохранения черновиков
Чтобы автосохранение работало эффективно и без сбоев, учитывайте следующие рекомендации:
- Устанавливайте разумный интервал автосохранения, чтобы не перегружать сервер лишними запросами.
- Обрабатывайте возможные ошибки в AJAX, чтобы пользователь получал информативные сообщения.
- Используйте функции WordPress для валидации и очистки данных, например,
wp_kses_post,sanitize_text_field. - Если у вас большой сайт с множеством пользователей, подумайте про кеширование и ограничение частоты запросов.
- Тестируйте функционал на разных типах записей и в админке, чтобы убедиться в корректной работе.