Вопрос или проблема
У меня есть эти блоки кода в моем 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;
}
Дополнительные рекомендации
-
Сброс правил перезаписи: После изменения правил перезаписи необходимо выполнить их сброс. Это можно сделать, просто перейдя на страницу администратора WordPress в раздел "Настройки" > "Постоянные ссылки" и нажав "Сохранить изменения". Это действие без необходимости вносить изменения в фактические настройки гарантирует, что новые правила будут применены.
-
Тестирование: После сброса правил тщательно протестируйте сайт. Убедитесь, что только нужные URL перенаправляются на правильный шаблон, а любые другие вариации — нет.
-
Регулярные выражения: Если вы столкнулись с другими сложными вариациями URL, возможно, стоит углубиться в изучение регулярных выражений. Понимание синтаксиса и логики регулярных выражений поможет в создании более гибких и точных правил.
Эти шаги помогут вам точно контролировать, какие URL разрешены и маршрутизируются в рамках вашего приложения WordPress, что улучшит его функциональность и соответствие ожидаемому поведению.