WP_Rewrite{}
Клас ядра, який розбирає запитуваний URL (ЧПУ) і створює з нього зрозумілий для WordPress “внутрішній” URL. Цей клас використовується як API для створення ЧПУ (людсько-зрозумілих посилань).
За допомогою цього класу WordPress розуміє, яку сторінку потрібно показати: сторінку запису, категорії, архіву і т.д. Наприклад, ми просимо сторінку http://example.com/mypage
WP_Rewrite розбирає цей ЧПУ і переробляє його у вигляд: http://example.com/index.php?pagename=mypage
, а далі WordPress працює з параметрами запиту. Параметри запиту фільтруються через “білий список” і залишаються лише дозволені. Потрібно це для захисту. Отримати значення будь-якої змінної запиту можна за допомогою функції get_query_var() .
Робота класу WP_Rewrite тісно пов’язана з класом WP . WP_Rewrite розбирає та робить зрозумілим для WordPress поточний URL (ЧПУ), а WP створює та обробляє “вже зрозумілу URL” і на основі результату встановлює глобальні змінні, і видає потрібну сторінку сайту.
За допомогою класу WP_Rewrite можна навчити WordPress розуміти ЧПК будь-якого роду. Також можна навчити пропускати зазначені URL на рівні файлу .htaccess
. Див. метод WP_Rewrite::add_external_rule( $regex, $query ) .
Цей клас працює лише для зовнішньої частини сайту (фронтенду). В адмінці ЧПУ не використовуються.
Правила перезапису ЧПУ в зрозумілий URL зберігаються у базі даних, у таблиці wp_options
опцію rewrite_rules
– get_option( 'rewrite_rules' )
. Опція оновлюється при оновленні постійних посилань в адмінці WordPress або при скиданні правил за допомогою flush_rewrite_rules() .
Хуки із класу
Повертає
Екземпляр класу.
Властивості класу
-
$permalink_structure
(рядок) -
Структура ЧПУ для постів.
Типово: null -
$use_trailing_slashes
(логічний) -
Чи потрібно додавати замикаючий слеш на кінці посилань?
Типово: null -
$author_base
(рядок) -
База для ЧПУ сторінки авторів:
example.com/$author_base/authorname
Типово: ‘author’ -
$author_structure
(рядок) -
Структура ЧПУ для архіву авторів
Типово: null -
$date_structure
(рядок) -
Структура ЧПУ для архіву дати.
Типово: null -
$page_structure
(рядок) -
Структура ЧПУ для незмінних сторінок.
Типово: null -
$search_base
(рядок) -
База для ЧПУ сторінки пошуку:
example.com/$search_base/query
Типово: ‘search’ -
$search_structure
(рядок) -
Структура ЧПУ для пошуку сторінки.
Типово: null -
$comments_base
(рядок) -
База для ЧПУ коментаря.
За замовчуванням: ‘comments’ -
$pagination_base
(рядок) -
База для ЧПУ пагінації.
За замовчуванням: ‘page’ -
$comments_pagination_base
(рядок) -
База для ЧПУ пагінації коментаря.
За замовчуванням: ‘comment-page’ -
$feed_base
(рядок) -
База для ЧПУ Фіда.
За замовчуванням: ‘feed’ -
$comment_feed_structure
(рядок) -
Структура ЧПУ для URL-фіда.
Типово: null -
$feed_structure
(рядок) -
Структура ЧПУ для URL-адрес під запит (request) фіда.
Типово: null -
$front
(рядок) -
Префікс структури ЧПК. Якщо структура ЧПУ виглядає так:
/ID-%post_id%
, тоді префікс дорівнюватиме
/ID-
. А якщо так:
/%year%/%postname%/
то префікс =
/
.
Детальніше дивіться:
WP_Rewrite::init()
Типово: null -
$root
(рядок) -
Префікс для всіх структур ЧПК.
Якщо використовується структура PATHINFO або index, цей параметр дорівнює значенню властивості
WP_Rewrite::$index із замикаючим слешем на кінці.
Дивіться:
WP_Rewrite::init()
Дивіться:
WP_Rewrite::using_index_permalinks()
За замовчуванням: ” -
$index
(рядок) -
Назва файлу, на який повинні надсилатися всі запити.
За замовчуванням: ‘index.php’ -
$matches
(рядок) -
Назва змінної яка використовуватиметься у регулярних виразах у рядку результуючого запиту, пр.:
index.php?pagename=$matches[1]
.
За замовчуванням: ” -
$extra_rules
(масив) -
Додаткові правила перезапису, додані до класу за межами.
Вони не створюються класом автоматично. Детальніше див:
add_rewrite_rule() .
За замовчуванням: array() -
$rules
(масив) -
Правила перезапису URL на основі яких буде отримано поточний запит або зроблено редирект. Це, можна сказати, основна властивість, в якій зберігаються всі основні правила перезапису URL.
Типово: null -
$extra_rules_top
(масив) -
Додаткові правила перезапису, які виконуватимуться на початку, тобто. раніше правил із властивостей:
$extra_rules
і
$rules
.
Вони не створюються класом автоматично. Детальніше див:
add_rewrite_rule() .
За замовчуванням: array() -
$non_wp_rules
(масив) -
Правила, які не перенаправляють (не дивляться) на файл
index.php
.
Ці правила записуються в порцію правил mod_rewrite у
.htaccess
. Щоб додати такі правила, використовуйте метод
WP_Rewrite::add_external_rule($regex, $query) .
За замовчуванням: array() -
$extra_permastructs
(масив) -
Додаткові структури ЧПУ, наприклад, до них відносяться ЧПК рубрик, які додаються за допомогою функції
add_permastruct() .
За замовчуванням: array() -
$use_verbose_rules
(логічний) -
Якщо встановити в true, всі правила перезапису будуть записуватися як правила
mod_rewrite
у файлі
.htaccess
.
За замовчуванням функцію вимкнено, увімкнення цієї опції додати багато правил до
.htaccess
.
Дивіться також:
WP_Rewrite::mod_rewrite_rules()
За замовчуванням: false -
$endpoints
(масив) -
Кінцеві точки на кшталт
/trackback/
типів ЧПУ (наприклад постів і сторінок), додаються функцією
add_rewrite_endpoint( $name, $places ) .
За замовчуванням: -
$use_verbose_page_rules
(логічний) Чи схожа структура ЧПУ постів на структуру постійних сторінок?
Якщо перший тег в постах CNC може бути схожий на назву сторінки, наприклад, ЧПУ починається з
%postname%
або%author%
, то може бути плутанина, в таких випадках потрібно встановити цей прапор в true, для додаткової перевірки типу запису.До версії 3.3. цей прапор виставляв ЧПУ сторінок вгору всіх правил, щоб вони перевірялися першими. А тепер цей прапор каже WP::parse_request() перевіряти URL на схожість зі структурою сторінок і якщо це так, то перед прийняттям ЧПУ перевіряється тип запису – чи це дійсно сторінка.
Типово: true-
$rewritecode
(масив) Теги перезапису, які можна використовувати у структурі ЧПУ. Додаються за допомогою функції add_rewrite_tag() .
Ці теги перекладаються у відповідні частини регулярного виразу, які вказуються у властивості $rewritereplace , а потім частини регулярного виразу переписуються у відповідну частину запиту, яка знаходиться у властивості $queryreplace .
За замовчуванням:
array( '%year%', '%monthnum%', '%day%', '%hour%', '%minute%', '%second%', '%postname%', '%post_id%', '%author%', '%pagename%', '%search%' )
-
$rewritereplace
(масив) Частини регулярного виразу, якими буде замінено тег із властивості $rewritecode .
За замовчуванням:
array( '([0-9]{4})', '([0-9]{1,2})', '([0-9]{1,2})', '([0-9]{1,2})', '([0-9]{1,2})', '([0-9]{1,2})', '([^/]+)', '([0-9]+)', '([^/]+)', '([^/]+?)', '(.+)' )
-
$queryreplace
(масив) Параметри запиту, значення якого буде встановлено з входження частини регулярного виразу з властивості $rewritereplace .
За замовчуванням:
array( 'year=', 'monthnum=', 'day=', 'hour=', 'minute=', 'second=', 'name=', 'p=', 'author_name=', 'pagename=', 's=' )
-
$feeds
(масив) -
Фіди, що підтримуються.
За замовчуванням: array( ‘feed’, ‘rdf’, ‘rss’, ‘rss2’, ‘atom’ )
Методи класу
- __construct()
-
Конструктор – викликає метод
init() . - add_endpoint( $name, $places, $query_var = true )
-
Додає кінцеву точку, наприклад,
/trackback/ . Додаються додаткові правила перезапису ЧПК із зазначеною кінцевою точкою. Дивіться опис функції
add_rewrite_endpoint() . - add_external_rule( $regex, $query )
-
Додає правила перезапису, яке не стосується WordPress до файлу
index.php . - add_permastruct( $name, $struct, $args = array() )
-
Дозволяє додати додаткову структуру постійних посилань для створення ЧПУ. Дивіться опис функції
add_permastruct() . - add_rewrite_tag( $tag, $regex, $query )
-
Додає/оновлює тег запиту (наприклад, %pagetype%), який можна використовувати в ЧПУ. Дивіться опис функції
add_rewrite_tag() . - add_rule( $regex, $query, $after = ‘bottom’ )
-
Додає додаткове правило перезапису URL (ЧПУ) у внутрішній URL-адресу з параметрами запиту. Створює додаткове правило. Дивіться опис функції
add_rewrite_rule() . - flush_rules( $hard = true )
-
Оновлює правила перезапису посилань (ЧПУ) у базі даних та кеші. Опис функції
flush_rewrite_rules() . - generate_rewrite_rule( $permalink_structure, $walk_dirs = false )
-
Створює правила з урахуванням зазначеної ЧПУ структури. Правила створюються тільки для директорій, зазначених у ЧПУ (параметр
walk_dirs з функції
add_permastruct() ). Це урізаний виклик методу
generate_rewrite_rules() - generate_rewrite_rules( $permalink_structure, $ep_mask = EP_NONE, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true )
- Створює правила перезапису з урахуванням зазначеної ЧПУ структури.
- get_author_permastruct()
- Отримує структуру ЧПК для сторінки автора.
- get_category_permastruct()
- Отримує структуру ЧПК на сторінці рубрик.
- get_comment_feed_permastruct()
- Отримує структуру ЧПУ для сторінки фіду коментарів.
- get_date_permastruc()
- Отримує структуру ЧПК для сторінки дати: рік, місяць та день.
- get_year_permastruct()
- Отримує структуру ЧПК для сторінки року: дата без дня та місяця.
- get_month_permastruct()
- Отримує структуру ЧПК на сторінку місяця: дата без дня.
- get_day_permastruct()
-
Отримує структуру ЧПК для сторінки дня. Ідентично
get_date_permastruc() . - get_extra_permastruct( $name )
-
Отримує довільну структуру ЧПУ, вказану в параметрі
$name . - get_feed_permastruct()
- Отримує структуру ЧПУ для сторінки фіда.
- get_page_permastruct()
- Отримує структуру ЧПУ для постійної сторінки.
- get_search_permastruct()
- Отримує структуру ЧПУ для пошуку.
- get_tag_permastruct()
- Отримує структуру ЧПУ для сторінки міток.
- iis7_url_rewrite_rules()
-
Отримує правила перезапису у форматі IIS7 для запису до файлу
web.config . - init()
- Ініціалізація всього класу, встановлює властивості об’єкта.
- mod_rewrite_rules()
-
Отримує правила перезапису, призначені для запису у файл
.htaccess . - page_rewrite_rules()
- Отримує всі правила перезапису постійних сторінок.
- page_uri_index()
Отримує шляхи URL всіх постійних сторінок та їх вкладень. Поверне такий масив:
Array ( [0] => Array ( [about/portfolio] => 3644 [about] => 7 ) [1] => Array ( [about/photo1] => 824 [about/photo2] => 5484 ) )
- preg_index( $number )
-
Індекси для входжень, що використовуються в функціях
preg_*() . - remove_permastruct( $name )
-
Видаляє структуру ЧПУ за назвою. remove_permastruct
() - remove_rewrite_tag($tag)
-
Видаляє тег перезапису. remove_rewrite_tag
() - rewrite_rules()
-
Створює правила перезапису та відповідні запити на основі структур ЧПУ. Правила зберігаються в опцію
get_option( 'rewrite_rules' )
при виклику методу
wp_rewrite_rules() . - set_category_base( $category_base)
- Встановлює базу категорій для URL-категорій.
- set_permalink_structure( $permalink_structure )
- Встановлює основну структуру ЧПК для сайту.
- set_tag_base( $tag_base )
- Встановлює базу позначок для URL-адрес.
- using_index_permalinks()
-
Визначає чи використовуються ЧПУ для
index.php та модуль перезапису не активований. - using_mod_rewrite_permalinks()
-
Визначає чи використовуються ЧПУ для
mod_rewrite та модуль перезапису не активовано. - using_permalinks()
- Визначає чи використовуються ЧПУ.
- wp_rewrite_rules()
-
Отримує всі правила перезапису, які повертає метод
rewrite_rules() . І оновлює опцію
get_option( 'rewrite_rules' )
.
Функції-обгортки для класу WP_Rewrite
Для зручного використання WP_Rewrite в wordpress існують функції-обгортки:
add_rewrite_rule() ― Додає правила для ЧПУ. Створює додаткові правила перезапису УРЛ.
add_rewrite_tag() ― Додає змінну запиту до WordPress. ?pagetype=mypage, тут pagetype — змінна запит.
remove_rewrite_tag() ― Видаляє існуючий тег запиту, наприклад %postname%.
flush_rewrite_rules() ― Оновлює правила перезапису ЧПК: видаляє наявні, генерує та записує нові.
add_permastruct() ― Дозволяє додати додаткову структуру постійних посилань для створення ЧПУ.
- remove_permastruct() ― Видаляє раніше додану структуру ЧПК (постійних посилань).
Хуки класу WP_Rewrite для плагінів
Так як ЧПУ – це частина системи та функціоналу сайту, WordPress дозволяє впроваджуватись у процес генерації правил перезапису URL. Метод rewrite_rules() містить 9 фільтрів:
post_rewrite_rules ― змінює правила перезапису URL постів. Передає: $post_rewrite
date_rewrite_rules ― змінює правила перезапису URL-адрес дат. Передає: $date_rewrite
(permastructname)_rewrite_rules ― змінює правила перезапису будь-якої структури ЧПУ, назва вказується в $permastructname. Передає: $rules
search_rewrite_rules ― правила перезапису URL пошуку.
comments_rewrite_rules ― правила перезапису URL фіда останніх коментарів: /comments/feed/ .
author_rewrite_rules ― правила перезапису URL авторів.
page_rewrite_rules ― правила перезапису URL-адрес постійних сторінок.
root_rewrite_rules ― правила перезапису URL кореня сайту.
generate_rewrite_rules ― ця подія спрацьовує після того, як усі правила створені. Передає весь об’єкт WP_Rewrite за посиланням.
rewrite_rules_array ― змінює всі правила перезапису в одному масиві. Фільтр спрацьовує наприкінці.
- mod_rewrite_rules ― змінює всі правила, аналог фільтра ‘generate_rewrite_rules’ тільки для правил файлу .htaccess .
Приклади
#1 Як виглядає глобальна змінна $wp_rewrite
WP_Rewrite Object ( [permalink_structure] => /id_%post_id%/%postname%.html [use_trailing_slashes] => [author_base] => author [page_structure] => %pagename% [search_base] => search [comments_base] => comments [pagination_base] => page [comments_pagination_base] => comment-page [feed_base] => feed [front] => /id_ [root] => [index] => index.php [matches] => [rules] => Array ( [(filecode)(/.*)$] => index.php?pagename=$matches[1]&file_path=$matches[2] [(sitemap)/([^/]*)/?] => index.php?pagename=$matches[1]&pagetype=$matches[2] [article/?$] => index.php?post_type=article [article/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?post_type=article&feed=$matches[1] [article/(feed|rdf|rss|rss2|atom)/?$] => index.php?post_type=article&feed=$matches[1] [article/page/([0-9]{1,})/?$] => index.php?post_type=article&paged=$matches[1] [cat/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?category_name=$matches[1]&feed=$matches[2] [cat/(.+?)/(feed|rdf|rss|rss2|atom)/?$] => index.php?category_name=$matches[1]&feed=$matches[2] [cat/(.+?)/embed/?$] => index.php?category_name=$matches[1]&embed=true [cat/(.+?)/page/?([0-9]{1,})/?$] => index.php?category_name=$matches[1]&paged=$matches[2] [cat/(.+?)/?$] => index.php?category_name=$matches[1] [met/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?tag=$matches[1]&feed=$matches[2] [met/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?tag=$matches[1]&feed=$matches[2] [met/([^/]+)/embed/?$] => index.php?tag=$matches[1]&embed=true [met/([^/]+)/page/?([0-9]{1,})/?$] => index.php?tag=$matches[1]&paged=$matches[2] [met/([^/]+)/?$] => index.php?tag=$matches[1] [id_type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?post_format=$matches[1]&feed=$matches[2] [id_type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?post_format=$matches[1]&feed=$matches[2] [id_type/([^/]+)/embed/?$] => index.php?post_format=$matches[1]&embed=true [id_type/([^/]+)/page/?([0-9]{1,})/?$] => index.php?post_format=$matches[1]&paged=$matches[2] [id_type/([^/]+)/?$] => index.php?post_format=$matches[1] [robots.txt$] => index.php?robots=1 [.*wp-(atom|rdf|rss|rss2|feed|commentsrss2).php$] => index.php?feed=old [.*wp-app.php(/.*)?$] => index.php?error=403 [.*wp-register.php$] => index.php?register=true [feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1] [(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1] [ embed/?$] => index.php?&embed=true [page/?([0-9]{1,})/?$] => index.php?&paged=$matches[1] [comments/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1]&withcomments=1 [comments/(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1]&withcomments=1 [comments/embed/?$] => index.php?&embed=true [search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?s=$matches[1]&feed=$matches[2] [search/(.+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?s=$matches[1]&feed=$matches[2] [search/(.+)/embed/?$] => index.php?s=$matches[1]&embed=true [search/(.+)/page/?([0-9]{1,})/?$] => index.php?s=$matches[1]&paged=$matches[2] [search/(.+)/?$] => index.php?s=$matches[1] [id_author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$matches[1]&feed=$matches[2] [id_author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$matches[1]&feed=$matches[2] [id_author/([^/]+)/embed/?$] => index.php?author_name=$matches[1]&embed=true [id_author/([^/]+)/page/?([0-9]{1,})/?$] => index.php?author_name=$matches[1]&paged=$matches[2] [id_author/([^/]+)/?$] => index.php?author_name=$matches[1] [id_date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2 |atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4] [id_date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom )/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4] [id_date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/embed/?$] => index.php ?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&embed=true [id_date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{ 1,})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4] [id_date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$] => index.php?year =$matches[1]&monthnum=$matches[2]&day=$matches[3] [id_date/([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php? year=$matches[1]&monthnum=$matches[2]&feed=$matches[3] [id_date/([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year= $matches[1]&monthnum=$matches[2]&feed=$matches[3] [id_date/([0-9]{4})/([0-9]{1,2})/embed/?$] => index.php?year=$matches[1]&monthnum=$matches[ 2]&embed=true [id_date/([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$] => index.php ?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3] [id_date/([0-9]{4})/([0-9]{1,2})/?$] => index.php?year=$matches[1]&monthnum=$matches[2] [id_date/([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&feed=$matches[2 ] [id_date/([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&feed=$matches[2] [id_date/([0-9]{4})/embed/?$] => index.php?year=$matches[1]&embed=true [id_date/([0-9]{4})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&paged=$matches[ 2] [id_date/([0-9]{4})/?$] => index.php?year=$matches[1] [id_[0-9]+/[^/]+.html/attachment/([^/]+)/?$] => index.php?attachment=$matches[1] [id_[0-9]+/[^/]+.html/attachment/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1 [id_[0-9]+/[^/]+.html/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php? attachment=$matches[1]&feed=$matches[2] [id_[0-9]+/[^/]+.html/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment= $matches[1]&feed=$matches[2] [id_[0-9]+/[^/]+.html/attachment/([^/]+)/comment-page-([0-9]{1,})/?$] => index. php?attachment=$matches[1]&cpage=$matches[2] [id_[0-9]+/[^/]+.html/attachment/([^/]+)/embed/?$] => index.php?attachment=$matches[1]&embed=true [id_([0-9]+)/([^/]+).html/embed/?$] => index.php?p=$matches[1]&name=$matches[2]&embed=true [id_([0-9]+)/([^/]+).html/trackback/?$] => index.php?p=$matches[1]&name=$matches[2]&tb=1 [id_([0-9]+)/([^/]+).html/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?p=$matches[1 ]&name=$matches[2]&feed=$matches[3] [id_([0-9]+)/([^/]+).html/(feed|rdf|rss|rss2|atom)/?$] => index.php?p=$matches[1]&name =$matches[2]&feed=$matches[3] [id_([0-9]+)/([^/]+).html/page/?([0-9]{1,})/?$] => index.php?p=$matches[ 1]&name=$matches[2]&paged=$matches[3] [id_([0-9]+)/([^/]+).html/comment-page-([0-9]{1,})/?$] => index.php?p=$matches [1]&name=$matches[2]&cpage=$matches[3] [id_([0-9]+)/([^/]+).html(?:/([0-9]+))?/?$] => index.php?p=$matches[1 ]&name=$matches[2]&page=$matches[3] [id_[0-9]+/[^/]+.html/([^/]+)/?$] => index.php?attachment=$matches[1] [id_[0-9]+/[^/]+.html/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1 [id_[0-9]+/[^/]+.html/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment= $matches[1]&feed=$matches[2] [id_[0-9]+/[^/]+.html/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches [1]&feed=$matches[2] [id_[0-9]+/[^/]+.html/([^/]+)/comment-page-([0-9]{1,})/?$] => index.php? attachment=$matches[1]&cpage=$matches[2] [id_[0-9]+/[^/]+.html/([^/]+)/embed/?$] => index.php?attachment=$matches[1]&embed=true [id_[0-9]+/attachment/([^/]+)/?$] => index.php?attachment=$matches[1] [id_[0-9]+/attachment/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1 [id_[0-9]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed =$matches[2] [id_[0-9]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$ matches[2] [id_[0-9]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$] => index.php?attachment=$matches[1 ]&cpage=$matches[2] [id_[0-9]+/attachment/([^/]+)/embed/?$] => index.php?attachment=$matches[1]&embed=true [id_([0-9]+)/embed/?$] => index.php?p=$matches[1]&embed=true [id_([0-9]+)/trackback/?$] => index.php?p=$matches[1]&tb=1 [id_([0-9]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?p=$matches[1]&feed=$matches[2] [id_([0-9]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?p=$matches[1]&feed=$matches[2] [id_([0-9]+)/page/?([0-9]{1,})/?$] => index.php?p=$matches[1]&paged=$matches[2] [id_([0-9]+)/comment-page-([0-9]{1,})/?$] => index.php?p=$matches[1]&cpage=$matches[2] [id_([0-9]+)(?:/([0-9]+))?/?$] => index.php?p=$matches[1]&page=$matches[2] [id_[0-9]+/([^/]+)/?$] => index.php?attachment=$matches[1] [id_[0-9]+/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1 [id_[0-9]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$ matches[2] [id_[0-9]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[ 2] [id_[0-9]+/([^/]+)/comment-page-([0-9]{1,})/?$] => index.php?attachment=$matches[1]&cpage =$matches[2] [id_[0-9]+/([^/]+)/embed/?$] => index.php?attachment=$matches[1]&embed=true [.?.+?/attachment/([^/]+)/?$] => index.php?attachment=$matches[1] [.?.+?/attachment/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1 [.?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$ matches[2] [.?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[ 2] [.?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$] => index.php?attachment=$matches[1]&cpage =$matches[2] [.?.+?/attachment/([^/]+)/embed/?$] => index.php?attachment=$matches[1]&embed=true [(.?.+?)/embed/?$] => index.php?pagename=$matches[1]&embed=true [(.?.+?)/trackback/?$] => index.php?pagename=$matches[1]&tb=1 [(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?pagename=$matches[1]&feed=$matches[2] [(.?.+?)/(feed|rdf|rss|rss2|atom)/?$] => index.php?pagename=$matches[1]&feed=$matches[2] [(.?.+?)/page/?([0-9]{1,})/?$] => index.php?pagename=$matches[1]&paged=$matches[2] [(.?.+?)/comment-page-([0-9]{1,})/?$] => index.php?pagename=$matches[1]&cpage=$matches[2] [(.?.+?)(?:/([0-9]+))?/?$] => index.php?pagename=$matches[1]&page=$matches[2] ) [extra_rules] => Array () [extra_rules_top] => Array ( [(filecode)(/.*)$] => index.php?pagename=$matches[1]&file_path=$matches[2] ) [non_wp_rules] => Array() [extra_permastructs] => Array ( [category] => Array ( [with_front] => [ep_mask] => 512 [paged] => 1 [feed] => 1 [forcomments] => [walk_dirs] => 1 [endpoints] => 1 [struct] => cat/%category% ) [post_tag] => Array ( [with_front] => [ep_mask] => 1024 [paged] => 1 [feed] => 1 [forcomments] => [walk_dirs] => 1 [endpoints] => 1 [struct] => met/%post_tag% ) [article] => Array ( [with_front] => [ep_mask] => 1 [paged] => 1 [feed] => 1 [forcomments] => [walk_dirs] => 1 [endpoints] => 1 [struct] => article/%article% ) ) [endpoints] => Array() [use_verbose_rules] => [use_verbose_page_rules] => [rewritecode] => Array ( [0] => %year% [1] => %monthnum% [2] => %day% [3] => %hour% [4] => %minute% [5] => %second% [6] => %postname% [7] => %post_id% [8] => %author% [9] => %pagename% [10] => %search% [11] => %category% [12] => %post_tag% [13] => %post_format% [14] => %article% ) [rewritereplace] => Array ( [0] => ([0-9] {4}) [1] => ([0-9] {1,2}) [2] => ([0-9] {1,2}) [3] => ([0-9] {1,2}) [4] => ([0-9] {1,2}) [5] => ([0-9] {1,2}) [6] => ([^/]+) [7] => ([0-9]+) [8] => ([^/]+) [9] => ([^/]+?) [10] => (.+) [11] => (.+?) [12] => ([^/]+) [13] => ([^/]+) [14] => ([^/]+) ) [queryreplace] => Array ( [0] => year= [1] => monthnum = [2] => day= [3] => hour= [4] => minute= [5] => second= [6] => name= [7] => p= [8] => author_name= [9] => pagename= [10] => s= [11] => category_name= [12] => tag= [13] => post_format= [14] => article= ) [feeds] => Array ( [0] => feed [1] => rdf [2] => rss [3] => rss2 [4] => atom ) )
#2 ЧПУ для додаткового параметра постійної сторінки
http://mysite/project/1
Приклад перезапису ЧПУ виду http://mysite/index.php?pagename=project&id=1
:
add_filter('rewrite_rules_array', 'my_insert_rewrite_rules');
add_filter('query_vars', 'my_insert_query_vars');
add_action('wp_loaded', 'my_flush_rules');
// flush_rules() якщо нашого правила ще немає у правилах
function my_flush_rules(){
$rules = get_option( 'rewrite_rules');
if ( ! isset( $rules['(project)/(d*)$'] ) ) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
// Додаємо нове правило
function my_insert_rewrite_rules( $rules ){
$newrules = array(
'(project)/(d*)$' => 'index.php?pagename=$matches[1]&id=$matches[2]'
);
return $newrules + $rules;
}
// Додамо змінну запиту id до змінних, щоб WP знав про неї
function my_insert_query_vars( $vars ){
array_push($vars, 'id');
return $vars;
}
Майте на увазі, що flush_rules() дуже вимоглива до ресурсів функція, тому не можна запускати її щоразу при генерації сторінки. Найкраще запускати її один раз при активації плагіна через функцію register_activation_hook() .
Також flush_rules() завжди можна запустити один раз, просто зайшовши до адмін-панелі на сторінку Настройки → Постоянные ссылки
.
#3 Приклад редиректу зі сторінки /feed.xml на /feed/rss2
add_filter( 'generate_rewrite_rules', 'feed_dir_rewrite');
function feed_dir_rewrite( $wp_rewrite ) {
$feed_rules = array(
'index.rdf' => 'index.php?feed=rdf',
'index.xml' => 'index.php?feed=rss2',
'(.+).xml' => 'index.php?feed=' . $wp_rewrite->preg_index(1)
);
$wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
return $wp_rewrite->rules;
}
Зверніть увагу, що змінна передається за посиланням і передає весь клас WP_Rewrite , а не тільки правила перезапису rules.
Підключати такі правила потрібно до того, як WordPress зробить щось із правилами перезапису. А це означає до хука init
. Також майте на увазі, що таке включення правил буде працювати на всьому сайті, якби ви додали їх у файл .htaccess .
#4 Правила перезапису для .htaccess (не для WordPress)
$wp_rewrite->non_wp_rules = array( 'Pattern' => 'Substitution' );
print_r( $wp_rewrite->mod_rewrite_rules() );
/* Виведе:
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteRule ^ Pattern / Substitution [QSA, L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule. /index.php [L]
*/
#5 Додамо .html для постійних сторінок WordPress
add_action( 'init', 'html_page_permalink', -1);
function html_page_permalink(){
global $wp_rewrite; // містить об'єкт WP_Rewrite
// якщо ще немає '.html' у структурі сторінок, додаємо
if( ! strpos( $wp_rewrite->get_page_permastruct(), '.html' ) ){
$wp_rewrite->page_structure = $wp_rewrite->page_structure . '.html';
}
}
// Видалимо слеш на кінці, якщо потрібно.
// Якщо слеш є у структурі ЧПУ, він додаватиметься і до постійним сторінкам.
add_filter( 'user_trailingslashit', 'no_page_slash', 70, 2);
function no_page_slash( $string, $type ){
global $wp_rewrite;
if( $type == 'page' && $wp_rewrite->using_permalinks() && $wp_rewrite->use_trailing_slashes )
$string = untrailingslashit($string);
return $string;
}
Щоб код почав працювати потрібно скинути налаштування ЧПУ – зайдіть на сторінку Настройки → Постоянные ссылки
.
#6 Зміна префікса в URL (ЧПУ) автора (користувача)
Зазвичай URL на сторінку архіву автора виглядає так: http://example.com/author/egorka/
. Допустимо нам потрібно змінити префікс (slug) з author
на creator
:
add_action( 'init', function(){
$GLOBALS['wp_rewrite']->author_base = 'creator';
}, 1);
Тепер ще потрібно скинути налаштування ЧПУ в адмінці, для цього просто зайдіть на сторінку налаштувань «Постійні посилання»!
#7 ЧПУ для типу запису: тип_запису/slug
Припустимо, при реєстрації типу запису за допомогою register_post_type() у параметрі rewrite
ми вказали false, отже тепер правила перезапису для типу запису не створюються взагалі, і їх потрібно створити вручну.
Робиться це так:
add_action( 'init', function(){
global $wp_rewrite;
// додамо тег перезапису, щоб add_permastruct() його зрозуміла
// він потім буде замінений на частину регулювання вказаної у другому параметрі
$wp_rewrite->add_rewrite_tag( '%book%', '([^/]+)', "post_type=book&name=" );
$permastruct = 'book/%book%'; // наша структура ЧПУ
// додаємо структуру ЧПУ
$wp_rewrite->add_permastruct( 'book', $permastruct, array(
'with_front' => true,
'paged' => true,
'feed' => false,
'forcomments' => false,
'walk_dirs' => false,
'endpoints' => false,
)));
}, 1);
// третій параметр add_permastruct() можна не вказувати, тоді аргументи будуть за замовчуванням
І потрібно оновити (скинути) налаштування ЧПУ в адмінці!
Про аргументи $args читайте опис функції add_permastruct() .
#8 ID поста замість імені (ярлика) у ЧПУ для типу запису – “тип_запису/ID”
Припустимо, при реєстрації типу запису orders за допомогою register_post_type() параметр rewrite = false – правила перезапису не створюються, і їх потрібно створити вручну.
URL повинен виглядати як example.com/orders/123
, де 123 – ID запису.
add_action( 'init', function(){
// створимо правила ЧПУ
add_rewrite_tag( '%order_id%', '([0-9]+)', "post_type=orders&p=" );
// або можна так
// створимо правила ЧПУ - тут 'order/([0-9]+)/?$' повністю збігається з тим що
// створило б add_permastruct() і тому замінює...
//add_filter( 'orders'.'_rewrite_rules', function( $rules ){
// return array( 'order/([0-9]+)/?$' => 'index.php?post_type=orders&p=$matches[2]' );
//});
// реєструємо структуру для типу запису
add_permastruct( 'orders', 'order/%order_id%', array(
'with_front' => false,
'paged' => false,
'feed' => false,
'forcomments' => false,
'walk_dirs' => false,
'endpoints' => false,
));
// замінимо тег в URL на ID
add_filter( 'post_type_link', 'orders_permalink', 1, 2);
function orders_permalink( $permalink, $post ){
if( false === strpos($permalink, '%order_id%') ){
return $permalink;
}
return str_replace( '%order_id%', $post->ID, $permalink );
}
} );
#9 Видалення назви типу запису (префіксу) з URL
Варіант 1
Припустимо, у нас є новий тип запису team
, який має ЧПУ виду: example.com/team/nazvanie-zapisi
. Ми хочемо видалити префікс team і зробити посилання на цей тип запису такого виду: example.com/nazvanie-zapisi
.
add_filter( 'post_type_link', 'remove_post_type_slug', 10, 2);
add_action( 'pre_get_posts', 'add_post_type_to_get_posts_request');
// Видаляємо префікс з ім'ям типу запису з URL
function remove_post_type_slug( $post_link, $post ){
if( $post->post_type === 'team' ){
return str_replace( "/$post->post_type/", '/', $post_link );
}
return $post_link;
}
// Додаємо тип запису на запит
function add_post_type_to_get_posts_request( $query ){
if( is_admin() || ! $query->is_main_query() )
return; // не основний запит
// не запит з name параметром (як у постійної сторінки)
if( ! isset($query->query['page']) || empty($query->query['name']) || count($query->query) != 2 )
return;
$query->set('post_type', array('post', 'page', 'team') ); // 'team' added
}
Тут треба мати на увазі, що наш новий URL виду example.com/nazvanie-zapisi
по структурі такий самий як URL постійних сторінок (і можливо як ЧПУ постів). І якщо назва постійної сторінки та записи нового типу збігатимуться, ми отримаємо конфлікт і ймовірно буде показано неправильний запис. Але така ситуація дуже мало ймовірна, ми цей можливий баг просто маємо на увазі і ніяк не обробляємо…
Варіант 2
У цьому варіанті тип запису називається pool_services
і ми не використовуємо хук post_type_link
, а використовуємо метод add_permastruct() – це дозволяє прибрати назву типу запису з URL як на фронті, а й у админке.
В результаті отримаємо URL виду , /postname
а не /pool-services/postname
.
add_action( 'init', 'pw24_post_type_rewrite');
add_action( 'pre_get_posts', 'pw24_add_post_type_to_get_posts_request');
function pw24_post_type_rewrite() {
global $wp_rewrite;
// у разі тип запису - pool_services
$wp_rewrite->add_rewrite_tag( "%pool_services%", '([^/]+)', "pool_services=" );
$wp_rewrite->add_permastruct( 'pool_services', '%pool_services%' );
}
function pw24_add_post_type_to_get_posts_request( $query ){
if( is_admin() || ! $query->is_main_query() )
return; // не основний запит
// не запит з name параметром (як у постійної сторінки)
if( ! isset($query->query['page']) || empty($query->query['name']) || count($query->query) != 2 )
return;
// додаємо 'pool_services'
$query->set( 'post_type', [ 'post', 'page', 'pool_services' ] );
}
Тепер у посиланнях (на сайті та в адмінці) відсутня назва типу запису ‘pool-services’ і всі сторінки працюють як слід.
список змін
З версії 1.5.0 | Введено. |