Верные решения
появляются в процессе

Настройка ЧПУ в WordPress

Настройка постоянных ссылок для записей

Для стандартного типа записей есть возможность настроить ЧПУ следующего вида: http://site.ru/категория_записи/название_записи.

Для этого нужно в консоли WordPress перейти в пункт меню Настройки > постоянные ссылки, и в поле "произвольно" прописать /%category%/%postname%/ :

Настройка постоянных ссылок WordPress

Но если мы попытаемся посмотреть посты в рубрике http://site.ru/категория_записи/ , то есть вернуться на уровень выше, то WordPress выдаст ошибку 404. Это связано с тем, что для рубрик WordPress добавляет префикс category. То есть все посты в рубрике можно посмотреть по адресу http://site.ru/category/категория_записи/

Чтобы убрать префикс category, можно установить плагин Yoast SEO . Для удаления заходим в пункт меню плагина "Дополнительно > постоянные ссылки".

Настройка ЧПУ для пользовательских типов записей

Допустим, есть пользовательский тип записей "Акции" и таксономия "разделы акций":

add_action( 'init', 'register_aktsii_post_type' );
function register_aktsii_post_type() {
    // Раздел акций - aktsiicat
    register_taxonomy('aktsiicat', array('aktsii'), array(
        'label'                 => 'Раздел акций',
        'labels'                => array(
            'name'              => 'Разделы акций',
            'singular_name'     => 'Раздел акции',
            'search_items'      => 'Искать Раздел акции',
        ),
        'description'           => 'Рубрики для акций', // описание таксономии
        'public'                => true,
        'show_in_nav_menus'     => false, 
        'show_ui'               => true, 
        'show_tagcloud'         => false, 
        'hierarchical'          => true,
        'rewrite'               => array('slug'=>'aktsii', 'hierarchical'=>true,),
        'show_admin_column'     => true,
    ) );

    // тип записи - aktsii
    register_post_type('aktsii', array(
        'label'               => 'акции',
        'labels'              => array(
            'name'          => 'Акции',
            'singular_name' => 'Акция',
            'menu_name'     => 'Архив акций',
            'all_items'     => 'Все акции',
            'add_new'       => 'Добавить акцию',

        ),
        'description'         => '',
        'public'              => true,
        'publicly_queryable'  => true,
        'show_ui'             => true,
        'show_in_rest'        => false,
        'rest_base'           => '',
        'show_in_menu'        => true,
        'exclude_from_search' => false,
        'capability_type'     => 'post',
        'map_meta_cap'        => true,
        'hierarchical'        => false,
        'rewrite'             => array( 'slug'=>'aktsii/%aktsiicat%', ),
        'has_archive'         => 'aktsii',
        'query_var'           => true,
        'supports'            => array( 'title', 'editor' ),
        'taxonomies'          => array( 'aktsiicat' ),
    ) );

}

Чтобы настроить ЧПУ вида http://site.ru/aktsii/razdel-aktsii/podrazdel-aktsii/nazvanie-aktsii, нужно установить следующее значение параметров rewrite и has_archive для пользовательского типа:

'rewrite' => array( 'slug'=>'aktsii/%aktsiicat%', ),
'has_archive' => 'aktsii',

Для таксономии устанавливаем параметр rewrite:

'rewrite' => array('slug'=>'aktsii', 'hierarchical'=>true,)

Значение 'slug'=>'aktsii' и 'has_archive' => 'aktsii'нужно поменять на название вашего пользовательского типа записи.

%aktsiicat% будет заменяться на названия категорий. Для этого добавим фильтр:

//фильтр ЧПУ произвольного типа
add_filter('post_type_link', 'aktsii_permalink', 1, 2);
function aktsii_permalink( $permalink, $post ){
    // выходим если это не наш тип записи: без  %aktsiicat%
    if( strpos($permalink, '%aktsiicat%') === false )
        return $permalink;

    // Получаем элементы таксономии
    $terms = get_the_terms($post, 'aktsiicat');
    $parent = $terms[0]->parent;

    // если есть элемент заменим путь
    if( ! is_wp_error($terms) && !empty($terms) && is_object($terms[0]) ) {

        $term_slug = array_pop($terms)->slug;
        while( $parent ) {
            $parent_term = get_term($parent, 'aktsiicat');
            $term_slug = $parent_term->slug . '/' . $term_slug;
            $parent = $parent_term->parent;
        }
    }
    // элемента нет, а должен быть...
    else
        $term_slug = 'no-aktsiicat';

    return str_replace('%aktsiicat%', $term_slug, $permalink );
}

Чтобы все заработало окончательно, нужно кое-что поменять в запросе WordPress, воспользуемся фильтром:

// смена запроса
add_filter('request', 'action_function_name',1,1 );
function action_function_name( $query ) {

    if(isset($query['aktsiicat'])){ //здесь и далее название таксономии
        $replase1 = strrchr($query['aktsiicat'],'/');
        $replase = str_replace('/','',$replase1);
        $a = get_term_by( 'slug', $replase , 'aktsiicat');
        if(!$a and !empty($replase)){
            $rep = str_replace($replase1,'',$query['aktsiicat']);
            $query['aktsiicat'] = $rep;
            $query['aktsii'] = $replase; //$query['название пользовательского типа записей']
            $query['post_type'] = 'aktsii'; //название пользовательского типа записей
            $query['name'] = $replase;
        }
    }

    return $query;
}

Обновлено: 02.03.2017

Вам помогла эта статья? Оцените!
(7 оценок, среднее: 5,00 из 5)
Загрузка...


Комментариев: 1

  • Спасибо огромное. прям то что надо, долго не могла найти как сделать, а тут все четко. 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *