Добавление правила перезаписи в WordPress: синтаксис, примеры использования

Добавление правила перезаписи в 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-файлом для рендеринга:

  1. Настройте правило:
add_action( 'init', function() {
    add_rewrite_rule( 'myparamname/([a-z0-9-]+)[/]?$', 'index.php?myparamname=$matches[1]', 'top' );
});
  1. Обновите постоянные ссылки. Перейдите в "WP Admin > Настройки > Постоянные ссылки > Сохранить". Это не произойдет автоматически после добавления кода.

  2. Добавьте переменную в белый список:

add_filter( 'query_vars', function( $query_vars ) {
    $query_vars[] = 'myparamname';
    return $query_vars;
});
  1. Добавьте обработчик, чтобы направить его на файл шаблона:
add_action( 'template_include', function( $template ) {
    if ( get_query_var( 'myparamname' ) ) {
        return get_template_directory() . '/template-name.php'; 
    }
    return $template;
});

Теперь вы можете использовать свои преведенные выше правила для работы с URL в WordPress!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *