Как добавить автоматическое сохранение в редактор Gutenberg в WordPress

Редактор Gutenberg в WordPress уже имеет встроенную функцию автосохранения, однако в некоторых случаях базовых возможностей может быть недостаточно. Например, если вы создаёте сложный кастомный блок или работаете с большим объёмом данных, хочется добавить дополнительный уровень безопасности, чтобы избежать потери контента. В этой статье мы подробно разберём, как расширить возможности автоматического сохранения в Gutenberg, используя хуки, JavaScript и PHP, а также рассмотрим полезные плагины.

Почему стандартного автосохранения Gutenberg может быть недостаточно

WordPress автоматически сохраняет черновики примерно каждые 60 секунд, используя механизм REST API и локальное хранилище браузера. Это очень удобно, но в некоторых случаях:

  • Автосохранение может конфликтовать с кастомными блоками, которые хранят дополнительные данные вне стандартного контента.
  • При нестабильном интернет-соединении автосохранение может не сработать вовремя.
  • Отсутствует визуальное уведомление о сохранении для пользователя.

Чтобы устранить эти ограничения, можно реализовать собственный механизм автосохранения, который будет обновлять данные блоков и информировать пользователя.

Расширение автосохранения с помощью JavaScript в Gutenberg

Редактор Gutenberg построен на React и использует JavaScript API. Для добавления собственного автосохранения нам потребуется использовать хуки WordPress и JavaScript таймеры.

Создание пользовательского автосохранения

Напишем простой скрипт, который будет каждые 30 секунд вызывать сохранение поста и показывать уведомление.

function wpsystemAutoSave() {
  const { useEffect } = wp.element;
  const { useDispatch, useSelect } = wp.data;

  return function AutoSaveComponent() {
    const { savePost } = useDispatch('core/editor');
    const isSavingPost = useSelect((select) => select('core/editor').isSavingPost(), []);

    useEffect(() => {
      const interval = setInterval(() => {
        if (!isSavingPost) {
          savePost().then(() => {
            console.log('wpsystem: Пост успешно сохранён автоматически.');
          });
        }
      }, 30000); // автосохранение каждые 30 секунд

      return () => clearInterval(interval);
    }, [isSavingPost]);

    return null;
  };
}

wp.plugins.registerPlugin('wpsystem-autosave', {
  render: wpsystemAutoSave(),
});

В этом примере мы использовали хуки useEffect, useDispatch и useSelect из API Gutenberg для запуска функции сохранения поста каждые 30 секунд, если в данный момент не выполняется другое сохранение.

Подключение скрипта

Чтобы подключить этот скрипт, добавьте следующий код в файл плагина или темы functions.php:

function wpsystem_enqueue_autosave_script() {
  wp_enqueue_script(
    'wpsystem-autosave',
    get_template_directory_uri() . '/js/wpsystem-autosave.js',
    array('wp-plugins', 'wp-edit-post', 'wp-element', 'wp-data'),
    '1.0',
    true
  );
}
add_action('enqueue_block_editor_assets', 'wpsystem_enqueue_autosave_script');

Не забудьте создать файл wpsystem-autosave.js в папке js вашей темы и вставить туда JavaScript-код из примера.

Хранение и восстановление данных кастомных блоков при автосохранении

Если вы создаёте сложные кастомные блоки с собственными метаданными, стандартное автосохранение может не учитывать все ваши поля. Чтобы гарантировать сохранность данных, нужно интегрировать сохранение этих полей в процесс автосохранения.

Пример сохранения кастомного поля в метаданных поста

Добавим метаполе wpsystem_custom_data и настроим его сохранение:

function wpsystem_register_meta() {
  register_post_meta('post', 'wpsystem_custom_data', array(
    'show_in_rest' => true,
    'single' => true,
    'type' => 'string',
    'auth_callback' => function() {
      return current_user_can('edit_posts');
    },
  ));
}
add_action('init', 'wpsystem_register_meta');

В блоке JavaScript нужно использовать useEntityProp для чтения и записи этого метаполя:

const { useEntityProp } = wp.data;

function CustomBlockEdit() {
  const [customData, setCustomData] = useEntityProp('postType', 'post', 'wpsystem_custom_data');

  return (
    <input
      type="text"
      value={customData || ''}
      onChange={(event) => setCustomData(event.target.value)}
      placeholder="Введите пользовательские данные"
    /
  );
}

Таким образом, при автосохранении поста данные из поля wpsystem_custom_data будут сохраняться вместе с основным содержимым.

Плагины для улучшения автосохранения в WordPress

Если вы не хотите писать код самостоятельно, можно воспользоваться готовыми плагинами, которые расширяют функционал автосохранения:

  • Better Autosave — позволяет настроить интервал автосохранения и добавляет уведомления о процессе сохранения.
  • WP Autosave Alert — показывает предупреждения о незасохранённых изменениях при попытке покинуть страницу.
  • Autosave Custom Fields — расширяет автосохранение на произвольные поля и метаданные.

Эти решения помогут повысить надёжность работы с контентом и минимизировать риски потери данных.

Рекомендации по настройке автосохранения и производительности

При реализации собственного автосохранения важно учитывать производительность сайта и нагрузку на сервер:

  • Не устанавливайте слишком короткий интервал автосохранения — 30-60 секунд оптимально.
  • Обрабатывайте ошибки сохранения и информируйте пользователя в случае проблем.
  • Избегайте повторного вызова сохранения, если предыдущий процесс ещё не завершён.
  • Для больших сайтов с высокой нагрузкой рассмотрите кеширование и оптимизацию REST API запросов.

Следуя этим рекомендациям, вы сможете создать надёжный и удобный механизм автосохранения, который улучшит опыт работы с редактором Gutenberg.

WooCommerce: автоматическое изменение стоимости доставки при изменении веса товаров
07.05.2026
Как создать автоматический импорт событий в WordPress через REST API
11.04.2026
Как использовать фильтры WooCommerce для изменения цены товара
08.03.2026
WooCommerce: как изменить статичную страницу корзины без плагинов
22.04.2026
WooCommerce: автоматическое обновление стоимости товара при изменении атрибутов
13.05.2026