Вопрос или проблема
Я знаю, что этот вопрос задавалась множество раз, но я не нашел ни одного работающего решения или примера, который я мог бы использовать для решения своей проблемы.
Я работал над сайтом клиента. Есть два схожих сайта: один для их собственной страны и второй для посетителей из других стран.
Их основной сайт размещен в корне сервера, а второй сайт размещен в подпапке.
Теперь я хочу динамическую переадресацию 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 проекте. Если у вас возникнут дополнительные вопросы, можете смело обращаться за помощью!