Собственные RewriteRule в WordPress

Опубликовано:

В некоторых случаях очень удобно и полезно использовать собственные RewriteRule в WordPress, как минимум для красивых адресов постраничного отображения каких-либо списков.

Например, нужно реализовать постраничный вывод в собственной (custom) Taxonomy “tools”, чтобы адрес при постраничном выводе выглядел примерно так:

/tools/scissors/p2

где «p2» является идентификатором второй страницы списка “категории” инструментов “ножницы” (scissors).

Инициализировать RewriteRule в WordPress лучше при событии “init”, то есть требуется создать функцию, которая будет выполняться при инициализации WordPress.

    add_action('init', 'Tools_RewriteRule_Init');

    function Tools_RewriteRule_Init()
    {
        add_rewrite_tag('%tools-slug%', '([^&]+)');        
        add_rewrite_tag('%pg%', '([^&]+)');

        add_rewrite_rule('tools\/([a-z0-9_-]{1,})$', 'index.php?page_id=25&tools-slug=$matches[1]', 'top');
        add_rewrite_rule('tools\/([a-z0-9_-]{1,})\/p([0-9]{1,})$', 'index.php?page_id=25&tools-slug=$matches[1]&pg=$matches[2]', 'top');

        flush_rewrite_rules();
    }

Здесь важно заметить, что работа с шаблоном Taxonomy ведется через объект страницы, поэтому добавлено два дополнительных GET-параметра “page_id” (ID страницы, к которой применен свой собственный шаблон для работы с Taxonomy “tools”) и “tools-slug” (идентификатор Taxonomy). В строках 5 и 6 мы определяем тэги (GET) в правила формирования адреса, которые потом сможем получить в виде значений в переменных. В строках 8 и 9 добавляем правила для разбора новых адресов.

Функция “add_rewrite_tag” имеет два входных параметра:

  1. Имя GET-переменной.
  2. Регулярное выражение для фильтра входящих данных GET-переменной.

Функция “add_rewrite_rule” имеет три входных параметра:

  1. Само правило нового адреса (все делается при помощи регулярных выражений, в том числе выделение переменных).
  2. Непосредственно внутренний адрес, который доносит собой к скриптам распарсенные (из пункта 1) данные.
  3. Приоритет данного RewriteRule в WordPress (“top” или “bottom”).

Все распарсенные и нужные данные адреса хранятся в массиве $matches[] (внутри этой функции), который используется во втором параметре (как показано на примере).

Вложенной функцией “flush_rewrite_rules” пересоздаются все доступные RewriteRule, по сути обновляется кэш всех правил. В принципе, данную функцию достаточно выполнить один раз, поэтому обычно после ее использования комментируют до следующих добавленных новых или измененных RewriteRule в WordPress.