WP_Rewrite{} WP 1.5.0

Клас ядра, який розбирає запитуваний 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_rulesget_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 .


Приклади

0

#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 ) )
0

#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() завжди можна запустити один раз, просто зайшовши до адмін-панелі на сторінку Настройки → Постоянные ссылки.

0

#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 .

0

#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] */
0

#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; }

Щоб код почав працювати потрібно скинути налаштування ЧПУ – зайдіть на сторінку Настройки → Постоянные ссылки.

0

#6 Зміна префікса в URL (ЧПУ) автора (користувача)

Зазвичай URL на сторінку архіву автора виглядає так: http://example.com/author/egorka/. Допустимо нам потрібно змінити префікс (slug) з authorна creator:

add_action( 'init', function(){ $GLOBALS['wp_rewrite']->author_base = 'creator'; }, 1);

Тепер ще потрібно скинути налаштування ЧПУ в адмінці, для цього просто зайдіть на сторінку налаштувань «Постійні посилання»!

0

#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() .

0

#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 ); } } );

0

#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Введено.

Код WP_Rewrite{} WP 6.0.2

class WP_Rewrite { /** * Permalink structure for posts. * * @ Since 1.5.0 * @var string */ public $permalink_structure; /** * Whether to add trailing slashes. * * @ Since 2.2.0 * @var bool */ public $use_trailing_slashes; /** * Base for the author permalink structure (example.com/$author_base/authorname). * * @ Since 1.5.0 * @var string */ public $author_base = 'author'; /** * Permalink structure для author archives. * * @ Since 1.5.0 * @var string */ public $author_structure; /** * Permalink structure для date archives. * * @ Since 1.5.0 * @var string */ public $date_structure; /** * Permalink structure для pages. * * @ Since 1.5.0 * @var string */ public $page_structure; /** * Основа для пошуку структури структури (example.com/$search_base/query). * * @ Since 1.5.0 * @var string */ public $search_base = 'search'; /** * Permalink structure for searches. * * @ Since 1.5.0 * @var string */ public $search_structure; /** * Comments permalink base. * * @ Since 1.5.0 * @var string */ public $comments_base = 'comments'; /** * Pagination permalink base. * * @ Since 3.1.0 * @var string */ public $pagination_base = 'page'; /** * Comments pagination permalink base. * * @ Since 4.2.0 * @var string */ public $comments_pagination_base = 'comment-page'; /** * Feed permalink base. * * @ Since 1.5.0 * @var string */ public $feed_base = 'feed'; /** * Comments feed permalink structure. * * @ Since 1.5.0 * @var string */ public $comment_feed_structure; /** * Feed request permalink structure. * * @ Since 1.5.0 * @var string */ public $feed_structure; /** * Статична порція post postmalink structure. * * Якщо структура структури орієнтації є "/archive/%post_id%" then the front * is "/archive/". Якщо структура структури є "/%year%/%postname%/" * then the front is "/". * * @ Since 1.5.0 * @var string * * @see WP_Rewrite::init() */ public $front; /** * The prefix for all permalink structures. * * Якщо PATHINFO/index permalinks є в тому, щоб використовувати root is value of * `WP_Rewrite::$index` with trailing slash appended. Іншіwise the root * will be empty. * * @ Since 1.5.0 * @var string * * @see WP_Rewrite::init() * @see WP_Rewrite::using_index_permalinks() */ public $root = ''; /** * Назва index файлу, який є введенням пункту до всіх запитів. * * @ Since 1.5.0 * @var string */ public $index = 'index.php'; /** * Variable name to use for regex matches in the rewritten query. * * @ Since 1.5.0 * @var string */ public $matches = ''; /** * Rewrite rules to match against the request to find the redirect or query. * * @ Since 1.5.0 * @var array */ public $rules; /** * Additional rules added external to the rewrite class. * * Той не generated by the class, see add_rewrite_rule(). * * @ Since 2.1.0 * @var array */ $extra_rules = array(); /** * Additional rules that belong at the beginning to match first. * * Той не generated by the class, see add_rewrite_rule(). * * @ Since 2.3.0 * @var array */ $extra_rules_top = array(); /** * Rules that don't redirect to WordPress' index.php. * * Ці правила є написані до mod_rewrite portion of .htaccess, * and are added by add_external_rule(). * * @ Since 2.1.0 * @var array */ $non_wp_rules = array(); /** * Extra permalink structures, eg categories, added by add_permastruct(). * * @ Since 2.1.0 * @var array */ public $extra_permastructs = array(); /** * Endpoints (like /trackback/) added by add_rewrite_endpoint(). * * @ Since 2.1.0 * @var array */ public $endpoints; /** * Whether to write every mod_rewrite rule для WordPress в .htaccess file. * * Це не off by default, turning it on might print a lot of rewrite rules * до .htaccess file. * * @ Since 2.0.0 * @var bool * * @see WP_Rewrite::mod_rewrite_rules() */ $use_verbose_rules = false; /** * Could post permalinks be confused with those of pages? * * Якщо перша rewrite tag в post permalink structure is one that could * also match a page name (eg %postname% або %author%) then this flag is * Set to true. Prior to WordPress 3.3 this flag indicated that every page * would have set of rules added to the top of rewrite rules array. * Now it tells WP::parse_request() до check if a URL matching the page * permastruct is actually a page before accepting it. * * @ Since 2.5.0 * @var bool * * @see WP_Rewrite::init() */ public $use_verbose_page_rules = true; /** * Rewrite tags, які можуть бути використані в будівельних структурах. * * Вони будуть перенесені в регулярні expressions, що знаходяться в * `WP_Rewrite::$rewritereplace` і є rewritten to the query * Variables listed in WP_Rewrite::$queryreplace. * * Additional tags can be added with add_rewrite_tag(). * * @ Since 1.5.0 * @var string[] */ public $rewritecode = array( '%year%', '%monthnum%', '%day%', '%hour%', '%minute%', '%second%', '%postname%', '%post_id%', '%author%', '%pagename%', '%search%', ); /** * Regular expressions to be substituted in rewrite rules in place * of rewrite tags, pozri WP_Rewrite::$rewritecode. * * @ Since 1.5.0 * @var string[] */ public $rewritereplace = 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]+)', '([^/]+)', '([^/]+?)', '(.+)', ); /** * Query variables that rewrite tags map to, WP_Rewrite::$rewritecode. * * @ Since 1.5.0 * @var string[] */ public $queryreplace = array( 'year=', 'monthnum=', 'day=', 'hour=', 'minute=', 'second=', 'name=', 'p=', 'author_name=', 'pagename=', 's=', ); /** * Supported default feeds. * * @ Since 1.5.0 * @var string[] */ public $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom'); /** * Determines whether permalinks are being used. * * Це може бути будь-яка перевірка module або permalink в HTTP query string. * * @ Since 1.5.0 * * @return bool True, якщо permalinks є enabled. */ public function using_permalinks() { return! empty( $this->permalink_structure ); } /** * Визначення, які реєстратори будуть використовуватися і перевірити модуль не налаштований. * * Means that permalink links enabled and index.php is in the URL. * * @ Since 1.5.0 * * @return bool Whether permalink links є enabled and index.php is in the URL. */ public function using_index_permalinks() { if ( empty( $this->permalink_structure ) ) { return false; } // Якщо index не є в розписці, ми використовуємо mod_rewrite. return preg_match( '#^/*' . $this->index . '#', $this->permalink_structure ); } /** * Визначення яких реєстраційних ресурсів є використовуваним і перевіреним module is enabled. * * За допомогою permalinks and index.php не в URL. * * @ Since 1.5.0 * * @return bool Wether permalink links enabled and index.php is NOT in the URL. */ public function using_mod_rewrite_permalinks() { return $this->using_permalinks() && ! $this->using_index_permalinks(); } /** * Indexes for matches for usage in preg_*() functions. * * У форматі string є, з empty matches property value, '$NUM'. * The 'NUM' will be replaced with the value in the $number parameter. With * the matches property not empty, the value of returned string will * contain that value of the matches property. The format then will be * '$MATCHES[NUM]', з MATCHES як значення в межах, так і NUM the * value of the $number parameter. * * @ Since 1.5.0 * * @param int $number Index number. * @return string */ public function preg_index( $number ) { $match_prefix = '$'; $match_suffix = ''; if ( ! empty( $this->matches ) ) { $match_prefix = '$'. $this->matches . '['; $match_suffix = ']'; } return "$match_prefix$number$match_suffix"; } /** * Retrieves all page and attachments for pages URIs. * * Theattachments are for those that have pages as parents and will be * Retrieved. * * @ Since 2.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return array Список сторінок URIs як перший елемент і адаптація URIs як другий елемент. */ public function page_uri_index() { Global $wpdb; // Get pages in order of hierarchy, тобто children after parents. $pages = $wpdb->get_results( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page' AND post_status != 'auto-draft'" ); $posts = get_page_hierarchy($pages); // If we have no pages get out quick. if ( ! $posts ) { return array (array (), array ()); } // Now reverse it, because we need parents after children for rewrite rules to work properly. $posts = array_reverse($posts, true); $page_uris = array(); $page_attachment_uris = array(); foreach ( $posts as $id => $post ) { // URL => page name. $ uri = get_page_uri ($ id); $attachments = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = %d", $id ) ); if ( ! empty( $attachments ) ) { foreach ( $attachments as $attachment ) { $attach_uri = get_page_uri( $attachment->ID ); $page_attachment_uris[ $attach_uri ] = $attachment->ID; } } $page_uris[ $uri ] = $id; } return array ($ page_uris, $ page_attachment_uris); } /** * Retrieves all of rewrite rules for pages. * * @ Since 1.5.0 * * @return string[] Page rewrite rules. */ public function page_rewrite_rules() { // The extra.? at the beginning prevents clashes with інші регулярні expressions в rules array. $this->add_rewrite_tag( '%pagename%', '(.?.+?)', 'pagename=' ); return $this->generate_rewrite_rules( $this->get_page_permastruct(), EP_PAGES, true, true, false, false ); } /** * Retrieves date permalink structure, with year, month, day. * * Структурна рамка для часу, якщо не налагоджена depends on the * Permalink structure. Це може бути одним з трьох форматів. The first is year, * month, day; the second is day, month, year; and the last format is month, * day, year. Вони є злагоджені після розподільної структури для яких * one is used. If none matches, then the default will be used, which is * Year, month, day. * * Prevents post ID і time permalinks від overlapping. In the case of * post_id, date permalink will be prepended with front permalink with * 'date/' перед дійсним реєстраційним режимом до form the complete date permalink * structure. * * @ Since 1.5.0 * * @return string|false Date permalink structure on success, false on failure. */ public function get_date_permastruct() { if ( isset( $this->date_structure ) ) { return $this->date_structure; } if ( empty( $this->permalink_structure ) ) { $this->date_structure = ''; return false; } // Даний період часу повинен мати рік, місяць, і день separated by slashes. $endians = array( '%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%'); $this->date_structure = ''; $date_endian = ''; foreach ( $endians as $endian ) { if ( false !== strpos( $this->permalink_structure, $endian ) ) { $date_endian = $endian; break; } } if (empty($date_endian)) { $date_endian = '%year%/%monthnum%/%day%'; } /* * Do not allow the date tags and %post_id% to overlap in the permalink * structure. Якщо вони будуть, переміщувати дані tags до $front/date/. */ $front = $this->front; preg_match_all( '/%.+?%/', $this->permalink_structure, $tokens ); $tok_index = 1; foreach ((array) $tokens[0] as $token) { if ( '%post_id%' === $token && ( $tok_index <= 3 ) ) { $front = $front. 'date/'; break; } $tok_index++; } $this->date_structure = $front . $date_endian; return $this->date_structure; } /** * Retrieves year permalink structure без місяця і дня. * * Gets the date permalink structure and strips out the month and day * Permalink structures. * * @ Since 1.5.0 * * @return string|false Year permalink structure on success, false on failure. */ public function get_year_permastruct() { $structure = $this->get_date_permastruct(); if ( empty( $structure ) ) { return false; } $structure = str_replace( '%monthnum%', '', $structure ); $structure = str_replace( '%day%', '', $structure ); $structure = preg_replace( '#/+#', '/', $structure ); return $structure; } /** * Від'єднати місяць продовження структури без дня і року. * * Gets the date permalink structure and strips out the day permalink * structures. Keeps протягом року permalink structure. * * @ Since 1.5.0 * * @return string|false Year/Month permalink structure on success, false on failure. */ public function get_month_permastruct() { $structure = $this->get_date_permastruct(); if ( empty( $structure ) ) { return false; } $structure = str_replace( '%day%', '', $structure ); $structure = preg_replace( '#/+#', '/', $structure ); return $structure; } /** * Retrieves the day permalink structure with month and year. * * Keeps date permalink structure з all year, month, day. * * @ Since 1.5.0 * * @return string|false Year/Month/Day permalink structure on success, false on failure. */ public function get_day_permastruct() { return $this->get_date_permastruct(); } /** * Retrieves the permalink structure для категорії. * * If the category_base property has no value, then the category structure * буде мати front property value, followed by 'category', and finally * '%category%'. If it does, then root property will be used, along with * the category_base property value. * * @ Since 1.5.0 * * @return string|false Category permalink structure on success, false on failure. */ public function get_category_permastruct() { return $this->get_extra_permastruct( 'category' ); } /** * Retrieve the permalink structure for tags. * * Якщо tag_base property не має значення, то tag structure буде * the front property value, що випливає з 'tag', і final '%tag%'. If it * does, then the root property will be used, along with the tag_base * property value. * * @ Since 2.3.0 * * @return string|false Tag permalink structure on success, false on failure. */ public function get_tag_permastruct() { return $this->get_extra_permastruct( 'post_tag' ); } /** * Retrieves an extra permalink structure by name. * * @ Since 2.5.0 * * @param string $name Permalink structure name. * @return string|false Permalink structure string on success, false on failure. */ public function get_extra_permastruct( $name ) { if ( empty( $this->permalink_structure ) ) { return false; } if ( isset( $this->extra_permastructs[ $name ] ) ) { return $this->extra_permastructs[ $name ]['struct']; } return false; } /** * Retrieves the author permalink structure. * * The permalink structure is front property, author base, and finally * '/%author%'. Will set the author_structure property and then return it * безвідповіді до налаштування значення. * * @ Since 1.5.0 * * @return string|false Author permalink structure on success, false on failure. */ public function get_author_permastruct() { if ( isset( $this->author_structure ) ) { return $this->author_structure; } if ( empty( $this->permalink_structure ) ) { $this->author_structure = ''; return false; } $this->author_structure = $this->front . $this->author_base . '/%author%'; return $this->author_structure; } /** * Retrieves the search permalink structure. * * The permalink structure is root property, search base, і finally * '/%search%'. Will set the search_structure property and then return it * безвідповіді до налаштування значення. * * @ Since 1.5.0 * * @return string|false Search permalink structure on success, false on failure. */ public function get_search_permastruct() { if ( isset( $this->search_structure ) ) { return $this->search_structure; } if ( empty( $this->permalink_structure ) ) { $this->search_structure = ''; return false; } $this->search_structure = $this->root . $this->search_base . '/%search%'; return $this->search_structure; } /** * Retrieves the page permalink structure. * * Permalink structure is root property, and '%pagename%'. Will set the * page_structure property and then return it withoutattemping to set the * value again. * * @ Since 1.5.0 * * @return string|false Page permalink structure on success, false on failure. */ public function get_page_permastruct() { if ( isset ( $this->page_structure ) ) { return $this->page_structure; } if ( empty( $this->permalink_structure ) ) { $this->page_structure = ''; return false; } $this->page_structure = $this->root . '%pagename%'; return $this->page_structure; } /** * Retrieves the feed permalink structure. * * The permalink structure is root property, feed base, і finally * '/% feed%'. Will set the feed_structure property and then return it * безвідповіді до налаштування значення. * * @ Since 1.5.0 * * @return string|false Feed permalink structure on success, false on failure. */ public function get_feed_permastruct() { if ( isset( $this->feed_structure ) ) { return $this->feed_structure; } if ( empty( $this->permalink_structure ) ) { $this->feed_structure = ''; return false; } $this->feed_structure = $this->root . $this->feed_base . '/% feed%'; return $this->feed_structure; } /** * Retrieves the comment feed permalink structure. * * The permalink structure is root property, comment base property, feed * base and finally '/%feed%'. Will set the comment_feed_structure property * and then return it without attempting to set the value again. * * @ Since 1.5.0 * * @return string|false Comment feed permalink structure on success, false on failure. */ public function get_comment_feed_permastruct() { if ( isset( $this->comment_feed_structure ) ) { return $this->comment_feed_structure; } if ( empty( $this->permalink_structure ) ) { $this->comment_feed_structure = ''; return false; } $this->comment_feed_structure = $this->root . $this->comments_base . '/'. $this->feed_base . '/% feed%'; return $this->comment_feed_structure; } /** * Adds або updates existing rewrite tags (eg %postname%). * * Якщо tag already exists, replace the existing pattern and query for * that tag, іншіwise add the new tag. * * @ Since 1.5.0 * * @see WP_Rewrite::$rewritecode * @see WP_Rewrite::$rewritereplace * @see WP_Rewrite::$queryreplace * * @param string $tag Name of the rewrite tag to add or update. * @param string $regex Regular expression до substitute tag for in rewrite rules. * @param string $query String append to the rewritten query. Must end in '='. */ public function add_rewrite_tag( $tag, $regex, $query ) { $position = array_search( $tag, $this->rewritecode, true ); if ( false !== $position && null !== $position ) { $this->rewritereplace[ $position ] = $regex; $this->queryreplace[ $position ] = $query; } else { $this->rewritecode[] = $tag; $this->rewritereplace[] = $regex; $this->queryreplace[] = $query; } } /** * Removes an existing rewrite tag. * * @ Since 4.5.0 * * @see WP_Rewrite::$rewritecode * @see WP_Rewrite::$rewritereplace * @see WP_Rewrite::$queryreplace * * @param string $tag Name of the rewrite tag to remove. */ public function remove_rewrite_tag( $tag ) { $position = array_search( $tag, $this->rewritecode, true ); if ( false !== $position && null !== $position ) { unset( $this->rewritecode[ $position ] ); unset( $this->rewritereplace[ $position ] ); unset( $this->queryreplace[ $position ] ); } } /** * Generates rewrite rules from a permalink structure. * * Головне WP_Rewrite функція для побудови rewrite rule list. The * contents of the function is a mix of black magic and regular expressions, * So best just ignore the contents and move to the parameters. * * @ Since 1.5.0 * * @param string $permalink_structure Permalink structure. * @param int $ep_mask Optional. Консультанти маски визначають, які кінцівки є прикріплені до структури. * Accepts a mask of: * - `EP_ALL` * - `EP_NONE` * - `EP_ALL_ARCHIVES` * - `EP_ATTACHMENT` * - `EP_AUTHORS` * - `EP_CATEGORIES` * - `EP_COMMENTS` * - `EP_DATE` * - `EP_DAY` * - `EP_MONTH` * - `EP_PAGES` * - `EP_PERMALINK` * - `EP_ROOT` * - `EP_SEARCH` * - `EP_TAGS` * - `EP_YEAR` * Default `EP_NONE`. * @param bool $paged Optional. Всіархієві pagination rules повинні бути added for structure. * Default true. * @param bool $feed Optional Whether feed rewrite rules should be added for the structure. * Default true. * @param bool $forcomments Optional. Всі, що реєструються правила повинні бути потрібні для коментарів повідомлення. * Default false. * @param bool $walk_dirs Optional. Whether the 'directories' making up the structure should be walked * over and rewrite rules built for each in-turn. Default true. * @param bool $endpoints Optional. Всі інші пункти повинні бути використані для генерованих реверсних правил. * Default true. * @return string[] Array of rewrite rules keyed by their regex pattern. */ public function generate_rewrite_rules( $permalink_structure, $ep_mask = EP_NONE, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true ) { // Build a regex to match the feed section of URLs, something like (feed|atom|rss|rss2)/? $feedregex2 = ''; foreach ((array) $this->feeds as $feed_name ) { $feedregex2.=$feed_name. '|'; } $feedregex2 = '(' . trim( $feedregex2, '|' ) . ')/?$'; /* * $feedregex is identical but with /feed/ added on as well, so URLs like <permalink>/feed/atom * and <permalink>/atom are both possible */ $feedregex = $this->feed_base . '/'. $feedregex2; // Build a regex to match the trackback and page/xx parts of URLs. $trackbackregex = 'trackback/?$'; $pageregex = $this->pagination_base . '/?([0-9]{1,})/?$'; $commentregex = $this->comments_pagination_base . '-([0-9]{1,})/?$'; $embedregex = 'embed/?$'; // Build up array of endpoint regexes to append => queries to append. if ($endpoints) { $ep_query_append = array(); foreach ((array) $this->endpoints as $endpoint ) { // Match everything after the endpoint name, але allow for nothing to appear there. $epmatch = $endpoint[1] . '(/(.*))?/?$'; // Це буде appended on to rest of the query for each dir. $epquery = '&' . $endpoint[2] . '='; $ep_query_append[ $epmatch ] = array( $endpoint[0], $epquery ); } } // Get everything up to the first rewrite tag. $front = substr($permalink_structure, 0, strpos($permalink_structure, '%')); // Build an array of the tags (відомо, що said array ends up being в $tokens[0]). preg_match_all( '/%.+?%/', $permalink_structure, $tokens ); $num_tokens = count($tokens[0]); $index = $this->index; // Probably 'index.php'. $feedindex = $index; $trackbackindex = $index; $embedindex = $index; /* * Build a list from the rewritecode and queryreplace arrays, що буде здатися деяким * like tagname=$matches[i] where i is the current $i. */ $queries = array(); for ( $i = 0; $i < $num_tokens; ++$i ) { if ( 0 < $i ) { $queries[$i] = $queries[$i-1]. '&'; } else { $queries[$i] = ''; } $query_token = str_replace( $this->rewritecode, $this->queryreplace, $tokens[0][ $i ] ) . $this->preg_index( $i + 1 ); $queries[$i]. = $query_token; } // Get the structure, minus any cruft (stuff that isn't tags) at the front. $structure = $permalink_structure; if ( '/' !== $front ) { $structure = str_replace( $front, '', $structure ); } /* * Create a list of dirs to walk over, making rewrite rules for all level * so for example, a $structure of /%year%/%monthnum%/%postname% would create * rewrite rules for /%year%/, /%year%/%monthnum%/ and /%year%/%monthnum%/%postname% */ $ structure = trim ($ structure, '/'); $dirs = $walk_dirs? explode('/', $structure): array($structure); $num_dirs = count($dirs); // Strip slashes from the front of $front. $front = preg_replace( '|^/+|', '', $front ); // The main workhorse loop. $post_rewrite = array(); $struct = $front; for ( $j = 0; $j < $num_dirs; ++$j ) { // Get the struct for this dir, and trim slashes off the front. $struct.=$dirs[$j]. '/'; // Accumulate. see comment near explode('/', $structure) above. $ struct = ltrim ($ struct, '/'); // Replace tags with regexes. $match = str_replace( $this->rewritecode, $this->rewritereplace, $struct ); // Make a list of tags, and store how багато хто є в $num_toks. $num_toks = preg_match_all( '/%.+?%/', $struct, $toks ); // Get the 'tagname=$matches[i]'. $query = ( !empty( $num_toks ) && isset( $queries[ $num_toks - 1 ] ) ) ? $queries[ $num_toks - 1 ] : ''; // Set up $ep_mask_specific which is used to match more specific URL типів. switch ($dirs[$j]) { case '%year%': $ep_mask_specific = EP_YEAR; break; case '%monthnum%': $ep_mask_specific = EP_MONTH; break; case '%day%': $ep_mask_specific = EP_DAY; break; default: $ep_mask_specific = EP_NONE; } // Create query for /page/xx. $pagematch = $match . $pageregex; $pagequery = $index. '?' . $query . '&paged=' . $this->preg_index( $num_toks + 1 ); // Create query for /comment-page-xx. $ commentmatch = $ match . $commentregex; $commentquery = $index. '?' . $query . '&cpage=' . $this->preg_index( $num_toks + 1 ); if ( get_option( 'page_on_front' ) ) { // Create query for Root /comment-page-xx. $rootcommentmatch = $match . $commentregex; $rootcommentquery = $index. '?' . $query . '&page_id=' . get_option('page_on_front'). '&cpage=' . $this->preg_index( $num_toks + 1 ); } // Create query for /feed/(feed|atom|rss|rss2|rdf). $feedmatch = $match. $feedregex; $feedquery = $feedindex . '?' . $query . '&feed=' . $this->preg_index( $num_toks + 1 ); // Create query for /(feed|atom|rss|rss2|rdf) (see comment near creation of $feedregex). $feedmatch2 = $match. $feedregex2; $feedquery2 = $feedindex. '?' . $query . '&feed=' . $this->preg_index( $num_toks + 1 ); // Create query and regex for embeds. $embedmatch = $match . $embedregex; $embedquery = $embedindex . '?' . $query . '&embed=true'; // If asked to, turn the feed queries in comment feed ones. if ( $forcomments ) { $feedquery .= '&withcomments=1'; $feedquery2 .= '&withcomments=1'; } // Start creating the array of rewrites for this dir. $ rewrite = array(); // ... adding on /feed/ regexes => queries. if ($ feed) { $ rewrite = array( $feedmatch => $feedquery, $feedmatch2 => $feedquery2, $embedmatch => $embedquery, ); } // ...і /page/xx ones. if ( $paged ) { $rewrite = array_merge( $rewrite, array( $pagematch => $pagequery ) ); } // Only on pages with comments add ../comment-page-xx/. if ( EP_PAGES & $ep_mask | | EP_PERMALINK & $ep_mask ) { $rewrite = array_merge( $rewrite, array( $commentmatch => $commentquery ) ); } elseif ( EP_ROOT & $ep_mask && get_option( 'page_on_front' ) ) { $rewrite = array_merge( $rewrite, array( $rootcommentmatch => $rootcommentquery ) ); } // Do endpoints. if ($endpoints) { foreach ((array) $ep_query_append as $regex => $ep) { // Add the endpoints on if the mask fits. if ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific ) { $rewrite[ $match . $regex] = $index. '?' . $query . $ep[1]. $this->preg_index( $num_toks + 2 ); } } } // If we've got some tags в this dir. if ( $num_toks ) { $post = false; $page = false; /* * Check to see if this dir is permalink-level: ie structure specifies an * Individual post. Do this by checking it contains at least one of 1) post name, * 2) Post ID, 3) page name, 4) timestamp (рок, місяць, day, hour, second and * Minute all present). Set these flags now as we need them for the endpoints. */ if ( strpos( $struct, '%postname%' ) !== false || strpos( $struct, '%post_id%' ) !== false || strpos( $struct, '%pagename%' ) !== false || ( strpos( $struct, '%year%' ) !== false && strpos( $struct, '%monthnum%' ) !== false && strpos( $struct, '%day%' ) !== false && strpos ( $struct, '%hour%' ) !== false && strpos( $struct, '%minute%' ) !== false && strpos( $struct, '%second%' ) !== false ) ) { $post = true; if ( strpos( $struct, '%pagename%' ) !== false ) { $page = true; } } if (! $post) { // Для custom post types, ми потрібні для того, щоб прийти до кінця як добре. foreach ( get_post_types( array( '_builtin' => false ) ) as $ptype ) { if ( strpos( $struct, "%$ptype%" ) !== false ) { $post = true; // Це для page style attachment URLs. $page = is_post_type_hierarchical( $ptype ); break; } } } // Якщо створюють правила для покупки, до всіх кінців як додатків, etc. if ($post) { // Create query and regex for trackback. $trackbackmatch = $match. $trackbackregex; $trackbackquery = $trackbackindex. '?' . $query . '&tb=1'; // Create query and regex for embeds. $embedmatch = $match . $embedregex; $embedquery = $embedindex . '?' . $query . '&embed=true'; // Trim slashes from the end of the regex for this dir. $ match = rtrim ($ match, '/'); // Get rid of brackets. $submatchbase = str_replace( array( '(', ')' ), '', $match ); // Add a rule for attachments, which use the form of <permalink>/some-text. $sub1 = $submatchbase . '/([^/]+)/'; // Add trackback regex <permalink>/trackback/... $sub1tb = $sub1. $trackbackregex; // And <permalink>/feed/(atom|...) $sub1feed = $sub1 . $feedregex; // And <permalink>/(feed|atom...) $sub1feed2 = $sub1 . $feedregex2; // And <permalink>/comment-page-xx $sub1comment = $sub1 . $commentregex; // And <permalink>/embed/... $sub1embed = $sub1 . $embedregex; /* * Add another rule to match attachments in the explicit form: * <permalink>/attachment/some-text */ $sub2 = $submatchbase . '/attachment/([^/]+)/'; // And add trackbacks <permalink>/attachment/trackback. $sub2tb = $sub2. $trackbackregex; // Feeds, <permalink>/attachment/feed/(atom|...) $sub2feed = $sub2. $feedregex; // And feeds again on to this <permalink>/attachment/(feed|atom...) $sub2feed2 = $sub2. $feedregex2; // And <permalink>/comment-page-xx $sub2comment = $sub2 . $commentregex; // And <permalink>/embed/... $sub2embed = $sub2 . $embedregex; // Create queries for these extra tag-ons we've just dealt with. $subquery = $index. '?attachment=' . $this->preg_index( 1 ); $subtbquery = $subquery . '&tb=1'; $subfeedquery = $subquery . '&feed=' . $this->preg_index( 2 ); $subcommentquery = $subquery . '&cpage=' . $this->preg_index( 2 ); $subembedquery = $subquery . '&embed=true'; // Do endpoints for attachments. if ( ! empty( $endpoints ) ) { foreach ((array) $ep_query_append as $regex => $ep) { if ( $ep[0] & EP_ATTACHMENT ) { $rewrite[ $sub1 . $regex] = $subquery. $ep[1]. $this->preg_index( 3 ); $rewrite[ $sub2 . $regex] = $subquery. $ep[1]. $this->preg_index( 3 ); } } } /* * Now we've finished with endpoints, finish off the $sub1 and $sub2 matches * add a? as we don't have to match that last slash, і finally a $ so we * match to the end of the URL */ $sub1 .= '?$'; $sub2 .= '?$'; /* * Post pagination, eg <permalink>/2/ * Попередньо: '(/[0-9]+)?/?$', які виробляються '/2' для сторінки. * When cast to int, returned 0. */ $match = $match. '(?:/([0-9]+))?/?$'; $query = $index. '?' . $query . '&page=' . $this->preg_index( $num_toks + 1 ); // Не рахуючи permalink so this is a lot simpler. } else { // Close the match and finalize the query. $match .= '?$'; $query = $index. '?' . $query; } /* * Create final array for this dir by joining the $rewrite array (which currently * лише contains rules/queries for trackback, pages etc) до мого regex/query for * this dir */ $ rewrite = array_merge ($ rewrite, array ($ match => $ query)); // If we're matching a permalink, add those extras (attachments etc) on. if ($post) { / / Add trackback. $ rewrite = array_merge (array ($ trackbackmatch => $ trackbackquery), $ rewrite); //Add embed. $ rewrite = array_merge (array ($ embedmatch => $ embedquery), $ rewrite); // Add regexes/queries for attachments, attachment trackbacks and so on. if ( ! $page ) { // Require <permalink>/attachment/stuff form для pages because of confusion with subpages. $rewrite = array_merge( $rewrite, array( $sub1 => $subquery, $sub1tb => $subtbquery, $sub1feed => $subfeedquery, $sub1feed2 => $subfeedquery, $sub1comment => $subcommentquery, $sub1embed => $subembedquery, ) ); } $rewrite = array_merge( array( $sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery, $sub2comment => $subcommentquery, $sub2embed => $subembedquery, ), $rewrite ); } } // Add the rules for this dir to the accumulating $post_rewrite. $post_rewrite = array_merge( $rewrite, $post_rewrite ); } // The finished rules. phew! return $post_rewrite; } /** * Generates rewrite rules with permalink structure і walking directory тільки. * * Shorten version of WP_Rewrite::generate_rewrite_rules() that allows for shorter * list of parameters. See the method for longer description of what generating * rewrite rules does. * * @ Since 1.5.0 * * @see WP_Rewrite::generate_rewrite_rules() Натисніть на тривалий опис і остання параметри. * * @param string $permalink_structure Permalink structure для генерації правил. * @param bool $walk_dirs Optional. Всі, щоб створити список повідомлень до переговорів. * Default false. * @return array */ public function generate_rewrite_rule( $permalink_structure, $walk_dirs = false ) { return $this->generate_rewrite_rules( $permalink_structure, EP_NONE, false, false, false, $walk_dirs ); } /** * Constructs rewrite matches and queries з permalink structure. * * Runs the action {@see 'generate_rewrite_rules'} with the parametr that is an * reference to the current WP_Rewrite instance to further manipulate the * Permalink structures and rewrite rules. Runs the {@see 'rewrite_rules_array'} * Filter on the full rewrite rule array. * * Там є два способи, щоб поводитися повторювані правила, один з ходу в * the {@see 'generate_rewrite_rules'} action and gaining full control of the * object or just manipulating the rewrite rule array before it is passed * від функції. * * @ Since 1.5.0 * * @return string[] An associative array of matches and queries. */ public function rewrite_rules() { $ rewrite = array(); if ( empty( $this->permalink_structure ) ) { return $rewrite; } // robots.txt - тільки якщо installed at the root. $ home_path = parse_url (home_url ()); $robots_rewrite = (empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'robots.txt$' => $this->index . '?robots=1' ) : array(); / / favicon.ico - тільки якщо installed at the root. $favicon_rewrite = ( empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'favicon.ico$' => $this->index . '?favicon=1' ) : array(); / / Old feed and service files. $deprecated_files = array( '.*wp-(atom|rdf|rss|rss2|feed|commentsrss2).php$' => $this->index . '?feed=old', '.*wp-app.php(/.*)?$' => $this->index . '?error=403', ); // Registration rules. $registration_pages = array(); if ( is_multisite() && is_main_site() ) { $registration_pages['.*wp-signup.php$'] = $this->index . '?signup=true'; $registration_pages['.*wp-activate.php$'] = $this->index . '?activate=true'; } // Deprecated. $registration_pages['.*wp-register.php$'] = $this->index . '?register=true'; // Post rewrite rules. $post_rewrite = $this->generate_rewrite_rules( $this->permalink_structure, EP_PERMALINK ); /** * Filters rewrite rules використані для "post" архівів. * * @ Since 1.5.0 * * @param string[] $post_rewrite Array of rewrite rules for posts, keyed by their regex pattern. */ $post_rewrite = apply_filters( 'post_rewrite_rules', $post_rewrite); // Date rewrite rules. $date_rewrite = $this->generate_rewrite_rules( $this->get_date_permastruct(), EP_DATE ); /** * Filters rewrite rules used для date archives. * * Likely date archives would include `/yyyy/`, `/yyyy/mm/`, and `/yyyy/mm/dd/`. * * @ Since 1.5.0 * * @param string[] $date_rewrite Array of rewrite rules for date archives, keyed by their regex pattern. */ $date_rewrite = apply_filters( 'date_rewrite_rules', $date_rewrite ); // Root-level rewrite rules. $root_rewrite = $this->generate_rewrite_rules( $this->root . '/', EP_ROOT ); /** * Filters rewrite rules used for root-level archives. * * Likely root-level archives would include pagination rules for the homepage * as well as site-wide post feeds (eg `/feed/`, and `/feed/atom/`). * * @ Since 1.5.0 * * @param string[] $root_rewrite Array of root-level rewrite rules, keyed by їх regex pattern. */ $root_rewrite = apply_filters( 'root_rewrite_rules', $root_rewrite ); // Comments rewrite rules. $comments_rewrite = $this->generate_rewrite_rules( $this->root . $this->comments_base, EP_COMMENTS, false, true, true, false ); /** * Filters rewrite rules used for comment feed archives. * * Likely comments feed archives include `/comments/feed/` and `/comments/feed/atom/`. * * @ Since 1.5.0 * * @param string[] $comments_rewrite Array of rewrite rules for site-wide comments feeds, keyed by their regex pattern. */ $comments_rewrite = apply_filters( 'comments_rewrite_rules', $comments_rewrite ); // Search rewrite rules. $search_structure = $this->get_search_permastruct(); $search_rewrite = $this->generate_rewrite_rules( $search_structure, EP_SEARCH ); /** * Filters rewrite rules використовуються для пошуку архівів. * * Likely search-related archives include `/search/search+query/` as well as * pagination and feed paths for a search. * * @ Since 1.5.0 * * @param string[] $search_rewrite Array of rewrite rules for search queries, keyed by their regex pattern. */ $search_rewrite = apply_filters( 'search_rewrite_rules', $search_rewrite ); // Author rewrite rules. $author_rewrite = $this->generate_rewrite_rules( $this->get_author_permastruct(), EP_AUTHORS ); /** * Filters rewrite rules used для author archives. * * Likely author archives would include `/author/author-name/`, as well as * pagination and feed paths for author archives. * * @ Since 1.5.0 * * @param string[] $author_rewrite Array of rewrite rules for author archives, keyed by their regex pattern. */ $author_rewrite = apply_filters( 'author_rewrite_rules', $author_rewrite ); // Pages rewrite rules. $page_rewrite = $this->page_rewrite_rules(); /** * Filters rewrite rules використовуються для "page" post type archives. * * @ Since 1.5.0 * * @param string[] $page_rewrite Натисніть на список повідомлень правил для "page" post type, keyed by their regex pattern. */ $page_rewrite = apply_filters( 'page_rewrite_rules', $page_rewrite ); // Extra permastructs. foreach ( $this->extra_permastructs as $permastructname => $struct ) { if ( is_array( $struct ) ) { if ( count( $struct ) == 2 ) { $rules = $this->generate_rewrite_rules( $struct[0], $struct[1] ); } else { $rules = $this->generate_rewrite_rules( $struct['struct'], $struct['ep_mask'], $struct['paged'], $struct['feed'], $struct['forcomments'], $ struct['walk_dirs'], $struct['endpoints'] ); } } else { $rules = $this->generate_rewrite_rules( $struct ); } /** * Filters rewrite rules використовуються для окремих розподільнихструктур. * * The dynamic portion of hook name, `$permastructname`, refers * до name of the registered permastruct. * * Possible hook names include: * * - `category_rewrite_rules` * - `post_format_rewrite_rules` * - `post_tag_rewrite_rules` * * @ Since 3.1.0 * * @param string[] $rules Array of rewrite rules generated for the current permastruct, keyed by their regex pattern. */ $rules = apply_filters( "{$permastructname}_rewrite_rules", $rules ); if ( 'post_tag' === $permastructname ) { /** * Filters rewrite rules використовуються спеціально для Tags. * * @ Since 2.3.0 * @deprecated 3.1.0 Use {@see 'post_tag_rewrite_rules'} instead. * * @param string[] $rules Array of rewrite rules generated for tags, keyed by their regex pattern. */ $rules = apply_filters_deprecated( 'tag_rewrite_rules', array( $rules ), '3.1.0', 'post_tag_rewrite_rules' ); } $this->extra_rules_top = array_merge( $this->extra_rules_top, $rules ); } // Put them together. if ( $this->use_verbose_page_rules ) { $this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $author_rewrite, $author_rewrite, >extra_rules); } else { $this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $author_rewrite, $author_rewrite, >extra_rules); } /** * Fires after the rewrite rules are generated. * * @ Since 1.5.0 * * @param WP_Rewrite $wp_rewrite Current WP_Rewrite instance (passed by reference). */ do_action_ref_array( 'generate_rewrite_rules', array( &$this ) ); /** * Filters full set of generated rewrite rules. * * @ Since 1.5.0 * * @param string[] $rules Compiled array of rewrite rules, keyed by їх regex pattern. */ $this->rules = apply_filters( 'rewrite_rules_array', $this->rules ); return $this->rules; } /** * Retrieves the rewrite rules. * * The difference між цим методом і WP_Rewrite::rewrite_rules() is that * this method stores the rewrite rules в the 'rewrite_rules' option and retrieves * it. Ці помилки мають процеси всіх повідомлень, щоб отримати rewrite rules * in the form of caching. * * @ Since 1.5.0 * * @return string[] Array of rewrite rules keyed by their regex pattern. */ public function wp_rewrite_rules() { $this->rules = get_option( 'rewrite_rules' ); if ( empty( $this->rules ) ) { $this->matches = 'matches'; $this->rewrite_rules(); if ( ! did_action( 'wp_loaded' ) ) { add_action( 'wp_loaded', array( $this, 'flush_rules' ) ); return $this->rules; } update_option( 'rewrite_rules', $this->rules ); } return $this->rules; } /** * Retrieves mod_rewrite-formatted rewrite rules to write to .htaccess. * * Does not actually write to the .htaccess file, але creates the rules for * the process that will. * * Will add the non_wp_rules property rules to the .htaccess file before * the WordPress rewrite rules one. * * @ Since 1.5.0 * * @return string */ public function mod_rewrite_rules() { if ( ! $this->using_permalinks() ) { return ''; } $ site_root = parse_url (site_url ()); if ( isset( $site_root['path'] ) ) { $site_root = trailingslashit( $site_root['path'] ); } $ home_root = parse_url (home_url ()); if ( isset( $home_root['path'] ) ) { $home_root = trailingslashit( $home_root['path'] ); } else { $home_root = '/'; } $rules = "<IfModule mod_rewrite.c>n"; $rules .= "RewriteEngine Onn"; $rules .= "RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]n"; $rules .= "RewriteBase $home_rootn"; // Prevent -f checks on index.php. $rules .= "RewriteRule ^index.php$ - [L]n"; // Добавити в правила, що не обмежується WP's index.php (і це повинно бути схильне до WP at all). foreach ((array) $this->non_wp_rules as $match => $query ) { // Apache 1.3 не підтримує відповідного (неgreedy) modifier. $match = str_replace('.+?', '.+', $match); $rules .= 'RewriteRule^' . $match . ''. $home_root. $query . "[QSA, L]n"; } if ( $this->use_verbose_rules ) { $this->matches = ''; $rewrite = $this->rewrite_rules(); $num_rules = count ($ rewrite); $rules .= "RewriteCond %{REQUEST_FILENAME} -f [OR]n" . "RewriteCond %{REQUEST_FILENAME} -dn" . "RewriteRule ^.*$ - [S=$num_rules]n"; foreach ((array) $rewrite as $match => $query) { // Apache 1.3 не підтримує відповідного (неgreedy) modifier. $match = str_replace('.+?', '.+', $match); if ( strpos( $query, $this->index ) !== false ) { $rules .= 'RewriteRule^' . $match . ''. $home_root. $query . "[QSA, L]n"; } else { $rules .= 'RewriteRule^' . $match . ''. $ site_root . $query . "[QSA, L]n"; } } } else { $rules .= "RewriteCond %{REQUEST_FILENAME} !-fn" ​​. "RewriteCond %{REQUEST_FILENAME} !-dn" . "RewriteRule . {$home_root}{$this->index} [L]n"; } $rules .= "</IfModule>n"; /** * Filters List of rewrite rules formatted for output to .htaccess file. * * @ Since 1.5.0 * * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess. */ $rules = apply_filters( 'mod_rewrite_rules', $rules ); /** * Filters List of rewrite rules formatted for output to .htaccess file. * * @ Since 1.5.0 * @deprecated 1.5.0 Use the {@see 'mod_rewrite_rules'} filter instead. * * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess. */ return apply_filters_deprecated( 'rewrite_rules', array( $rules ), '1.5.0', 'mod_rewrite_rules' ); } /** * Retrieves IIS7 URL Rewrite formatted rewrite rules to write to web.config file. * * Does not actually write to the web.config file, але creates the rules for * the process that will. * * @ Since 2.8.0 * * @param bool $add_parent_tags Optional. Будь-яка до add parent tags до rewrite rule sets. * Default false. * @return string IIS7 URL rewrite rule sets. */ public function iis7_url_rewrite_rules( $add_parent_tags = false ) { if ( ! $this->using_permalinks() ) { return ''; } $rules = ''; if ( $add_parent_tags ) { $rules .= '<configuration> <system.webServer> <rewrite> <rules>'; } $rules .= ' <rule name="WordPress: ' . esc_attr( home_url() ) . '" patternSyntax="Wildcard"> <match url="*" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php" /> </rule>'; if ( $add_parent_tags ) { $rules .= ' </rules> </rewrite> </system.webServer> </configuration>'; } /** * Filters List of rewrite rules formatted for output to a web.config. * * @ Since 2.8.0 * * @param string $rules Rewrite rules formatted for IIS web.config. */ return apply_filters( 'iis7_url_rewrite_rules', $rules ); } /** * Adds a rewrite rule that transforms a URL structure to set of query vars. * * Any value in the $after parameter that isn't 'bottom' will result in the rule * being placed at the top of the rewrite rules. * * @ Since 2.1.0 * @since 4.4.0 Array support був added to the `$query` parameter. * * @param string $regex Regular expression to match request against. * @param string|array $query Відповідні потрібні Vars for this rewrite rule. * @param string $after Optional. Priority of the new rule. Accepts 'top' * or 'bottom'. Default 'bottom'. */ public function add_rule( $regex, $query, $after = 'bottom' ) { if ( is_array ( $ query ) ) { $external = false; $query = add_query_arg( $query, 'index.php' ); } else { $index = false === strpos( $query, '?' ) ? strlen($query): strpos($query, '?'); $ front = substr ($ query, 0, $ index); $external = $front! = $this->index; } // "external" = це не відповідає index.php. if ($external) { $this->add_external_rule( $regex, $query ); } else { if ( 'bottom' === $after ) { $this->extra_rules = array_merge( $this->extra_rules, array( $regex => $query ) ); } else { $this->extra_rules_top = array_merge( $this->extra_rules_top, array( $regex => $query ) ); } } } /** * Adds a rewrite rule, що не відповідає index.php. * * @ Since 2.1.0 * * @param string $regex Regular expression to match request against. * @param string $query Відповідні потрібні Vars for this rewrite rule. */ public function add_external_rule( $regex, $query ) { $this->non_wp_rules[ $regex ] = $query; } /** * Adds an endpoint, як /trackback/. * * @ Since 2.1.0 * @since 3.9.0 $query_var parameter added. * @since 4.3.0 Added support for skipping query var registration passing `false` to `$query_var`. * * @see add_rewrite_endpoint() for full documentation. * @global WP $wp Current WordPress environment instance. * * @param string $name Name of the endpoint. * @param int $places Endpoint mask, де беруть участь місця, щоб endpoint повинні бути приєднані. * Accepts a mask of: * - `EP_ALL` * - `EP_NONE` * - `EP_ALL_ARCHIVES` * - `EP_ATTACHMENT` * - `EP_AUTHORS` * - `EP_CATEGORIES` * - `EP_COMMENTS` * - `EP_DATE` * - `EP_DAY` * - `EP_MONTH` * - `EP_PAGES` * - `EP_PERMALINK` * - `EP_ROOT` * - `EP_SEARCH` * - `EP_TAGS` * - `EP_YEAR` * @param string|bool $query_var Optional. Name of the corresponding query variable. Pass `false` to * skip registering a query_var для цього кінця. Defaults to the * value of `$name`. */ public function add_endpoint( $name, $places, $query_var = true ) { global $wp; // Для backward compatibility, якщо null не explicitly been passed як $query_var, assume true. if ( true === $query_var || null === $query_var ) { $query_var = $name; } $this->endpoints[] = array( $places, $name, $query_var ); if ( $query_var ) { $wp->add_query_var( $query_var ); } } /** * Adds a new permalink structure. * * A permalink structure (permastruct) є abstract definition of set of rewrite rules; * it is easy way of expressing set of regular expressions that rewrite to a set of * Query strings. New permastruct is added to the WP_Rewrite::$extra_permastructs array. * * When the rewrite rules are built by WP_Rewrite::rewrite_rules(), all of these extra * Permastructs are passed to WP_Rewrite::generate_rewrite_rules() which transforms them * Врегульовані вирази, що багато love to hate. * * The `$args` parameter дає вам control over how WP_Rewrite::generate_rewrite_rules() * works on the new permastruct. * * @ Since 2.5.0 * * @param string $name Name for permalink structure. * @param string $struct Permalink structure (eg category/%category%) * @param array $args { * Optional. Arguments for building rewrite rules базується на структурі структури. * Default empty array. * * @type bool $with_front Whether structure should be prepended with `WP_Rewrite::$front`. * Default true. * @type int $ep_mask endpoint mask визначати, які endpoints є added to structure. * Accepts a mask of: * - `EP_ALL` * - `EP_NONE` * - `EP_ALL_ARCHIVES` * - `EP_ATTACHMENT` * - `EP_AUTHORS` * - `EP_CATEGORIES` * - `EP_COMMENTS` * - `EP_DATE` * - `EP_DAY` * - `EP_MONTH` * - `EP_PAGES` * - `EP_PERMALINK` * - `EP_ROOT` * - `EP_SEARCH` * - `EP_TAGS` * - `EP_YEAR` * Default `EP_NONE`. * @type bool $paged Whether archive pagination rules should be added for the structure. * Default true. * @type bool $feed Whether feed rewrite rules should be added for the structure. Default true. * @type bool $forcomments Whether feed rules повинні бути для пошуку для коментарів повідомлення. Default false. * @type bool $walk_dirs Whether the 'directories' making up the structure should be walked over * and rewrite rules built for each in-turn. Default true. * @type bool $endpoints Whether endpoints повинні бути використані для генерованих правил. Default true. * } */ public function add_permastruct( $name, $struct, $args = array() ) { // Back-compat for the old parameters: $with_front and $ep_mask. if (! is_array($args)) { $args = array( 'with_front' => $args ); } if ( func_num_args() == 4 ) { $args['ep_mask'] = func_get_arg(3); } $defaults = array( 'with_front' => true, 'ep_mask' => EP_NONE, 'paged' => true, 'feed' => true, 'forcomments' => false, 'walk_dirs' => true, 'endpoints' => true, ); $args = array_intersect_key( $args, $defaults ); $ args = wp_parse_args ($ args, $ defaults); if ( $args['with_front'] ) { $struct = $this->front . $struct; } else { $struct = $this->root . $struct; } $args['struct'] = $struct; $this->extra_permastructs[ $name ] = $args; } /** * Removes a permalink structure. * * @ Since 4.5.0 * * @param string $name Name for permalink structure. */ public function remove_permastruct( $name ) { unset( $this->extra_permastructs[ $name ] ); } /** * Removes rewrite rules and then recreate rewrite rules. * * Calls WP_Rewrite::wp_rewrite_rules() after removing the 'rewrite_rules' option. * Якщо функція називається 'save_mod_rewrite_rules' exists, it will be called. * * @ Since 2.0.1 * * @param bool $hard Whether to update .htaccess (hard flush) або just update rewrite_rules option (soft flush). Default is true (hard). */ public function flush_rules( $hard = true ) { static $do_hard_later = null; // Prevent this action from running before everyone має registered їх rewrites. if ( ! did_action( 'wp_loaded' ) ) { add_action( 'wp_loaded', array( $this, 'flush_rules' ) ); $ do_hard_later = ( isset ( $ do_hard_later ) ) ? $do_hard_later || $hard: $hard; return; } if ( isset ( $ do_hard_later ) ) { $hard = $do_hard_later; unset ($ do_hard_later); } update_option( 'rewrite_rules', ''); $this->wp_rewrite_rules(); /** * Filters whether a "hard" rewrite rule flush should be performed when requested. * * A "hard" flush updates .htaccess (Apache) або web.config (IIS). * * @ Since 3.7.0 * * @param bool $hard Whether до flush rewrite rules "hard". Default true. */ if ( ! $hard || ! apply_filters( 'flush_rewrite_rules_hard', true ) ) { return; } if ( function_exists( 'save_mod_rewrite_rules' ) ) { save_mod_rewrite_rules(); } if ( function_exists( 'iis7_save_url_rewrite_rules' ) ) { iis7_save_url_rewrite_rules(); } } /** * Sets up the object's properties. * * The 'use_verbose_page_rules' object property will be set to true if the * Permalink structure begins with one of the following: '%postname%', '%category%', * '%tag%', або '%author%'. * * @ Since 1.5.0 */ public function init() { $this->extra_rules = array(); $this->non_wp_rules = array(); $this->endpoints = array(); $this->permalink_structure = get_option( 'permalink_structure' ); $this->front = substr( $this->permalink_structure, 0, strpos( $this->permalink_structure, '%' ) ); $this->root = ''; if ( $this->using_index_permalinks() ) { $this->root = $this->index . '/'; } unset($this->author_structure); unset($this->date_structure); unset($this->page_structure); unset($this->search_structure); unset($this->feed_structure); unset($this->comment_feed_structure); $this->use_trailing_slashes = ( '/' === substr( $this->permalink_structure, -1, 1 ) ); // Досвідчені загальні правила для сторінок, якщо розподільча структура не з'являється з wildcard. if ( preg_match( '/^[^%]*%(?:postname|category|tag|author)%/', $this->permalink_structure ) ) { $this->use_verbose_page_rules = true; } else { $this->use_verbose_page_rules = false; } } /** * Sets the main permalink structure для the site. * * Will update the 'permalink_structure' option, if there is a difference * між поточною рамкою структури і параметром значення. Calls * WP_Rewrite::init() Після того, як option updated. * * Fires the {@see 'permalink_structure_changed'} action once the init call has * processed passing the old and new values * * @ Since 1.5.0 * * @param string $permalink_structure Permalink structure. */ public function set_permalink_structure( $permalink_structure ) { if ( $permalink_structure != $this->permalink_structure ) { $old_permalink_structure = $this->permalink_structure; update_option('permalink_structure', $permalink_structure); $this->init(); /** * Fires after the permalink structure is updated. * * @ Since 2.8.0 * * @param string $old_permalink_structure The previous permalink structure. * @param string $permalink_structure New permalink structure. */ do_action( 'permalink_structure_changed', $old_permalink_structure, $permalink_structure ); } } /** * Набір категорій основи для категорії permalink. * * Will update the 'category_base' option, if there is a difference between * the current category base and the parametr value. Calls WP_Rewrite::init() * after the option is updated. * * @ Since 1.5.0 * * @param string $category_base Category permalink structure base. */ public function set_category_base( $category_base ) { if ( get_option( 'category_base' ) !== $category_base ) { update_option('category_base', $category_base); $this->init(); } } /** * Sets tag base for tag permalink. * * Will update the 'tag_base' option, if there is a difference between the * current tag base and the parametr value. Calls WP_Rewrite::init() after * the option is updated. * * @ Since 2.3.0 * * @param string $tag_base Tag permalink structure base. */ public function set_tag_base( $tag_base ) { if ( get_option( 'tag_base' ) !== $tag_base ) { update_option('tag_base', $tag_base); $this->init(); } } /** * Constructor - Calls init(), які runs setup. * * @ Since 1.5.0 */ public function __construct() { $this->init(); } }

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *