Сайтам WordPress часто нужно показывать разный контент в записях, товарах или лендингах в зависимости от региона посетителя. Shortcode выводит fallback-контент, а браузер вызывает https://my.ipin.io/info .
Цель проектирования
Для «Как показывать геоконтент по IP посетителя в WordPress» страница должна оставаться полезной ещё до завершения IP-запроса. Геоданные являются дополнением: ответ проверяется, влияет только на одно ограниченное решение и отбрасывается при неполных полях.
Поток запроса и принятия решения
Как показывать геоконтент по IP посетителя в WordPress: Ниже показан поток именно для этой реализации, а не повтор общей инструкции по IP-проверке.
- Шаг 1 — Состояние по умолчанию:
shortcode fallback HTML - Шаг 2 — Запрос:
wp_unique_id + static guard - Шаг 3 — Проверка:
2.5s timeout - Шаг 4 — Решение:
sessionStorage - Шаг 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] × 2 | 2 unique DOM id; fetch × 1 |
| T2 | CSP block | default HTML |
| T3 | latency > 2500 ms | AbortController; fallback |
| T4 | sessionStorage=JP | fetch × 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: Сбой должен быть заметен в логах или инструментах разработчика, но не должен оставлять пустой блок или ломать оформление заказа.
| Сбой | Причина | Реакция |
|---|---|---|
| CORS | Origin header | default HTML |
| script merged × 2 | cache plugin | global loaded flag |
| country invalid | schema | ignore value |
| consent=false | analytics event | UI state only |
Практический сценарий
Реалистичный сценарий для «Как показывать геоконтент по IP посетителя в WordPress»: сайт документации показывает локальные часы поддержки через shortcode, сохраняя для всех посетителей одинаковый полный и индексируемый текст справки.
Замечания для production
Как показывать геоконтент по IP посетителя в WordPress: Сохраняйте полноценный HTML по умолчанию. IP-локация не подтверждает личность, а результат на клиенте нельзя использовать для авторизации.
Итог
Для «Как показывать геоконтент по IP посетителя в WordPress» теперь есть собственный путь реализации, проверяемые тесты и определённое резервное поведение вместо общей заготовки.