WordPress как на ладони
wordpress jino

add_rewrite_tag() WP 2.1.0

Добавляет/обновляет тег запроса ( например: '%pagetype%' ), который можно использовать в ЧПУ. Этот тег будет заменен на регулярное выражение, а оно затем на конструкцию запроса вида: ?pagetype=mypage.

Обычно эта функция используется в связке с add_rewrite_rule(), которая создает новое правило перезаписи для ЧПУ. Часто используется в WordPress для постоянных страниц с отдельным шаблоном.

Если использовать add_rewrite_tag(), для регистрации новой переменной запроса, которая уже существует в WordPress, прежняя переменная будет перезаписана.

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

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

Хуков нет.

Возвращает

Ничего не возвращает.

Использование

add_rewrite_tag($tagname, $regex);
$tagname(строка) (обязательный)
Название переменной, которая будет использована в качестве переменной запроса. Название нужно обернуть в %. Например, pagetype указывается как %pagetype%.
$regex(строка) (обязательный)
Часть регулярного выражения, которому должно подходить значение $tagname. Выражение оборачивается скобками. Например, если переменная запроса: ?pagetype=pages, нужно регуляркой описать pages: ([^&]+)
$query(строка)
Строка запроса, которая будет добавлена в конце запроса, должна оканчиваться на =. Например: post_type=book&name=. В результате, в правиле перезаписи, после = будет установлен match элемент соответствующий параметру $regex (например $matches[1])
По умолчанию: ''

Примеры

#1. Регистрация новой переменной запроса в WP

Этот пример зарегистрирует тег запроса pagetype:

add_action('init', 'rewrite_rule_my');
function rewrite_rule_my(){
	add_rewrite_tag('%pagetype%', '([^&]+)');
}

Процедура необходима, когда создается правило перезаписи функцией add_rewrite_rule(). Обычно такое правило создается для постоянных страниц с уникальным шаблоном.

Получение значений

Значение переменных запроса с перезаписанных УЛРов получается через $wp_query.

Например, у нас была ссылка sitemap?pagetype=pages мы указали правило перезаписи и ссылка превратилась в sitemap/pages, теперь чтобы правильно получить значение pages для использования в PHP и быть уверенным что оно относится именно к переменной запроса pagetype, в шаблоне используем:

get_query_var('pagetype');

или

global $wp_query;
$wp_query->query_vars['pagetype'];

Получить $_GET параметр когда используется ЧПУ невозможно. Т.е. при /sitemap/pages $_GET['pagetype'] будет пуста.

Код add rewrite tag: wp-includes/rewrite.php VER 4.9.1

<?php
function add_rewrite_tag( $tag, $regex, $query = '' ) {
	// validate the tag's name
	if ( strlen( $tag ) < 3 || $tag[0] != '%' || $tag[ strlen($tag) - 1 ] != '%' )
		return;

	global $wp_rewrite, $wp;

	if ( empty( $query ) ) {
		$qv = trim( $tag, '%' );
		$wp->add_query_var( $qv );
		$query = $qv . '=';
	}

	$wp_rewrite->add_rewrite_tag( $tag, $regex, $query );
}

Cвязанные функции

Из метки: Rewrite (ЧПУ перезапись)

add_rewrite_tag 2 комментария
  • Баламут cайт: www.letstart.ru @

    Добрый вечер. Поучительная статья вышла, спасибо. Но меня немного волнует такой вот вопрос: предположим если в настройках постоянных ссылок стоит по умолчанию - /%postname%, а мне к примеру надо определенную категорию выделить среди других, и сделать ей пермалинк вида /category_name/, то есть без /category. А у постов в данной категории путь должен быть /category_name/post_name. В остальных категориях и постах при этом сохраняется стандартный вид шаблона - /%postname%. Есть какой либо способ так выборочно сделать пермалинк для определенной категории и постов в ней? Если сталкивались с таким, укажите в какую сторону копать. Спасибо.

    Ответить5 лет назад #
    • Баламут cайт: www.letstart.ru @

      ах да, забыл добавить... В принципе тут можно было бы обойтись .htaccess для того чтобы блог понимал куда слать человека, но основная проблема тут заключается в том, чтобы вордпресс при указании ссылки на данную категорию и посты в ней, автоматически генерил линк вида /category_name/post_name

      Ответить5 лет назад #

Здравствуйте, !

Ваш комментарий