Добавление таксономии в тип записи с дружелюбным URL

Добавление таксономии в тип записи с дружелюбным URL и одинаковым префиксом

В этой статье мы разберем, как создать тип записи для часто задаваемых вопросов (FAQ) и категории для него (таксономия faqcat). Мы также сделаем так, чтобы таксономия имела тот же префикс, что и тип записи.

Пример структуры URL

  • URL для поста: site.com/faq/{категория}/{название-вопроса}
  • URL для таксономии: site.com/faq/{категория}

Важно зарегистрировать таксономию до того, как мы создадим тип записи.

Код для регистрации типа записи и таксономии

Шаг 1: Регистрация таксономии и типа записи

Используем следующий код для регистрации:


// Регистрация типа записи и таксономии
add_action( 'init', 'register_faq_post_type' );

// Фильтр для создания дружелюбного URL для типа записи
add_filter( 'post_type_link', 'faq_permalink', 1, 2 );

function register_faq_post_type() {

// Регистрация категории вопросов - faqcat
register_taxonomy( 'faqcat', [ 'faq' ], [
    'label'             => 'Категория вопросов',
    'labels'            => [
        'name'              => 'Разделы вопросов',
        'singular_name'     => 'Раздел вопроса',
        'search_items'      => 'Поиск раздела вопроса',
        'all_items'         => 'Все разделы вопросов',
        'parent_item'       => 'Родительский раздел вопроса',
        'parent_item_colon' => 'Родительский раздел вопроса:',
        'edit_item'         => 'Редактировать раздел вопроса',
        'update_item'       => 'Обновить раздел вопроса',
        'add_new_item'      => 'Добавить новый раздел вопроса',
        'new_item_name'     => 'Новое название раздела вопроса',
        'menu_name'         => 'Раздел вопросов',
    ],
    'description'       => 'Категории для раздела вопросов',
    'public'            => true,
    'show_in_nav_menus' => false,
    'show_ui'           => true,
    'show_tagcloud'     => false,
    'hierarchical'      => true, // Категории могут быть иерархическими
    'rewrite'           => [ 'slug' => 'faq', 'hierarchical' => false, 'with_front' => false, 'feed' => false ],
    'show_admin_column' => true,
] );

// Регистрация типа записи - вопросы - faq
register_post_type( 'faq', [
    'label'               => 'Вопросы',
    'labels'              => [
        'name'          => 'Вопросы',
        'singular_name' => 'Вопрос',
        'menu_name'     => 'Архив вопросов',
        'all_items'     => 'Все вопросы',
        'add_new'       => 'Добавить вопрос',
        'add_new_item'  => 'Добавить новый вопрос',
        'edit'          => 'Редактировать',
        'edit_item'     => 'Редактировать вопрос',
        'new_item'      => 'Новый вопрос',
    ],
    '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'             => [
        'slug'       => 'faq/%faqcat%',
        'with_front' => false,
        'pages'      => false,
        'feeds'      => false,
        'feed'       => false,
    ],
    'has_archive'         => 'faq',
    'query_var'           => true,
    'supports'            => [ 'title', 'editor' ], // Поддержка заголовка и редактора
    'taxonomies'          => [ 'faqcat' ],
] );

}

Шаг 2: Настройка дружелюбного URL

Теперь мы создадим функцию, которая будет изменять URL в соответствии с выбранной категорией.


function faq_permalink( $permalink, $post ) {

// Проверяем, является ли это нашим типом записи
if( strpos( $permalink, '%faqcat%' ) === false ){
    return $permalink;
}

// Получаем элементы таксономии
$terms = get_the_terms( $post, 'faqcat' );

// Если категория найдена, изменяем URL
if( ! is_wp_error( $terms ) && ! empty( $terms ) && is_object( $terms[0] ) ){
    $term_slug = array_pop( $terms )->slug;
} else {
    // Если категории нет, используем стандартное значение
    $term_slug = 'no-faqcat';
}

return str_replace( '%faqcat%', $term_slug, $permalink );

}

Заключение

Теперь у вас есть функционал для создания типов записей "Вопросы" и соответствующей таксоно��ии "Категории вопросов". Это помогает организовать содержимое на вашем сайте и делает URL более понятными для пользователей. Не забывайте тестировать каждую часть кода, чтобы убедиться, что все работает корректно.

Leave a Reply

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