Как сделать, чтобы любой 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.

    Часто задаваемые вопросы