Автоматическое сохранение записей — важная функция для любого сайта на WordPress, особенно если вы часто работаете с большими объемами контента или настраиваете сложные публикации. В этой статье мы разберём, как создать собственный плагин для автоматического сохранения записей, чтобы минимизировать риск потерять данные из-за сбоев или случайного закрытия вкладки браузера.
Почему важно автоматическое сохранение в WordPress
Стандартный редактор WordPress уже содержит функцию автосохранения, которая срабатывает через определённые интервалы времени. Однако её возможности ограничены, и она не всегда подходит для кастомных типов записей или сложных полей. К тому же, иногда автосохранение конфликтует с другими плагинами или темами. Создание собственного плагина даёт полный контроль над процессом и позволяет настроить поведение именно под ваши задачи.
Преимущества собственного автосохранения:
- Настройка частоты сохранения под конкретные типы записей.
- Сохранение дополнительных метаданных и кастомных полей.
- Логирование и уведомления о сохранениях.
- Повышение безопасности через проверку nonce и прав пользователя.
Создание плагина для автоматического сохранения: базовая структура
Начнём с создания простого плагина, который будет сохранять записи при изменении содержимого через AJAX.
Шаг 1. Создаём папку и файл плагина
В директории wp-content/plugins/ создайте папку wp8-autosave. В ней создайте файл wp8-autosave.php с заголовком плагина:
<?php
/**
* Plugin Name: WP8 Автосохранение записей
* Description: Плагин для автоматического сохранения записей через AJAX
* Version: 1.0
* Author: WP8
*/
// Защита от прямого запуска
if (!defined('ABSPATH')) {
exit;
}
Шаг 2. Регистрируем AJAX-обработчик
Добавим обработчик AJAX-запроса, который будет принимать данные записи и сохранять их.
add_action('wp_ajax_wp8_autosave_post', 'wp8_autosave_post_callback');
function wp8_autosave_post_callback() {
// Проверка nonce для безопасности
if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'wp8_autosave_nonce')) {
wp_send_json_error('Ошибка безопасности');
wp_die();
}
// Проверка прав пользователя
if (!current_user_can('edit_post', intval($_POST['post_id']))) {
wp_send_json_error('Нет доступа для редактирования');
wp_die();
}
$post_id = intval($_POST['post_id']);
$post_content = wp_kses_post($_POST['content']);
$updated_post = array(
'ID' => $post_id,
'post_content' => $post_content,
);
$result = wp_update_post($updated_post, true);
if (is_wp_error($result)) {
wp_send_json_error($result->get_error_message());
} else {
wp_send_json_success('Сохранено');
}
wp_die();
}
Шаг 3. Подключаем скрипт для отправки данных
Теперь добавим JavaScript, который будет отслеживать изменения в редакторе и отправлять их на сервер.
add_action('admin_enqueue_scripts', 'wp8_enqueue_autosave_script');
function wp8_enqueue_autosave_script($hook) {
if ($hook != 'post.php' && $hook != 'post-new.php') {
return;
}
wp_enqueue_script('wp8-autosave-js', plugin_dir_url(__FILE__) . 'autosave.js', array('jquery'), '1.0', true);
wp_localize_script('wp8-autosave-js', 'wp8_autosave_params', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wp8_autosave_nonce'),
));
}
Шаг 4. Создаём файл autosave.js
В той же папке создайте файл autosave.js с таким содержанием:
(function($){
var timer;
var delay = 5000; // Интервал автосохранения в миллисекундах
function wp8_autosave() {
var post_id = $('#post_ID').val();
var content = $('#content').val();
$.post(wp8_autosave_params.ajax_url, {
action: 'wp8_autosave_post',
post_id: post_id,
content: content,
nonce: wp8_autosave_params.nonce
}, function(response) {
if (response.success) {
console.log('Запись автосохранена');
} else {
console.error('Ошибка автосохранения:', response.data);
}
});
}
$(document).ready(function() {
$('#content').on('input', function() {
clearTimeout(timer);
timer = setTimeout(wp8_autosave, delay);
});
});
})(jQuery);
Настройка и улучшение плагина
Поддержка кастомных типов полей и редакторов
Если вы используете Gutenberg или кастомные поля, код нужно адаптировать. Для Gutenberg можно использовать REST API и JavaScript hooks React. Для метаполей — добавить передачу необходимых данных в AJAX и обработать их в PHP.
Например, для сохранения метаполей в AJAX-запросе добавьте:
$meta_value = sanitize_text_field($_POST['meta_key'] ?? '');
update_post_meta($post_id, 'meta_key', $meta_value);
А в JavaScript — передавайте поле meta_key вместе с другими данными.
Безопасность и производительность
Важно не перенагружать сервер частыми запросами, поэтому интервал автосохранения лучше настраивать исходя из специфики сайта. Также используйте wp_verify_nonce и проверки прав доступа, чтобы исключить несанкционированное сохранение.
Для больших сайтов можно добавить логирование автосохранений и уведомления администратору о проблемах.
Примеры плагинов с автосохранием для вдохновения
Если вы хотите не писать всё с нуля, обратите внимание на следующие плагины:
- Autosave — расширяет стандартное автосохранение;
- Revision Control — управляет ревизиями записей;
- WP Automatic — автоматизация публикаций и обновлений.
Однако собственное решение позволяет гибко настраивать процесс и интегрировать автосохранение с вашими бизнес-процессами.
Заключение
Создание плагина для автоматического сохранения записей в WordPress — задача вполне выполнимая и полезная для обеспечения сохранности контента. Используйте приведённый пример как основу для своих проектов, адаптируя код под свои задачи и улучшая функциональность. Такой подход снизит риски потери данных и повысит удобство работы с сайтом.