subcat-1-5300052

16 сентября 2019 WordPress

Произвольные типы записей позволяют разделить посты не только по категориям, но и по их типу с собственными названиями и рубриками. Это что-то типо инфоблока, как в CMS 1С-Битрикс.

По умолчанию в WordPress есть возможность добавлять записи и их рубрики. К примеру на сайте необходимо создать раздел с портфолио. До появления кастомных типов записей приходилось создавать рубрику «Портфолио» и добавлять туда посты вперемешку с другими записями. Функционал был не такой разнообразный как хотелось бы, так как WP изначально создавался как движок для блогов. Но с ростом популярности появились и новые требования к функционалу.

Теперь вы можете создавать различные типы записей для новостей, портфолио, товаров и т.д. с собственными полями, рубриками и настройками.

На примере создадим тип записи «Портфолио», добавим к нему собственные рубрики и иконку для админ-панели.

Регистрируем тип записи

Код ниже разместите в файле functions.php в корне вашей темы.

add_action( 'init', 'true_register_post_type_init' ); // Использовать функцию только внутри хука init

function true_register_post_type_init() {
        $labels = array(
                'name' => 'Портфолио',
                'singular_name' => 'Проект', // админ панель Добавить->Функцию
                'add_new' => 'Добавить проект',
                'add_new_item' => 'Добавить новый проект', // заголовок тега 
                'edit_item' => 'Редактировать проект',
                'new_item' => 'Новый проект',
                'all_items' => 'Все проекты',
                'view_item' => 'Просмотр проекта на сайте',
                'search_items' => 'Искать проекты',
                'not_found' =>  'Проектов не найдено.',
                'not_found_in_trash' => 'В корзине нет проектов.',
                'menu_name' => 'Портфолио' // ссылка в меню в админке
        );
        $args = array(
                'labels' => $labels, // массив с названиями элементов
                'public' => true, // опубликовано
                'show_ui' => true, // показывать интерфейс в админке
                'has_archive' => true, // включить архивные страницы
                'menu_icon' => get_stylesheet_directory_uri() .'/img/icon.png', // иконка в меню
                'menu_position' => 20, // порядок в меню
                'supports' => array( 'title', 'editor', 'comments', 'author', 'thumbnail') // включить заголовок, редактор, комментарии, автор, миниатюра записи
        );
        register_post_type('portfolio', $args);
 }

register_post_type('portfolio', $args); — собственно сама функция регистрации. Можно использовать любое имя для типов, кроме: post, page, attachment, revision, nav_menu_item, action, order, theme.

В массиве $labels по сути задаются названия для самого типа записей, кнопок, ссылок и других элементов отображаемых в админ-панели. Он же является значением ключа labels массива с настройками $args. Тут я думаю все понятно.

Массив $args добавляет настройки для нового типа записей. В примере я указал самые используемые:

labels — ключ со значением массива $labels, где заданы названия различных элементов отображаемых в админ-панели.
public — публикация типа записей. По умолчанию false. Ключ обязателен, иначе новый тип записей не будет отображаться даже в админке.
show_ui — при включении в админ-панели появится раздел с новым типом записей.
has_archive — у записей будут архивные страницы
menu_icon — путь к иконке меню, отображаемой в админ-панели
menu_position — порядок в меню админ-панели
supports — поддержка различного функционала, можно например включить поддержку комментирования и миниатюр. В данном примере включается заголовок, редактор, комментарии, автор и миниатюры записей

После размещения вышеприведенного кода, в меню панели администрирования появится новый раздел «Портфолио» с возможностью добавления новых записей.

custom_post_type1-1-7316739

Создание рубрик для произвольных типов записей

Для возможности создания рубрик необходимо добавить в массив $args новый ключ, с указанием таксономии рубрик. Примере ниже добавляет стандартные общие рубрики:

'taxonomies'  => array( 'category' ),

Код с поддержкой рубрик:

add_action( 'init', 'true_register_post_type_init' ); // Использовать функцию только внутри хука init

function true_register_post_type_init() {
        $labels = array(
                'name' => 'Портфолио',
                'singular_name' => 'Проект', // админ панель Добавить->Функцию
                'add_new' => 'Добавить проект',
                'add_new_item' => 'Добавить новый проект', // заголовок тега 
                'edit_item' => 'Редактировать проект',
                'new_item' => 'Новый проект',
                'all_items' => 'Все проекты',
                'view_item' => 'Просмотр проекта на сайте',
                'search_items' => 'Искать проекты',
                'not_found' =>  'Проектов не найдено.',
                'not_found_in_trash' => 'В корзине нет проектов.',
                'menu_name' => 'Портфолио' // ссылка в меню в админке
        );
        $args = array(
                'labels' => $labels, // массив с названиями элементов
                'public' => true, // опубликовано
                'show_ui' => true, // показывать интерфейс в админке
                'has_archive' => true, // включить архивные страницы
                'menu_icon' => get_stylesheet_directory_uri() .'/img/icon.png', // иконка в меню
                'menu_position' => 20, // порядок в меню
                'supports' => array( 'title', 'editor', 'comments', 'author', 'thumbnail'), // включить заголовок, редактор, комментарии, автор, миниатюра записи
    'taxonomies'  => array( 'category' ) // поддержка рубрик
        );
        register_post_type('portfolio', $args);
 }

Но лучше сделать собственные рубрики отдельно от остальных, которые будут принадлежать только указанному пользовательскому типу записей. Для этого регистрируем новую таксономию с рубриками:

function wptp_register_taxonomy() {
  register_taxonomy( 'portfolio_category', 'portfolio',
    array(
      'labels' => array(
        'name'              => 'Рубрики',
        'singular_name'     => 'Рубрика',
        'search_items'      => 'Поиск рубрики',
        'all_items'         => 'Все рубрики',
        'edit_item'         => 'Изменить рубрику',
        'update_item'       => 'Обновить рубрику',
        'add_new_item'      => 'Добавить рубрику',
        'new_item_name'     => 'Имя рубрики',
        'menu_name'         => 'Рубрики',
        ),
      'hierarchical' => true,
      'sort' => true,
      'args' => array( 'orderby' => 'term_order' ),
      'show_admin_column' => true
      )
    );
}

И указываем ее при регистрации типа записей:

'taxonomies'  => array( 'portfolio_category' ),

Иконки для меню

Указать путь к иконке для меню можно в ключе menu_icon массива $args, либо воспользоваться плагином CPT Custom Icon, в котором можно выбрать из набора готовых иконок и применить изображение одним кликом. Особенно актуально это будет если у вас много различных пользовательских типов записей.

cpt-custom-icon-3470364 cpt-custom-icon-2-6748690 Плагин CPT Custom Icon