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

add_rewrite_rule для произвольных типов записей

На сайте есть тип поста под названием groups.

Можно ли сделать что бы строчка

example.com/groups/postname/?type=history

Отображалась как:

example.com/groups/postname/history

0
Гость
7.4 года назад
  • 0
    Kama9616

    Название 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');

    Не забудь обновить настройки постоянных ссылок, после установки кода, чтобы правило добавилось в опции, в БД.

    Сергей 7.4 года назад

    Спасибо, работает хорошо) А как сделать если у постов сделана древовидная структура??

    Kama 7.4 года назад

    Так можно попробовать, но не факт что будет работать. Надо проверять... '^groups/(.+?)/([^/]+)/?$'

    Сергей 7.4 года назад

    Выдаёт 404 ошибку

    Kama 7.4 года назад

    Регулярка правильная, проверил... Тут проблема в параметре... Попробуй так:

    add_rewrite_rule( '^groups/(.+?)/([^/]+)/?$', 'index.php?post_type=groups&name=$matches[1]&mytype=$matches[2]', 'top' );

    Или старый вариант с новой регуляркой и таким хуком

    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;
    }
    Сергей 7.4 года назад

    Вот рабочий пример))

    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;
    }
    

    Как можно тебя отблагодарить?

    Сергей 7.4 года назад

    Нашелся косяк(((
    при заходе example.com/groups/name/name_2/mytype всё хорошо
    при заходе example.com/groups/name/name_2/ отображается так же как example.com/groups/name/

    Kama 7.4 года назад

    Тут надо добавить какую-то зацепку в URL когда древовидно... Например 'type-': example.com/groups/name/type-name_2/ну и регулярку поменять на '^groups/(.+?)/type-([^/]+)/?$'

    П.С. отблагодарить можно на странице контактов, там есть ссылка на ЯД и ВМ

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация