← Назад в блог

Виджет поддержки, который уже знает, с кем разговаривает

Опубликовано
3 мин чтения
--- просмотров

У магазина со своим хелпдеском остаётся разрыв: магазин и хелпдеск ничего не знают друг о друге. Клиент с вопросом уходит с сайта, отдельно находит поддержку и заводит обращение как посторонний, заново вводя имя, почту и телефон, которые у магазина уже есть. Агент после этого тратит два ответа на выяснение, с кем говорит и о каком заказе речь.

Ответ вендора выглядит как сниппет, который вы вставляете в тему. Он закрывает половину разрыва и открывает три новые проблемы.

Проблема первая: сниппет лежит не там

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

Хуже того, любая настройка превращается в правку кода. Цвет, угол, язык, обязательные поля формы - всё живёт в разметке, поэтому смена одного значения требует разработчика и выката.

Переносите это в плагин с экраном настроек. Решение скучное, и для этой проблемы оно исчерпывающее.

Проблема вторая: личность надо передать

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

$visitor = $user
    ? ['visitor_name' => $user->getName(),
       'visitor_email' => $user->getEmail(),
       'visitor_phone' => $user->getPhone()]
    : [];

return [...$settings, ...$visitor];

Обратите внимание на пустой массив. Без сессии виджет всё равно отрисовывается, просто без данных посетителя. Это важнее, чем звучит: как раз анонимный посетитель чаще всего задаёт вопрос до покупки, и виджет, который для неавторизованных падает или прячется, убирает поддержку ровно там, где она нужнее всего.

Проблема третья: виджет на всём сайте стоит запроса на страницу

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

Кэшируйте по пользователю:

$cached = wp_cache_get('freescout_user_' . $user_id);
if ($cached) return unserialize($cached);

$dto = $this->loadFromDb($user_id);
if ($dto) wp_cache_set('freescout_user_' . $user_id, serialize($dto));
return $dto;

В ключе обязан быть идентификатор пользователя. Общий ключ - это способ, которым имя одного клиента попадает в чат другого, а такое относится к утечке данных, а не к проблеме производительности. Всякий раз, когда вы кэшируете что-то, выведенное из того, кто спрашивает, личность должна входить в ключ. Это самый простой способ превратить правку кэша в инцидент.

Размещение выбирают, а не наследуют

Вставка в футер даёт виджет на каждой странице, шорткод - на одной. Оба варианта законны: магазину он нужен везде, а сайту документации может хватить страницы контактов.

Поддержите оба и дайте им общий код идентификации. Соблазн такой: сначала сделать вариант на весь сайт, а шорткод добавить потом копированием функции отрисовки. После этого у вас два виджета, которые начинают расходиться.

Что проверить перед тем, как считать сделанным

Откройте магазин авторизованным и убедитесь, что форма стартует заполненной. Потом зайдите в приватном окне и посмотрите, появляется ли виджет там, пустой и рабочий. Вторую проверку пропускают чаще всего, а именно она ловит падение на отсутствующем пользователе.

Дальше посмотрите, что виджет реально отправляет. Он передаёт стороннему сервису всё, что вы ему дали, а объём «всего, что дали» имеет свойство расти. Телефон для поддержки разумен. История заказов, внутренний идентификатор клиента или уровень лояльности попали туда, скорее всего, потому что были под рукой, а не потому что поддержке они нужны.

Открыт для работы по контракту

Я доступен для работы по контракту. Если у вас есть интересная идея проекта, запишитесь на звонок через Calendly.

Записаться на 30-минутный звонок