Динамическое перезаписывание подпапки с кодом страны в WordPress с использованием PHP

Вопрос или проблема

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

Я работал над сайтом клиента. Есть два схожих сайта: один для их собственной страны и второй для посетителей из других стран.

Их основной сайт размещен в корне сервера, а второй сайт размещен в подпапке.

Теперь я хочу динамическую переадресацию URL для второго сайта, который размещен в подпапке с кодом страны посещающего пользователя.

Например:

http://example.com

http://example.com/subfolder/

это URL-адреса.

Я хочу, чтобы http://example.com/subfolder/ изменился на http://example.com/country_code/, где country_code — это код страны посетителя в формате ISO, получаемый через PHP-функцию.

Так что, если пользователь из Соединенных Штатов, то subfolder должно измениться на us, новый URL теперь должен быть http://example.com/us/.

Я хочу, чтобы это работало для всех типов страниц, будь то страница, пост, категория, тег или страница автора.

Итак, снова, http://example.com/subfolder/any-type-of-url/ => http://example.com/country_code/any-type-of-url/

Помните, country_code — это код страны пользователя/посетителя в формате ISO.

Дайте знать, если кому-то нужна дополнительная информация по этому вопросу. Спасибо заранее.

PS: Я пытался добиться этого, используя функцию add_rewrite_rule(), доступную в WP.

Я думаю, что самая сложная часть — убрать часть с подпапкой из URL на сайте WordPress в обоих местах.

Что, если вы измените имя подпапки на international и измените правила переписывания, чтобы перед URL-адресами стояли коды ISO?

Таким образом, у вас будет:

Чтобы добавить коды ISO, вы можете попробовать сделать это самостоятельно, используя фильтр rewrite_rules_array или просто использовать плагин для перевода, такой как Polylang, который уже автоматически добавляет эти коды к URL и может даже выполнять определение языка браузера.

Чтобы сделать это самостоятельно, я бы сделал что-то вроде этого: (очень простой пример)

function add_iso_codes_to_url( $rules ) {

    $new_rules = [];

    $iso_codes="(?:us/|uk/)?";

    // главная страница
    $new_rules[$iso_codes . '/?$'] = 'index.php';

    // Измените другие правила
    foreach ( $rules as $key => $rule ) {

        if ( substr( $key, 0, 1 ) === '^' ) { 

            $new_rules[ $iso_codes . substr( $key, 1 ) ] = $rule;

        } else {

            $new_rules[ $iso_codes . $key ] = $rule;

        }
    }

    return $new_rules;
}
add_filter( 'rewrite_rules_array', 'add_iso_codes_to_url' );

Ответ или решение

Динамическое изменение URL для подкаталогов с кодами стран в WordPress

Вам необходимо динамически изменять URL вашего WordPress сайта, который использует подкаталог для лучшего восприятия пользователями из разных стран. Например, вы хотите заменять URL http://example.com/subfolder/ на http://example.com/us/, в зависимости от того, из какой страны заходит пользователь. В этой статье я предлагаю вам детальный подход к реализации такой функциональности.

Шаг 1: Установка и подготовка

Прежде всего, убедитесь, что у вас установлены необходимые плагины для получения информации о кодах стран. Один из наиболее распространённых подходов — использовать API, который предоставляет информацию о геолокации по IP-адресу, например ipinfo.io.

Шаг 2: Получение кода страны

Давайте начнем с создания функции, которая определяет код страны для каждого посетителя:

function get_country_code() {
    $ip = $_SERVER['REMOTE_ADDR'];
    $response = wp_remote_get("https://ipinfo.io/{$ip}/json");

    if (is_wp_error($response)) {
        return 'us'; // По умолчанию можно вернуть 'us'
    }

    $data = json_decode(wp_remote_retrieve_body($response));
    return isset($data->country) ? strtolower($data->country) : 'us'; // Возвращаем код страны, или 'us'
}

Шаг 3: Добавление правил переписывания

Следующий шаг — использование add_rewrite_rule() для установки новых правил, которые заменят /subfolder/ на код страны. Добавим следующее в функции вашего плагина или в functions.php вашей темы:

function add_iso_codes_to_url($rules) {
    $new_rules = [];
    $country_code = get_country_code();

    // Добавляем правило для домашней страницы
    $new_rules[$country_code . '/?$'] = 'index.php';

    // Обрабатываем остальные правила
    foreach ($rules as $key => $rule) {
        if (substr($key, 0, 1) === '^') {
            $new_rules[$country_code . substr($key, 1)] = $rule;
        } else {
            $new_rules[$country_code . '/' . $key] = $rule;
        }
    }

    return $new_rules;
}
add_filter('rewrite_rules_array', 'add_iso_codes_to_url');

Шаг 4: Обработка перенаправлений

Теперь необходимо перенаправлять запросы с подкаталога на новые URL. Используйте следующий код для обработки этого:

function redirect_from_subfolder() {
    $country_code = get_country_code();
    $requested_url = $_SERVER['REQUEST_URI'];

    if (strpos($requested_url, '/subfolder/') === 0) {
        $new_url = str_replace('/subfolder/', "/{$country_code}/", $requested_url);
        wp_redirect(home_url($new_url), 301);
        exit();
    }
}
add_action('template_redirect', 'redirect_from_subfolder');

Шаг 5: Очистка правил переписывания

Не забудьте перезагрузить правила переписывания после добавления новых. Это можно сделать, просто перейдя в настройки постоянных ссылок в админке WordPress и нажав «Сохранить изменения», чтобы обновить правила.

Заключение

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

Теперь вы полностью готовы к реализации динамических URL в вашем WordPress проекте. Если у вас возникнут дополнительные вопросы, можете смело обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...