Показ виджета только там, где нужно

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

Можно — но сегодня это решается на вашей стороне, а не в настройках проекта. Правил для страниц, доменов или посетителей в приложении пока нет (они в планах). Виджет стартует, как только выполнился его код вставки, поэтому вопрос простой: когда ваш сайт выводит этот код? Всё дальше — это способы на него ответить.

Что Revisionme проверяет сам

Одно правило работает без всяких настроек. Сообщение принимается только с того сайта, для которого создан проект: с хоста из поля Website URL проекта, с одного уровня его поддоменов и с localhost для локальной разработки. Список виден в настройках проекта → General → White-listed hosts.

То есть проект, созданный для https://example.com, принимает сообщения также с www.example.com и staging.example.com, но не с example.net — если код окажется на чужом домене, форма там откроется, но до вас ничего не дойдёт. Для другого сайта нужен отдельный проект.

Создавайте проект на «голый» домен (https://example.com), а не на https://www.example.com: тогда правило поддоменов работает на вас, и www, и staging проходят.

Только на тестовом окружении

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

<?php if (getenv('APP_ENV') !== 'production'): ?>
  <script>
  var __rm__config = {
    projectId: 'YOUR_PROJECT_ID',
    locale: 'auto'
  };
  </script>
  <script src="https://widget.revisionme.com/app.js" defer id="rm_app_script"></script>
<?php endif; ?>

Если тестовый сайт — поддомен того же домена (staging.example.com), имеющийся проект его уже покрывает. Если он на отдельном домене или за паролем, создайте для него второй проект.

Только на отдельных страницах

Та же идея, только с путём. Держите список страниц или разделов, которые сейчас просматривают, и подключайте сниппет только там:

<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$sections = ['/pricing', '/blog/', '/docs/'];

foreach ($sections as $prefix) {
    if (strpos($path, $prefix) === 0) {
        include __DIR__ . '/revisionme.php'; // код вставки
        break;
    }
}

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

Только для определённых IP-адресов

Удобно, когда сайт уже живой, а виджет должен видеть офис или один рецензент — и больше никто:

<?php
$allowed = ['203.0.113.10', '198.51.100.24'];

if (in_array($_SERVER['REMOTE_ADDR'], $allowed, true)) {
    include __DIR__ . '/revisionme.php';
}

Две оговорки. За прокси, балансировщиком или Cloudflare в REMOTE_ADDR будет адрес прокси, а адрес посетителя приедет в заголовке (CF-Connecting-IP, X-Forwarded-For), которому стоит доверять только тогда, когда запрос действительно пришёл от вашего же прокси. И домашние и мобильные адреса меняются, поэтому список IP надёжен для офисной сети и раздражает всех остальных — для одного человека проще сделать переключатель ниже.

Только для залогиненных или для выбранной группы

Если те, кто оставляет замечания, и так авторизованы на вашем сайте, используйте проверку, которая у вас уже есть, — роль, группа, флаг в аккаунте:

<?php if ($user && $user->hasRole('editor')): ?>
  <?php include __DIR__ . '/revisionme.php'; ?>
<?php endif; ?>

Переключатель в ссылке

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

<?php
if (isset($_GET['rm'])) {
    // /any-page?rm=1 включает, ?rm=0 выключает
    setcookie('rm_feedback', $_GET['rm'] === '1' ? '1' : '0', time() + 86400 * 30, '/');
    $_COOKIE['rm_feedback'] = $_GET['rm'];
}

if (($_COOKIE['rm_feedback'] ?? '') === '1') {
    include __DIR__ . '/revisionme.php';
}

Вы отправляете рецензенту https://example.com/?rm=1, он следующий месяц видит виджет на всех страницах, а остальные посетители — никогда.

WordPress

В WordPress те же условия уже есть в виде условных тегов. Добавьте сниппет в functions.php дочерней темы (или в небольшой плагин) и прицепите его к футеру:

add_action('wp_footer', function () {
    // Только для тех, кто может редактировать записи; замените на своё условие,
    // например is_page(['pricing', 'about']) или is_singular('post')
    if (!current_user_can('edit_posts')) {
        return;
    }
    ?>
    <script>
    var __rm__config = { projectId: 'YOUR_PROJECT_ID', locale: 'auto' };
    </script>
    <script src="https://widget.revisionme.com/app.js" defer id="rm_app_script"></script>
    <?php
});

Полезные теги: is_page(), is_singular(), is_category(), is_front_page(), is_user_logged_in(), current_user_can(), а для тестового окружения — wp_get_environment_type() !== 'production'.

Без кода то же самое дают плагины для сниппетов через собственный интерфейс: WPCode, Insert Headers and Footers, Header Footer Code Manager и подобные позволяют один раз вставить код и потом выбрать, где он выводится — везде, на выбранных страницах или типах записей, только для залогиненных. Вставляйте код в позицию Footer / Body, чтобы он выполнялся перед </body>.

Google Tag Manager

Если сайт живёт через GTM, сделайте тег Custom HTML с полным кодом вставки (оба <script>, конфиг первым) и дайте ему триггер с условиями: Page Path contains /docs/, Page Hostname equals staging.example.com, переменная из куки, равная 1, и так далее. Так все правила лежат в одном месте, и менять их можно без деплоя.

Проверка в браузере — это не замок

Решение в JavaScript (if (location.pathname.startsWith('/docs/'))) вполне годится, чтобы виджет не появлялся на странице. Но это не ограничение: код уже загружен, и любой может запустить его руками. Когда виджет действительно должен быть невидим для публики — перед запуском, на приватном staging клиента — условие должно быть на сервере, там, где собирается страница, чтобы кода вставки просто не было в HTML.

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

В планах

Правила для страниц и посетителей в настройках проекта, чтобы делать это без изменений на сайте, есть в планах. Если вам нужно конкретное правило, напишите на hello@revisionme.com — это помогает решить, что делать первым.