Если вы часто работаете с большими объемами контента в WordPress, то наверняка сталкивались с проблемой потери данных из-за случайного закрытия вкладки или сбоев браузера. В стандартной комплектации WordPress уже есть функция автосохранения черновиков, но она не всегда работает так, как хотелось бы, особенно если работа идет с нестандартными типами записей или пользовательскими полями. В этой статье мы рассмотрим, как можно улучшить и автоматизировать процесс сохранения черновиков, чтобы минимизировать риски потери контента.
Почему стандартное автосохранение WordPress не всегда достаточно
Автосохранение в WordPress происходит каждые 60 секунд (по умолчанию) и сохраняет данные в таблице wp_posts с типом записи revision. Однако есть несколько ограничений:
- Автосохранение не всегда учитывает пользовательские метаполя (custom fields) и таксономии.
- Иногда при работе с плагинами для создания сложных форм автосохранение может конфликтовать или не срабатывать.
- Интервал автосохранения может быть слишком длинным для задач с интенсивным редактированием.
Исходя из этих проблем, имеет смысл подумать о кастомных решениях, дополняющих или заменяющих стандартное поведение.
Настройка интервала автосохранения через wp-config.php
Если для вас критична частота автосохранений, ее можно увеличить, изменив значение константы AUTOSAVE_INTERVAL. Для этого добавьте в файл wp-config.php строку:
define( 'AUTOSAVE_INTERVAL', 10 ); // автосохранение каждые 10 секундЭто уменьшит интервал до 10 секунд и позволит чаще сохранять черновики. Однако стоит помнить, что слишком частые автосохранения могут увеличить нагрузку на сервер и базу данных.
Плагин WPOrder Auto Draft Saver — пример решения для автоматизации
Для более гибкой настройки сохранения можно использовать собственный плагин, который мы назовем WPOrder Auto Draft Saver. Он будет сохранять не только стандартный контент, но и выбранные метаполя через AJAX, что позволит избежать потери данных в нестандартных редакторах.
Основные возможности плагина:
- Автоматическое сохранение контента и метаполей через заданный интервал.
- Поддержка пользовательских типов записей.
- Обработка ошибок сохранения с уведомлением пользователя.
Пример кода плагина для автоматического сохранения через AJAX
В файле плагина создадим следующий код:
<?php
/**
* Plugin Name: WPOrder Auto Draft Saver
* Description: Автоматическое сохранение черновиков и метаполей через AJAX
* Version: 1.0
* Author: WPOrder
*/
add_action('admin_enqueue_scripts', 'wporder_enqueue_autosave_script');
function wporder_enqueue_autosave_script() {
wp_enqueue_script('wporder-autosave', plugin_dir_url(__FILE__) . 'autosave.js', array('jquery'), '1.0', true);
wp_localize_script('wporder-autosave', 'wporderAutosave', array(
'ajaxurl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wporder_autosave_nonce'),
'post_id' => get_the_ID(),
));
}
add_action('wp_ajax_wporder_autosave', 'wporder_handle_autosave');
function wporder_handle_autosave() {
check_ajax_referer('wporder_autosave_nonce', 'nonce');
$post_id = intval($_POST['post_id']);
$content = wp_kses_post($_POST['content']);
$custom_field = sanitize_text_field($_POST['custom_field']);
if (!current_user_can('edit_post', $post_id)) {
wp_send_json_error('Нет прав на редактирование');
}
$post_data = array(
'ID' => $post_id,
'post_content' => $content,
'post_status' => 'draft'
);
$updated_post_id = wp_update_post($post_data, true);
if (is_wp_error($updated_post_id)) {
wp_send_json_error($updated_post_id->get_error_message());
}
update_post_meta($post_id, '_wporder_custom_field', $custom_field);
wp_send_json_success('Черновик сохранен');
}
?>В этом примере мы регистрируем скрипт, который будет отправлять AJAX-запросы на сервер, и обрабатываем эти запросы, обновляя содержимое поста и пользовательское поле.
JavaScript для отправки данных
Создадим файл autosave.js в папке плагина с таким содержимым:
jQuery(document).ready(function($){
function wporderAutoSave() {
var content = $('#content').val();
var customField = $('#wporder_custom_field').val();
$.post(wporderAutosave.ajaxurl, {
action: 'wporder_autosave',
nonce: wporderAutosave.nonce,
post_id: wporderAutosave.post_id,
content: content,
custom_field: customField
}, function(response) {
if(response.success){
console.log('Автосохранение прошло успешно');
} else {
console.error('Ошибка автосохранения:', response.data);
}
});
}
setInterval(wporderAutoSave, 15000); // автосохранение каждые 15 секунд
});Этот скрипт берет содержимое основного редактора и пользовательское поле с id wporder_custom_field, отправляет на сервер и получает ответ об успешности сохранения.
Как добавить пользовательское поле для автосохранения
Чтобы это поле появилось в редакторе, добавим метабокс в админке:
add_action('add_meta_boxes', 'wporder_add_custom_meta_box');
function wporder_add_custom_meta_box() {
add_meta_box(
'wporder_custom_meta',
'Пользовательское поле для автосохранения',
'wporder_custom_meta_box_callback',
'post',
'normal',
'high'
);
}
function wporder_custom_meta_box_callback($post) {
wp_nonce_field('wporder_custom_meta_box', 'wporder_custom_meta_box_nonce');
$value = get_post_meta($post->ID, '_wporder_custom_field', true);
echo '<label for="wporder_custom_field">Значение:</label> ';
echo '<input type="text" id="wporder_custom_field" name="wporder_custom_field" value="' . esc_attr($value) . '" size="25" />';
}Теперь поле появится на странице редактирования поста, и будет участвовать в автосохранении.
Дополнительные советы по защите контента
Кроме автосохранения, рекомендуем использовать следующие подходы для повышения надежности:
- Резервное копирование базы данных. Периодически создавайте полные бэкапы, чтобы можно было восстановить данные в случае критических сбоев.
- Использование плагинов для ревизий. Плагины, как WP Revisions Control, позволяют гибко управлять количеством ревизий и их хранением.
- Мониторинг ошибок JavaScript. Иногда именно сбои в JS-браузера блокируют автосохранение.
Заключение
Автоматизация сохранения черновиков в WordPress — важный аспект, который поможет избежать потери данных и повысить комфорт работы с контентом. Стандартная функция автосохранения подходит не всегда, особенно в сложных проектах с кастомными полями и типами записей. Создание собственного плагина с AJAX-сохранением, как показано в примере WPOrder Auto Draft Saver, позволяет гибко настраивать процесс и расширять функционал под задачи конкретного сайта.