Как показывать геоконтент по IP посетителя в WordPress

Автор:Lisa Farrell·2026-06-01

Сайтам WordPress часто нужно показывать разный контент в записях, товарах или лендингах в зависимости от региона посетителя. Shortcode выводит fallback-контент, а браузер вызывает https://my.ipin.io/info .

Цель проектирования

Для «Как показывать геоконтент по IP посетителя в WordPress» страница должна оставаться полезной ещё до завершения IP-запроса. Геоданные являются дополнением: ответ проверяется, влияет только на одно ограниченное решение и отбрасывается при неполных полях.

Поток запроса и принятия решения

Как показывать геоконтент по IP посетителя в WordPress: Ниже показан поток именно для этой реализации, а не повтор общей инструкции по IP-проверке.

  1. Шаг 1 — Состояние по умолчанию: shortcode fallback HTML
  2. Шаг 2 — Запрос: wp_unique_id + static guard
  3. Шаг 3 — Проверка: 2.5s timeout
  4. Шаг 4 — Решение: sessionStorage
  5. Шаг 5 — Резерв: ipin:geo-content

Пример для production

Как показывать геоконтент по IP посетителя в WordPress: Пример включает тайм-аут, проверку ответа, детерминированный резервный вариант и обработку жизненного цикла конкретного фреймворка.

<?php
function ipin_geo_content_shortcode(): string {
    $id = wp_unique_id('ipin-geo-');
    $default = 'Support is available through our global help center.';
    return sprintf(
        '<aside id="%s" class="ipin-geo-note" data-default="%s">%s</aside>',
        esc_attr($id), esc_attr($default), esc_html($default)
    );
}
add_shortcode('geo_content', 'ipin_geo_content_shortcode');

function ipin_geo_content_assets(): void {
    wp_register_script('ipin-geo-content', '', [], null, true);
    wp_enqueue_script('ipin-geo-content');
    wp_add_inline_script('ipin-geo-content', <<<'JS'
(() => {
  if (window.__ipinGeoContentLoaded) return;
  window.__ipinGeoContentLoaded = true;
  const copy = {
    JP: 'Japan support: weekdays 09:00–18:00 JST.',
    DE: 'EU support: weekdays 09:00–17:00 CET.',
    US: 'US support: weekdays 09:00–17:00 ET.'
  };
  async function country() {
    const cached = sessionStorage.getItem('ipin_country');
    if (/^[A-Z]{2}$/.test(cached || '')) return cached;
    const controller = new AbortController();
    const timer = setTimeout(() => controller.abort(), 2500);
    try {
      const response = await fetch('https://my.ipin.io/info', {
        headers: {Accept: 'application/json'}, signal: controller.signal
      });
      if (!response.ok) throw new Error(`HTTP ${response.status}`);
      const data = await response.json();
      const value = String(data.country || '').toUpperCase();
      if (!/^[A-Z]{2}$/.test(value)) throw new Error('invalid country');
      sessionStorage.setItem('ipin_country', value);
      return value;
    } finally { clearTimeout(timer); }
  }
  country().then(value => {
    document.querySelectorAll('.ipin-geo-note').forEach(el => {
      el.textContent = copy[value] || el.dataset.default;
      el.dispatchEvent(new CustomEvent('ipin:geo-content', {
        bubbles: true, detail: {state: copy[value] ? 'resolved' : 'fallback'}
      }));
    });
  }).catch(() => {});
})();
JS);
}
add_action('wp_enqueue_scripts', 'ipin_geo_content_assets');

Матрица тестов

Перед публикацией «Как показывать геоконтент по IP посетителя в WordPress» проверьте эти случаи с mock-ответами или контролируемым VPN-выходом.

УсловиеВход / настройкаОжидаемый результат
T1[geo_content] × 22 unique DOM id; fetch × 1
T2CSP blockdefault HTML
T3latency > 2500 msAbortController; fallback
T4sessionStorage=JPfetch × 0

Автоматический / smoke-тест

// Browser console smoke test after inserting [geo_content] twice:
const boxes = [...document.querySelectorAll('.ipin-geo-note')];
console.assert(boxes.length === 2);
console.assert(new Set(boxes.map(x => x.id)).size === 2);

Обработка сбоев

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

СбойПричинаРеакция
CORSOrigin headerdefault HTML
script merged × 2cache pluginglobal loaded flag
country invalidschemaignore value
consent=falseanalytics eventUI state only

Практический сценарий

Реалистичный сценарий для «Как показывать геоконтент по IP посетителя в WordPress»: сайт документации показывает локальные часы поддержки через shortcode, сохраняя для всех посетителей одинаковый полный и индексируемый текст справки.

Замечания для production

Как показывать геоконтент по IP посетителя в WordPress: Сохраняйте полноценный HTML по умолчанию. IP-локация не подтверждает личность, а результат на клиенте нельзя использовать для авторизации.

Итог

Для «Как показывать геоконтент по IP посетителя в WordPress» теперь есть собственный путь реализации, проверяемые тесты и определённое резервное поведение вместо общей заготовки.