add_rewrite_rule – как соответствовать точному целому слову только?

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

У меня есть эти блоки кода в моем function.php:

add_action('query_vars','add_query_vars'); function add_query_vars($vars) { array_push($vars, 'verify'); print_r($vars); return $vars; } add_action('init', 'verify_add_rewrite_rule'); function verify_add_rewrite_rule() { add_rewrite_rule('verify','index.php?verify=1&post_type=page','top'); } add_filter('template_include', 'template_include_verify', 1000, 1); function template_include_verify($template) { if (get_query_var('verify')) { $new_template = get_template_directory() . '/verify.php'; if (file_exists($new_template)) { $template = $new_template; } } return $template; } 

Я хочу, чтобы этот путь /verify/?t=xY325erqrtqXxooox вел к указанному шаблону.

Но почему следующие пути также ведут к указанному шаблону?

/verifxx/?t=xY325erqrtqXxooox /verify-xxx/?t=xY325erqrtqXxooox 

Как я могу убедиться, что только /verify/?t=xY325erqrtqXxooox ведет к указанному шаблону?

Вот обновленный код с объяснением и добавленными последними двумя строками:

Обновленный код с последними двумя строками

add_action('query_vars', 'add_query_vars'); function add_query_vars($vars) { $vars[] = 'verify'; // Добавьте 'verify' в качестве переменной запроса return $vars; } add_action('init', 'verify_add_rewrite_rule'); function verify_add_rewrite_rule() { // Используйте ^verify/?$ для строгой привязки "verify" и завершающего сочетания add_rewrite_rule('^verify/?$', 'index.php?verify=1&post_type=page', 'top'); } add_filter('template_include', 'template_include_verify', 1000, 1); function template_include_verify($template) { if (get_query_var('verify')) { $new_template = get_template_directory() . '/verify.php'; if (file_exists($new_template)) { $template = $new_template; } } return $template; } 

Дополнительные заметки:

Строгая привязка правил перезаписи: Это гарантирует, что будет совпадать только /verify/ (с косой чертой в конце или без нее). Частичные пути, такие как /verifxx/ или /verify-xxx/ не будут направлены в ваш шаблон.

Сбросить правила перезаписи: после обновления кода перейдите в Настройки > Постоянные ссылки в WordPress и нажмите “Сохранить изменения”, чтобы сбросить правила перезаписи.

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

Вопрос о том, как настроить add_rewrite_rule в WordPress для точного совпадения лишь с целым словом, часто возникает среди разработчиков, занимающихся персонализацией адресов и маршрутизацией запросов в своих приложениях. В данной ситуации требуется, чтобы только путь /verify/?t=xY325erqrtqXxooox перенаправлялся на конкретный шаблон, исключая похожие, но несоответствующие пути, такие как /verifxx/?t=xY325erqrtqXxooox.

Теория

Функция add_rewrite_rule() в WordPress используется для добавления правил переписывания URL, позволяя изменить маршрутизацию запросов, проходящих через ваш сайт. Однако использование регулярных выражений может привести к неверному сопоставлению желаемых маршрутов, если они заданы неправильно. Регулярные выражения — это мощный инструмент, но их точность зависит от конкретного синтаксиса.

Синтаксис ^verify/?$ используется для строгого соответствия началу и концу строки, где:

  • ^ указывает на начало строки;
  • verify — это само слово, которое необходимо точно сопоставить;
  • /? означает, что слэш после слова verify является необязательным;
  • $ указывает на конец строки, обеспечивая, что за verify не может быть никакой другой строки.

Пример

Ваш изначальный код правил переписывания выглядит следующим образом:

add_action('init', 'verify_add_rewrite_rule');
function verify_add_rewrite_rule() {
    add_rewrite_rule('verify','index.php?verify=1&post_type=page','top');
}

Это правило позволяет совпадениям быть более гибкими, отсюда и возникают проблемы с совпадениями таких путей, как /verifxx/ или /verify-xxx/.

Чтобы решить эту проблему, замените строку add_rewrite_rule() на:

add_rewrite_rule('^verify/?$', 'index.php?verify=1&post_type=page', 'top');

Применение

После внесения изменений в код, ваш файл functions.php должен выглядеть следующим образом:

add_action('query_vars', 'add_query_vars');
function add_query_vars($vars) {
    $vars[] = 'verify'; // Добавление переменной запроса 'verify'
    return $vars;
}

add_action('init', 'verify_add_rewrite_rule');
function verify_add_rewrite_rule() {
    // Правило, которое строго совпадает с "verify" и гарантирует, что ничего не следует после
    add_rewrite_rule('^verify/?$', 'index.php?verify=1&post_type=page', 'top');
}

add_filter('template_include', 'template_include_verify', 1000, 1);
function template_include_verify($template) {
    if (get_query_var('verify')) {
        $new_template = get_template_directory() . '/verify.php';
        if (file_exists($new_template)) {
            $template = $new_template;
        }
    }
    return $template;
}

Дополнительные рекомендации

  1. Сброс правил перезаписи: После изменения правил перезаписи необходимо выполнить их сброс. Это можно сделать, просто перейдя на страницу администратора WordPress в раздел "Настройки" > "Постоянные ссылки" и нажав "Сохранить изменения". Это действие без необходимости вносить изменения в фактические настройки гарантирует, что новые правила будут применены.

  2. Тестирование: После сброса правил тщательно протестируйте сайт. Убедитесь, что только нужные URL перенаправляются на правильный шаблон, а любые другие вариации — нет.

  3. Регулярные выражения: Если вы столкнулись с другими сложными вариациями URL, возможно, стоит углубиться в изучение регулярных выражений. Понимание синтаксиса и логики регулярных выражений поможет в создании более гибких и точных правил.

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

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

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