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

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

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

Что 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>
  window.__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>
    window.__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: выбранные страницы или типы записей, только залогиненные. Как установить код через плагин — в статье Установка виджета на вашей платформе.

Google Tag Manager

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

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

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

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

В планах

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