Автоматическое сохранение записи (Auto Save) — важная функция, которая помогает избежать потери данных при работе с редактором WordPress. По умолчанию WordPress уже реализует автосохранение, но иногда нам нужно расширить или изменить этот функционал под свои задачи, например, добавить автоматическое сохранение в кастомных типах записей или при использовании сторонних редакторов.
Особенности автосохранения в WordPress и зачем нужна своя реализация
В стандартном редакторе WordPress (Gutenberg) автосохранение происходит через JavaScript, отправляя данные на сервер каждые 60 секунд. Это отлично работает для стандартных постов и страниц. Но если вы разрабатываете сайт с кастомными типами записей, сложными мета-боксами или хотите расширить функционал — потребуется своя логика автосохранения.
Например, можно реализовать автосохранение через AJAX для кастомных форм или добавить дополнительные проверки перед сохранением. Без такого подхода у пользователя может возникнуть ситуация, когда данные не сохраняются автоматически или теряются при обновлении страницы.
Ниже разберём пример создания плагина, который добавит автоматическое сохранение для кастомного типа записей с помощью AJAX-запросов.
Создание плагина для автоматического сохранения кастомных записей
Начнём с создания минимального плагина. Для примера создадим кастомный тип записи "wpexpert_note" и добавим для него автосохранение.
Регистрация кастомного типа записи
function wpexpert_register_custom_post_type() {
$args = array(
'labels' => array(
'name' => 'Заметки',
'singular_name' => 'Заметка',
),
'public' => true,
'supports' => array('title', 'editor'),
'show_in_rest' => true,
);
register_post_type('wpexpert_note', $args);
}
add_action('init', 'wpexpert_register_custom_post_type');Эта функция создаст новый тип записей "Заметки" с поддержкой заголовка и контента.
Добавление JavaScript для автосохранения
Нужно добавить скрипт, который будет отправлять AJAX-запрос на сервер с содержимым записи для сохранения.
function wpexpert_enqueue_autosave_script($hook) {
global $post;
if (($hook == 'post-new.php' || $hook == 'post.php') && $post->post_type == 'wpexpert_note') {
wp_enqueue_script('wpexpert-autosave', plugin_dir_url(__FILE__) . 'autosave.js', array('jquery'), '1.0', true);
wp_localize_script('wpexpert-autosave', 'wpexpertData', array(
'ajax_url' => admin_url('admin-ajax.php'),
'post_id' => $post->ID,
'nonce' => wp_create_nonce('wpexpert_autosave_nonce'),
));
}
}
add_action('admin_enqueue_scripts', 'wpexpert_enqueue_autosave_script');Этот код подключит скрипт autosave.js только на страницах редактирования заметок и передаст необходимые параметры для AJAX.
Написание JS скрипта autosave.js
Создайте файл autosave.js в папке плагина с таким содержанием:
jQuery(document).ready(function($) {
function wpexpertAutoSave() {
var data = {
action: 'wpexpert_autosave',
post_id: wpexpertData.post_id,
nonce: wpexpertData.nonce,
title: $('#title').val(),
content: $('#content').val(),
};
$.post(wpexpertData.ajax_url, data, function(response) {
if(response.success) {
console.log('Запись автоматически сохранена');
} else {
console.log('Ошибка автосохранения: ' + response.data);
}
});
}
// Автосохранение каждые 30 секунд
setInterval(wpexpertAutoSave, 30000);
});Здесь мы отправляем на сервер ID записи, nonce для безопасности, а также заголовок и контент из полей формы.
Обработка AJAX-запроса в PHP
function wpexpert_handle_autosave() {
check_ajax_referer('wpexpert_autosave_nonce', 'nonce');
$post_id = intval($_POST['post_id']);
$title = sanitize_text_field($_POST['title']);
$content = wp_kses_post($_POST['content']);
if (!$post_id || get_post_type($post_id) !== 'wpexpert_note') {
wp_send_json_error('Неверный ID записи');
}
$post_data = array(
'ID' => $post_id,
'post_title' => $title,
'post_content' => $content,
);
$result = wp_update_post($post_data, true);
if (is_wp_error($result)) {
wp_send_json_error($result->get_error_message());
} else {
wp_send_json_success();
}
}
add_action('wp_ajax_wpexpert_autosave', 'wpexpert_handle_autosave');Эта функция проверяет безопасность, валидирует данные и обновляет запись. В ответ отправляется JSON с результатом.
Расширение функциональности автосохранения
Данный пример — базовый, но его можно значительно расширить. Например:
- Добавить автосохранение мета-полей с помощью
get_post_metaиupdate_post_meta. - Реализовать дебаунсинг (отложенный вызов), чтобы не отправлять запросы слишком часто.
- Добавить уведомления пользователю о статусе автосохранения в интерфейсе.
- Интегрировать с плагинами, например, Clearfy Pro для оптимизации запросов.
Также для улучшения UX можно добавить кнопку "Сохранить сейчас" с тем же AJAX-запросом.
Другие плагины и инструменты для автосохранения
Если не хочется писать код с нуля, можно использовать готовые плагины, которые предлагают расширенное автосохранение:
- Clearfy Pro — ускоряет и оптимизирует работу WordPress, включая функции автосохранения.
- Плагин "Auto Save Draft" — расширяет стандартное автосохранение, позволяя настраивать частоту и условия.
Подключение таких плагинов поможет избежать собственных ошибок и расширить возможности без лишнего кода.
Советы по отладке автосохранения
Если автосохранение не работает, проверьте:
- Правильность nonce и безопасность AJAX-запросов.
- Совместимость с другими плагинами, отключая подозрительные по очереди.
- Консоль браузера на наличие ошибок JavaScript.
- Логи сервера на ошибки PHP.
Для отладки можно добавить error_log в обработчик AJAX или использовать плагины для логирования.