Как создать функционал для автоматического сохранения черновиков в WordPress

Автоматическое сохранение черновиков — важная функция для любого сайта на 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.
  • Если у вас большой сайт с множеством пользователей, подумайте про кеширование и ограничение частоты запросов.
  • Тестируйте функционал на разных типах записей и в админке, чтобы убедиться в корректной работе.
Как создать персонализацию контента в WordPress с помощью AJAX и WPBono
16.04.2026
Как оптимизировать загрузку библиотеки jQuery в WordPress
31.12.2025
Как отказаться от PHP в WordPress в пользу JavaScript: практическое руководство
07.04.2026
Как создать и использовать REST API Endpoint в WordPress
28.11.2025
Как создать уникальный фильтрованный список постов в WordPress с помощью WP_Query и AJAX
01.03.2026