add_permastruct()
Добавляет новую структуру ЧПУ для постоянных ссылок.
Создает не одно правило, а несколько на основе одной указанной пермаструктуры, какие правила создать определяется в параметре $args и тегах самой структуры...
Объяснение
Структура постоянных ссылок - это абстрактное понятие и означает установку (определение) правил того, как должна выглядеть ЧПУ (человеко-понятная УРЛ).
Эта функция дает возможность быстро создать группу правил (с регулярными выражениями), которые перезапишут URL во внутренние параметры запроса. Новые правила будут добавленные в свойство WP_Rewrite::$extra_permastructs (массив).
Когда правила перезаписи создаются функцией WP_Rewrite::rewrite_rules(), все эти новые перма-структуры передаются в функцию WP_Rewrite::generate_rewrite_rules(), которая в свою очередь превращает их в регулярные выражения и то какой УРЛ должен получится, если регулярка подходит под текущий УРЛ запроса.
Параметр $args дает возможность контролировать как WP_Rewrite::generate_rewrite_rules() будет создавать новую перма-структуру.
Объяснение еще раз, другими словами.
Добавленная структура, например, book/%book%
разбирается и на основе нее добавляются нужные правила перезаписи ЧПУ в настройки ЧПУ (смотрите глобальную переменную $wp_query).
Теги указанные в структуре, например %book%
, заменяются на соответствующую часть регулярного выражения, которая указывается при регистрации тега перезаписи в add_rewrite_tag().
Если в структуре указаны неизвестные теги, то они не будут заменены на группы регулярного выражения и останутся в правилах перезаписи как есть. Например, ЧПУ получится следующий, если указан незарегистрированный тег %order_id%:
[order/%order_id%/?$] => index.php?%order_id%$matches[1]
Регистрировать тег (плейсхолдер) нужно отдельно с помощью функции add_rewrite_tag().
Эта функция обычно используется в связке с функциями: add_rewrite_tag() и add_rewrite_rule()
Работает на основе метода WP_Rewrite::add_permastruct( $name, $struct, $args ).
Хуков нет.
Возвращает
null
. Ничего.
Использование
add_permastruct( $name, $struct, $args );
- $name(строка) (обязательный)
- Название структуры. Название типа записи, для которого создается структура ЧПУ.
- $struct(строка) (обязательный)
- Сама структура ЧПУ.
- $args(массив)
Параметры построения ссылки из указанной структуры. Подробнее смотрите: WP_Rewrite::add_permastruct(). Возможные элементы массива:
-
with_front(логический)
Нужно ли предварять структуру параметром WP_Rewrite::$front.
По умолчанию true. -
ep_mask(число)
Конечная точка в структуре. Может быть:- EP_NONE
- EP_PERMALINK
- EP_ATTACHMENT
- EP_DATE
- EP_YEAR
- EP_MONTH
- EP_DAY
- EP_ROOT
- EP_COMMENTS
- EP_SEARCH
- EP_CATEGORIES
- EP_TAGS
- EP_AUTHORS
- EP_PAGES
- EP_ALL_ARCHIVES
- EP_ALL
По умолчанию EP_NONE.
-
paged(логический)
Нужно ли добавлять регулярки для страниц пагинации?
По умолчанию true. -
feed(логический)
Нужно ли добавлять регулярки для страниц фидов?
По умолчанию true. -
forcomments(логический)
Сделать ссылку фидов как запрос на фид комментариев
По умолчанию false. -
walk_dirs(логический)
Если указать true, то правило перезаписи будет создано для каждой директории указанной в структуре. Например, если структура указана как/%year%/%month%/%day/
, то правила будут созданы для директорий:/%year%/
,/%year%/%month%/
и/%year%/%month%/%day%/
.
По умолчанию true. - endpoints(логический)
Нужно ли добавлять конечные точки в конец правил перезаписи ЧПУ?
По умолчанию true.
По умолчанию указываются следующие параметры:
$defaults = array( 'with_front' => true, 'ep_mask' => EP_NONE, 'paged' => true, 'feed' => true, 'forcomments' => false, 'walk_dirs' => true, 'endpoints' => true, );
По умолчанию: array() (предустановки)
-
Примеры
#1 Структура ЧПУ для произвольного типа записи book
Допустим при регистрации типа записи с помощью register_post_type() в параметре rewrite мы указали false. И теперь мы хотим вручную установить ЧПУ для этого типа записи, тогда добавим такой код.
add_action( 'init', function(){ $post_type = 'book'; $permastruct = "$post_type/%book%"; // структура ЧПУ $args = [ 'with_front' => true, 'paged' => true, 'ep_mask' => EP_NONE, 'feed' => false, 'forcomments' => false, 'walk_dirs' => false, 'endpoints' => false, ]; add_permastruct( $post_type, $permastruct, $args ); // добавим тег перезаписи, чтобы add_permastruct() его поняла // он потом будет заменен на часть регулярки указанной во втором параметре add_rewrite_tag( "%book%", '([^/]+)', "post_type=$post_type&name=" ); } );
Третий параметр в add_permastruct() можно не указывать, тогда аргументы будут по умолчанию.
После установки кода, нужно сбросить правила ЧПУ, для этого нужно просто сохраниться в настройках постоянных ссылок в админке. Или запустить функцию flush_rewrite_rules():
// Only flush rewrite rules, if your permalink changed (e.g. on plugin activation): flush_rewrite_rules();
Заметки
- Смотрите: WP_Rewrite::add_permastruct()
- Global. WP_Rewrite. $wp_rewrite WordPress rewrite component.
Список изменений
С версии 3.0.0 | Введена. |
Код add_permastruct() add permastruct WP 6.4.3
function add_permastruct( $name, $struct, $args = array() ) { global $wp_rewrite; // 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 ); } $wp_rewrite->add_permastruct( $name, $struct, $args ); }