Как сделать, чтобы любой URL после /info/ открывал одну страницу в WordPress
В WordPress иногда требуется, чтобы все запросы к несуществующим страницам, начинающимся с определённого префикса (например, /info/), перенаправлялись на одну и ту же существующую страницу, а оставшаяся часть URL („любая ересь“) передавалась для дальнейшей обработки. Это может быть полезно для создания динамических лендингов, партнёрских ссылок или систем фильтрации контента. Рассмотрим два основных подхода: через файл .htaccess (Apache) и через хук template_redirect в functions.php.
Способ 1: через .htaccess (Apache)
Если ваш сервер использует Apache, добавьте в корневой файл .htaccess перед строкой # BEGIN WordPress следующий код:
RewriteEngine On
RewriteRule ^info/(.+)$ /info/ [L,QSA]Это правило перенаправляет любой URL вида /info/любая_ересь на /info/, сохраняя все GET-параметры. Однако обратите внимание: оригинальный путь („ересь“) при таком подходе теряется - вы не сможете его обработать на стороне PHP, так как браузер получит редирект на чистую страницу. Для передачи данных используйте второй способ.
Способ 2: через functions.php (WordPress)
Более гибкое решение - перехватить запрос до того, как WordPress сгенерирует 404 ошибку. Добавьте в файл functions.php вашей темы (дочерней) следующий код:
add_action('template_redirect', 'redirect_any_info_path');
function redirect_any_info_path() {
if (is_404()) {
$request_uri = $_SERVER['REQUEST_URI'];
if (preg_match('#^/info/(.+)#', $request_uri, $matches)) {
$extra_part = $matches[1]; // содержит "любая ересь"
// Здесь вы можете обработать $extra_part, например, сохранить в сессию или передать через GET
wp_redirect(home_url('/info/') . '?extra=' . urlencode($extra_part));
exit;
}
}
}Теперь при обращении к /info/любая+ересь/ пользователь будет перенаправлен на /info/?extra=любая+ересь, а вы сможете получить значение через $_GET['extra'] на странице /info/.
Способ 3: через RewriteRule с передачей параметра (продвинутый)
Если вы не хотите делать внешний редирект (чтобы URL в браузере оставался исходным), можно использовать внутреннюю перезапись через .htaccess и глобальную переменную:
RewriteEngine On
RewriteRule ^info/(.+)$ /index.php?pagename=info&extra=$1 [L,QSA]В этом случае WordPress будет думать, что запрошена страница info, а параметр extra будет доступен через get_query_var('extra') (предварительно зарегистрировав его через add_rewrite_tag в functions.php).
Частые ошибки и их решение
- После добавления кода страница не открывается - проверьте, что файл
.htaccessдоступен для записи, а вfunctions.phpнет синтаксических ошибок. - Параметр extra не передаётся - убедитесь, что вы зарегистрировали rewrite-тег:
add_rewrite_tag('%extra%', '([^&]+)');и сбросили правила перезаписи (зайдите в Настройки → Постоянные ссылки и нажмите „Сохранить изменения“). - Редирект в цикл - добавьте условие проверки, что редирект не выполняется повторно (например, используйте
wp_redirectтолько приis_404()).
Заключение
Выбор метода зависит от ваших задач: если нужно просто перенаправить на одну страницу, подойдёт простой редирект через .htaccess. Если требуется обрабатывать переданный сегмент URL („любая ересь“) - используйте template_redirect или внутреннюю перезапись с rewrite-правилами. Все три варианта проверены на WordPress 5.x и 6.x.