add_rewrite_rule для произвольных типов записей
На сайте есть тип поста под названием groups.
Можно ли сделать что бы строчка
example.com/groups/postname/?type=history
Отображалась как:
example.com/groups/postname/history
На сайте есть тип поста под названием groups.
Можно ли сделать что бы строчка
example.com/groups/postname/?type=history
Отображалась как:
example.com/groups/postname/history
Название type зарезервировано... Поэтом в примере ниже все что вам нужно, только там вместо type используется mytype.
add_action('init', 'add_groups_rewrite_rule'); function add_groups_rewrite_rule(){ // Правило перезаписи add_rewrite_rule( '^groups/([^/]+)/([^/]+)/?', 'index.php?post_type=groups&name=$matches[1]&mytype=$matches[2]', 'top' ); // скажем WP, что есть новые параметры запроса add_filter( 'query_vars', function( $vars ){ $vars[] = 'mytype'; return $vars; } ); } // На странице получаем так $mytype = get_query_var('mytype');Не забудь обновить настройки постоянных ссылок, после установки кода, чтобы правило добавилось в опции, в БД.
Спасибо, работает хорошо) А как сделать если у постов сделана древовидная структура??
Так можно попробовать, но не факт что будет работать. Надо проверять... '^groups/(.+?)/([^/]+)/?$'
Выдаёт 404 ошибку
Регулярка правильная, проверил... Тут проблема в параметре... Попробуй так:
Или старый вариант с новой регуляркой и таким хуком
add_rewrite_rule( '^groups/(.+?)/([^/]+)/?$', 'index.php?post_type=groups&pagename=$matches[1]&mytype=$matches[2]', 'top' ); // поправим параметры запроса для записи groups //$this->query_vars = apply_filters( 'request', $this->query_vars ); add_action('request', 'groups_unwanted_query_vars' ); function groups_unwanted_query_vars( $vars ){ if( @ $vars['post_type'] === 'groups' && !empty($vars['name']) ){ $_name = explode('/', $vars['name']); $vars['name'] = end( $_name ); // последний элемент } return $vars; }Вот рабочий пример))
add_action('init', 'add_groups_rewrite_rule'); function add_groups_rewrite_rule(){ // Правило перезаписи add_rewrite_rule( '^groups/(.+?)/([^/]+)/?$', 'index.php?post_type=groups&name=$matches[1]&mytype=$matches[2]', 'top' ); // скажем WP, что есть новые параметры запроса add_filter( 'query_vars', function( $vars ){ $vars[] = 'mytype'; return $vars; } ); } add_action('request', 'groups_unwanted_query_vars' ); function groups_unwanted_query_vars( $vars ){ if( @ $vars['post_type'] === 'groups' && !empty($vars['name']) ){ $_name = explode('/', $vars['name']); $vars['name'] = end( $_name ); // последний элемент } return $vars; }Как можно тебя отблагодарить?
Нашелся косяк(((
при заходе example.com/groups/name/name_2/mytype всё хорошо
при заходе example.com/groups/name/name_2/ отображается так же как example.com/groups/name/
Тут надо добавить какую-то зацепку в URL когда древовидно... Например 'type-': example.com/groups/name/type-name_2/ну и регулярку поменять на '^groups/(.+?)/type-([^/]+)/?$'
П.С. отблагодарить можно на странице контактов, там есть ссылка на ЯД и ВМ