WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

add_permastruct()WP 3.0.0

Добавляет новую структуру ЧПУ для постоянных ссылок.

Создает не одно правило, а несколько на основе одной указанной пермаструктуры, какие правила создать определяется в параметре $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 ).

Работает на основе: WP_Rewrite()

Хуков нет.

Возвращает

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() (предустановки)

Примеры

0

#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();

Заметки

Список изменений

С версии 3.0.0 Введена.

Код add_permastruct() WP 5.9.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 );
}
4 комментария
    Войти