Heartbeat API: контроль без лишних плагинов
Heartbeat API: контроль без лишних плагинов
Хостинговые инструкции по оптимизации WordPress почти всегда советуют плагин Heartbeat Control: «Heartbeat API — самый ресурсоёмкий процесс в WordPress, отключите или замедлите его». Совет рабочий, но прежде чем ставить ещё один плагин, проверьте два факта: сколько ваш сайт реально генерирует heartbeat-запросов, и — главное — нет ли контроль Heartbeat уже встроен в плагины, которые у вас стоят.
Что такое Heartbeat API
Heartbeat — периодические AJAX-запросы браузера к /wp-admin/admin-ajax.php (действие heartbeat). Через него WordPress в админке делает автосохранение, блокировки записей («этот пост сейчас редактирует…»), уведомления, сессии входа. Частота по умолчанию — от 15 до 60 секунд на каждую открытую вкладку админки или редактора.
Важно понимать масштаб: Heartbeat работает для залогиненных пользователей. Для анонимных посетителей (99% трафика блога) ядро его даже не подключает. То есть «сайт тормозит из-за heartbeat» — это про ваши собственные открытые вкладки админки, а не про читателей.
Реальный масштаб на моих четырёх сайтах: в суточных логах access-запросов к admin-ajax.php — единицы. Никакой пожирающей нагрузки нет, и это типично для персонального блога. Но если вкладок редактора открыто много (или сайт многопользовательский), heartbeat-пинки складываются в постоянный фон admin-ajax-запросов, и на шаред-хостинге хостинг это замечает.
Плагин vs встроенное
Стандартный совет — плагин Heartbeat Control. Но:
- Breeze (если стоит) имеет встроенный контроль Heartbeat: на вкладке плагина — «Control Heartbeat» с раздельными настройками для фронтенда, редактора и админки (disable / интервал в секундах).
- WP-Optimize (4.x) управления Heartbeat не имеет — у него в коде только фиксированный интервал 15 секунд для интерфейса. На сайте с одним WP-Optimize контроль heartbeat потребует отдельного решения.
- Heartbeat Control (отдельный плагин) — делает то же, что встроенные контролы, минус один плагин в списке.
Рационально: если стоит Breeze — используйте его настройку. Если нет и heartbeat реально мешает — тогда плагин имеет смысл.
Настройка через Breeze (в том числе из wp-cli)
В админке: Настроить → Breeze → вкладка Heartbeat → «Control Heartbeat» включить, для фронтенда выбрать «Disable», для редактора и админки — 60 секунд.
Через wp-cli то же самое делается одной опцией — breeze_heartbeat_settings:
wp option update breeze_heartbeat_settings \
'{"breeze-control-heartbeat":"1","breeze-heartbeat-front":"disable","breeze-heartbeat-postedit":"60","breeze-heartbeat-backend":"60"}' \
--format=json --path=/путь/к/сайту
Ловушка с ключами. Плагин читает из этой опции ключи с префиксом: breeze-control-heartbeat, breeze-heartbeat-front, breeze-heartbeat-postedit, breeze-heartbeat-backend. Записать «очевидные» active-status/front-end/editor можно — опция сохранится, но плагин их молча не увидит: контроль останется выключенным при формально включённой опции. Проверить, что плагин видит настройки, удобно через Reflection:
wp eval '
$h = new Breeze_Heartbeat_Settings();
$rc = new ReflectionClass($h);
foreach (array("heartbeat_active","heartbeat_frontend","heartbeat_editor","heartbeat_backend") as $p) {
$prop = $rc->getProperty($p); $prop->setAccessible(true);
echo $p, " = ", var_export($prop->getValue($h), true), PHP_EOL;
}' --path=/путь/к/сайту
Должно быть: heartbeat_active = true и непустые интервалы. heartbeat_active = false при заполненной опции — ключи не совпали.
Что выбираем
Для персонального блога разумная конфигурация:
- фронтенд — disable (анонимным heartbeat и так не нужен, а залогиненный владелец в админке работает не через фронтенд);
- редактор — 60 секунд (автосохранение чуть реже, но работает);
- админка — 60 секунд.
На моих сайтах так и сделано через Breeze на трёх сайтах. На четвёртом (WP-Optimize) — встроенного контроля нет, heartbeat остаётся с интервалом по умолчанию; если когда-нибудь станет заметно — добавлю Heartbeat Control точечно туда.
Когда Heartbeat вообще не тема
- Если на сайте включён экран согласия/гейт, объявляющий
DONOTCACHEPAGE(как на моём основном) — каждый просмотр и так рендерится живьём, и heartbeat-фон в этом теряется. Сначала профилирование (без плагинов), потом Heartbeat. - Если сайт посещают только вы — вся эта оптимизация экономит копейки. Она имеет смысл на многопользовательских сайтах или при открытых «на постоянке» вкладках редактора.
