WordPress как на ладони
rgbcode is looking for WordPress developers.

add_rewrite_endpoint()WP 2.1.0

Добавляет конечную точку, например /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_* (можно использовать несколько параметров через |).

Для того чтобы изменения применились нужно сбросить правила перезаписи, с помощью flush_rewrite_rules() при активации/деактивации плагина. Или, для сброса, можно просто посетить страницу Настройки > Постоянные ссылки (Settings > Permalinks).

Вызывать функцию нужно во время события wp или init. См. примеры.

Работает на основе: WP_Rewrite::add_endpoint()
1 раз — 0.000001 сек (скорость света) | 50000 раз — 0.07 сек (скорость света) | PHP 7.3.20, WP 5.5.3

Хуков нет.

Возвращает

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_AUTHORS
  • EP_ALL - всего сразу: EP_PERMALINK | EP_ATTACHMENT | EP_ROOT | EP_COMMENTS | EP_SEARCH | EP_PAGES | EP_ALL_ARCHIVES
$query_var(строка/логический)
Название переменной запроса для этой конечной точки, по умолчанию равно названию конечной точки (параметру $name). Укажите false, чтобы функция не добавляла переменную запроса.
По умолчанию: true

Примеры

0

#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

0

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

0

#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() WP 6.4.3

function add_rewrite_endpoint( $name, $places, $query_var = true ) {
	global $wp_rewrite;
	$wp_rewrite->add_endpoint( $name, $places, $query_var );
}
5 комментариев
    Войти