Добавление правила перезаписи в WordPress
Функция ADD_REWRITE_RULE() в WordPress используется для добавления правила перезаписи, которое преобразует структуру URL в набор переменных запроса.
При любых значениях параметра $after, кроме 'bottom', правило будет установлено в верхней части списка правил перезаписи.
Скорость выполнения
- 1 раз — 0.000001 сек (скорость света)
- 50000 раз — 0.03 сек (скорость света)
- Версия PHP: 7.1.11, WordPress: 4.9.8
Возвращаемое значение
Функция возвращает null, то есть ничего.
Использование
Вот как выглядит синтаксис функции:
add_rewrite_rule( $regex, $query, $after );
$regex(строка, обязательный) — регулярное выражение для сопоставления запросов.$query(строка|массив, обязательный) — соответствующие переменные запроса для этого правила перезаписи.$after(строка) — приоритет нового правила. Принимает значения 'top' или 'bottom'. По умолчанию: 'bottom'.
Примеры использования
Пример 1: Дружественные URL для страниц
Предположим, что мы создали страницу "питание" (nutrition, ID=12), чтобы отображать различные сведения о питании. Мы заменим некрасивый URL /nutrition?food=mush&variety=semolina на более читаемый: /nutrition/mush/semolina.
add_action( 'init', 'do_rewrite' );
function do_rewrite(){
add_rewrite_rule( '^(nutrition)/([^/]*)/([^/]*)/?', 'index.php?pagename=$matches[1]&food=$matches[2]&variety=$matches[3]', 'top' );
// Уведомляем WordPress о новых переменных запроса
add_filter( 'query_vars', function( $vars ){
$vars[] = 'food';
$vars[] = 'variety';
return $vars;
} );
}
После добавления данного кода необходимо обновить правила перезаписи. Для этого просто зайдите на страницу "Настройки > Постоянные ссылки".
Теперь вы можете получить параметры в коде страницы с помощью функции get_query_var():
echo get_query_var('food'); // mush
echo get_query_var('variety'); // semolina
По умолчанию WordPress не распознает новые переменные запроса, используемые для перезаписи. Чтобы это исправить, необходимо зарегистрировать их с помощью add_rewrite_tag() или через фильтр query_vars. Если этого не сделать, правило перезаписи не будет работать.
Чтобы правило заработало, нужно обновить (или сбросить) правила в базе данных, вызвав функцию flush_rules(). Либо просто перейдите в "Настройки > Постоянные ссылки", где функция flush_rules() будет автоматически вызвана.
Пример 2: Дружественный URL для страницы
Вот пример создания дружественного URL для статической страницы:
add_action( 'init', 'rewrite_rule_my' );
function rewrite_rule_my(){
add_rewrite_rule( '^(sitemap)/([^/]*)/?', 'index.php?pagename=$matches[1]&pagetype=$matches[2]', 'top' );
add_rewrite_tag( '%pagetype%', '([^&]+)' );
}
Теперь при переходе к /sitemap/value вы можете использовать переменную $wp_query->query_vars['pagetype'] для получения значения value или с помощью get_query_var('pagetype').
Пример 3: Дружественный URL для дочерней страницы
Если вам нужно передать полный путь дочерней страницы, используйте следующий код:
add_rewrite_rule( '^(parent/slug)/([^/]*)', 'index.php?pagename=$matches[1]&foo=$matches[2]', 'top' );
Теперь WordPress будет распознавать URL в формате /parent/slug/value, где значение можно будет получить через get_query_var('foo').
Пример 4: Перенаправление на скрипты, отличные от index.php
Вы можете использовать правила перезаписи для перенаправления на другие скрипты, например:
add_action( 'init', 'custom_rewrite_rule', 10, 0 );
function custom_rewrite_rule() {
add_rewrite_rule( 'nutrition/([^/]*)/([^/]*)/?', 'path/to/script.php?food=&variety=', 'top' );
}
При добавлении такого правила WordPress передаст эти перенаправления в .htaccess, что обеспечит возможность использования переменных с помощью $1 вместо $matches[1].
Пример 5: Дружественная ссылка для входа
Этот пример демонстрирует, как настроить вход на сайт, используя дженерик URL:
add_action( 'init', 'wp_pretty_login' );
function wp_pretty_login() {
add_rewrite_rule( 'login$', 'wp-login.php', 'top' );
}
Теперь при переходе к /login вы будете перенаправлены на страницу логина без изменения URL.
Регистрация нового правила перезаписи
Вот простой пример, как зарегистрировать новое правило и связать его с PHP-файлом для рендеринга:
- Настройте правило:
add_action( 'init', function() {
add_rewrite_rule( 'myparamname/([a-z0-9-]+)[/]?$', 'index.php?myparamname=$matches[1]', 'top' );
});
-
Обновите постоянные ссылки. Перейдите в "WP Admin > Настройки > Постоянные ссылки > Сохранить". Это не произойдет автоматически после добавления кода.
-
Добавьте переменную в белый список:
add_filter( 'query_vars', function( $query_vars ) {
$query_vars[] = 'myparamname';
return $query_vars;
});
- Добавьте обработчик, чтобы направить его на файл шаблона:
add_action( 'template_include', function( $template ) {
if ( get_query_var( 'myparamname' ) ) {
return get_template_directory() . '/template-name.php';
}
return $template;
});
Теперь вы можете использовать свои преведенные выше правила для работы с URL в WordPress!