add_rewrite_endpoint()
Добавляет конечную точку, например /trackback/. Добавляются дополнительные правила перезаписи ЧПУ с указанной конечной точкой.
При добавлении конечной точки в ЧПУ, добавляются дополнительные правила перезаписи URL для каждого типа URL указанного во втором параметре $places. Это может быть: пост, страница, рубрика, автор, поиск. Например:
add_rewrite_endpoint( 'json', EP_PERMALINK | EP_PAGES );
Добавит новое правило оканчивающееся на json(/(.*))?/?$
для каждой структуры ЧПУ, которая описывает ЧПУ постов или постоянных страниц. Итоговый параметр запроса будет выглядеть так: [базовые параметры]&json=$match
, где $match - это частью ЧПУ следующая за конечной точкой. Например если ссылка такая: [permalink]/json/foo/
то $match будет foo
, а запрос такой [параметры permalink]?json=foo
.
Функция также добавляет название конечной точки ( из примера json) в белый список переменных запроса.
При указании параметра $places
, убедитесь что вы используете рабочую константу типа EP_*
(можно использовать несколько параметров через |
).
https://make.wordpress.org/plugins/2012/06/07/rewrite-endpoints-api/ - как это работает.
Для того чтобы изменения применились нужно сбросить правила перезаписи, с помощью flush_rewrite_rules() при активации/деактивации плагина. Или, для сброса, можно просто посетить страницу Настройки > Постоянные ссылки (Settings > Permalinks).
Хуков нет.
Возвращает
null
. Ничего.
Использование
add_rewrite_endpoint( $name, $places, $query_var );
- $name(строка) (обязательный)
- Название конечной точки.
- $places(число) (обязательный)
Место куда конечная точка должна быть добавлена. Названия мест - маски конечных точек для:
EP_NONE
- по дефолту - не относится ни к чемуEP_PERMALINK
- постоянных ссылок постовEP_ATTACHMENT
- вложенийEP_DATE
- датыEP_YEAR
- годаEP_MONTH
- месяцаEP_DAY
- дняEP_ROOT
- корня (root)EP_COMMENTS
- комментариевEP_SEARCH
- поискаEP_CATEGORIES
- рубрикEP_TAGS
- метокEP_AUTHORS
- авторовEP_PAGES
- постоянных страницEP_ALL_ARCHIVES
- архивов: EP_DATE | EP_YEAR | EP_MONTH | EP_DAY | EP_CATEGORIES | EP_TAGS | EP_AUTHORSEP_ALL
- всего сразу: EP_PERMALINK | EP_ATTACHMENT | EP_ROOT | EP_COMMENTS | EP_SEARCH | EP_PAGES | EP_ALL_ARCHIVES
- $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; // if this is a request for json or a singular object then bail // include custom template if ( isset( $wp_query->query_vars['json'] ) && is_singular() ){ $template = __DIR__ . '/json-template.php'; } return $template; }
Смотрите пример для плагина: https://gist.github.com/joncave/2891111
#2 Добавим ЧПУ для страницы плагина во фронте
Этот пример показывает как создать страницу для плагина налету. За вывод такой страницы будет отвечать файл шаблона, который мы укажем сами. И для такой страницы не нужно создавать страницу в админ-панели.
Конечную точку будем добавлять для главной страницы.
add_action( 'init', 'add_my_endpoint' ); function add_my_endpoint(){ add_rewrite_endpoint( 'myplug-page', EP_ROOT ); }
Теперь, нужно сбросить ЧПУ и у нас будет работать URL вида:
example.com/myplug-page
.- или
example.com/myplug-page/параметр_запроса
.
Для такой страницы хорошо бы сбросить параметры основного запроса, чтобы не тратить ресурсы на запрос, который мы все равно не используем. В данном случае запрос получает все последние записи.
Сделать это можно например так:
// урезаем основной запрос для главной страницы сайта, чтобы он не создавал ненужную нагрузку. 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' );
Обработать запрос и подключить файл шаблона можно через хук template_include.
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 Отдельная страница для комментариев записи
Код смотрите в заметке.
Заметки
- Global. WP_Rewrite. $wp_rewrite WordPress rewrite component.
Список изменений
С версии 2.1.0 | Введена. |
С версии 4.3.0 | Added support for skipping query var registration by passing false to $query_var. |
Код add_rewrite_endpoint() add rewrite endpoint WP 6.7.1
function add_rewrite_endpoint( $name, $places, $query_var = true ) { global $wp_rewrite; $wp_rewrite->add_endpoint( $name, $places, $query_var ); }