# Функция ADD_REWRITE_ENDPOINT() в WordPress
Функция add_rewrite_endpoint() добавляет URL-эндпоинт, такой как /trackback/. Она создает дополнительные правила для удобных URL-адресов, добавляя указанный эндпоинт.
Когда эндпоинт добавляется в правила переписывания, для каждого указанного в параметре $places типа URL добавляются дополнительные правила. К примеру:
add_rewrite_endpoint( 'json', EP_PERMALINK | EP_PAGES );
Этот код добавляет новое правило, заканчивающееся на json(/(.*))?/?$, для каждого структуры переписывания, которое описывает удобный URL для постов или страниц. Итоговый параметр запроса будет выглядеть так: [базовые параметры]&json=$match, где $match — это часть удобного URL после эндпоинта. Например, если ссылка будет [постоянный линк]/json/foo/, то $match будет равно foo, а запрос составит [постоянные параметры]?json=foo.
Кроме того, эта функция добавляет название эндпоинта в список допустимых переменных запроса. В нашем примере название эндпоинта — json.
При указании параметра $places, убедитесь, что вы используете корректную константу типа EP_* (можно использовать несколько параметров с помощью |).
## Важно! Сбросьте правила переписывания
Чтобы изменения вступили в силу, необходимо сбросить правила, вызвав функцию flush_rewrite_rules() при активации или деактивации плагина.
Также можно просто перейти на страницу «Настройки» > «Постоянные ссылки» в админпанели.
Функция должна вызываться в хук wp или init. Примеры использования приведены ниже.
---
## Как использовать
Функция add_rewrite_endpoint() принимает три параметра:
```plaintext
add_rewrite_endpoint( $name, $places, $query_var );
-
$name(строка) (обязательный): Имя эндпоинта. -
$places(целое число) (обязательный): Маска эндпоинта, описывающая места, к которым будет добавлен эндпоинт. Принимает одну из следующих масок:- EP_NONE — маска по умолчанию, не применяется ни к чему. Битовое значение:
0. - EP_PERMALINK — постоянная ссылка на любой пост. Битовое значение:
1. - EP_ATTACHMENT — вложения. Битовое значение:
2. - EP_DATE — дата. Битовое значение:
4. - EP_YEAR — год. Битовое значение:
8. - EP_MONTH — месяц. Битовое значение:
16. - EP_DAY — день. Битовое значение:
32. - EP_ROOT — корень. Битовое значение:
64. - EP_COMMENTS — комментарии. Битовое значение:
128. - EP_SEARCH — ��оиск. Битовое значение:
256. - EP_CATEGORIES — категории. Битовое значение:
512. - EP_TAGS — метки. Битовое значение:
1024. - EP_AUTHORS — авторы. Битовое значение:
2048. - EP_PAGES — постоянные страницы. Битовое значение:
4096. - EP_ALL_ARCHIVES — все архивные виды. То же самое, что и использование
EP_DATE | EP_YEAR | EP_MONTH | EP_DAY | EP_CATEGORIES | EP_TAGS | EP_AUTHORS. - EP_ALL — все сразу (всё). То же самое, что и использование
EP_PERMALINK | EP_ATTACHMENT | EP_ROOT | EP_COMMENTS | EP_SEARCH | EP_PAGES | EP_ALL_ARCHIVES.
- EP_NONE — маска по умолчанию, не применяется ни к чему. Битовое значение:
-
$query_var(строка/логический) — имя переменной запроса для этого эндпоинта, по умолчанию совпадает с именем эндпоинта ($name). Укажитеfalse, чтобы предотвратить добавление переменной запроса. По умолчанию:true.
Примеры использования
Пример 1: Добавление эндпоинта для постов и страниц
add_action( 'init', 'add_my_endpoint' );
function add_my_endpoint() {
add_rewrite_endpoint( 'json', EP_PERMALINK | EP_PAGES );
}
Теперь нужно обработать URL — назначить ему файл шаблона, который будет отвечать за вывод данных. Это можно сделать с помощью хука template_include.
add_action( 'template_include', 'makeplugins_json_template_include' );
function makeplugins_json_template_include( $template ) {
global $wp_query;
// если это запрос для json или для единственного объекта, то подключаем кастомный шаблон
if ( isset( $wp_query->query_vars['json'] ) && is_singular() ){
$template = __DIR__ . '/json-template.php';
}
return $template;
}
Пример 2: Добавление удобного URL для страницы плагина
Этот пример показывает, как создать страницу для плагина без необходимости создания реальной страницы в базе данных.
add_action( 'init', 'add_my_endpoint' );
function add_my_endpoint(){
add_rewrite_endpoint( 'myplug-page', EP_ROOT );
}
Теперь нам нужно сбросить правила удобных URL, чтобы получить рабочий URL:
site.com/myplug-page- или
site.com/myplug-page/my-query_parameter
Для такой страницы имеет смысл сбросить параметры основного запроса.
add_filter( 'posts_clauses_request', 'skip_main_query_for_myplugpage', 10, 2 );
function skip_main_query_for_myplugpage( $pieces, $wp_query ){
if( isset( $wp_query->query['myplug-page'] ) && $wp_query->is_main_query() ){
$pieces['where'] = ' AND ID = 0';
}
return $pieces;
}
Создание шаблона страницы
На странице, используя is_front_page(), мы можем получить параметр запроса следующим образом:
$var = get_query_var( 'myplug-page' );
Теперь давайте обработаем запрос и подключим наш файл шаблона.
add_action( 'template_include', 'myplugpage_template_file', 20 );
function myplugpage_template_file( $template ) {
global $wp_query;
// наш запрос
if ( isset( $wp_query->query['myplug-page'] ) ) {
$template = __DIR__ . '/path/to/myplug-page-template.php';
}
return $template;
}
Пример 3: Отдельная страница для комментариев к постам
Для этого кода вы можете посмотреть отдельную заметку, касающуюся этого вопроса.
Примечания
- Глобальный объект:
WP_Rewrite.$wp_rewrite— компонент переписывания WordPress.
Изменения
- С версии 2.1.0 введена.
- С версии 4.3.0 добавлена поддержка пропуска регистрации переменной запроса, если передать
falseв$query_var.
Код функции ADD_REWRITE_ENDPOINT()
function add_rewrite_endpoint( $name, $places, $query_var = true ) {
global $wp_rewrite;
$wp_rewrite->add_endpoint( $name, $places, $query_var );
}