Функция ADD_REWRITE_ENDPOINT() в WordPress: добавление URL-эндпоинтов

# Функция 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.
  • $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 );
}

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *