Произвольные типы записей WordPress

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' => 'Добавить новый проект', // заголовок тега <title>
'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 — поддержка различного функционала, можно например включить поддержку комментирования и миниатюр. В данном примере включается заголовок, редактор, комментарии, автор и миниатюры записей.
Нужен бесплатный одноразовый телефонный номер? Тогда попробуйте сервис https://vydem.ru
Преимущества сервиса в том, что:
- это традиционная мобильная связь, а значит не будет перебоев в общении, в отличие от интернет-каналов (вацап, зум и т.д.);
- номера собеседников остаются скрыты друг от друга;
- не расходуется интернет-трафик;
- если надо переговорить в конференции, то не нужно друг с другом обмениваться контактами.
После размещения вышеприведенного кода, в меню панели администрирования появится новый раздел «Портфолио» с возможностью добавления новых записей.
Создание рубрик для произвольных типов записей
Для возможности создания рубрик необходимо добавить в массив $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' => 'Добавить новый проект', // заголовок тега <title>
'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, в котором можно выбрать из набора готовых иконок и применить изображение одним кликом. Особенно актуально это будет если у вас много различных пользовательских типов записей.

Подробнее о проекте Lemonad https://gembla.net/lemonad


Что-то не получается рубрики портфолио сделать отдельными от рубрик в записях. При указывании ‘taxonomies’ => array( ‘portfolio_category’ ) вместо ‘taxonomies’ => array( ‘category’ ) рубрики из портфолио вообще пропадают.
Или новую таксономию с рубриками нужно указывать в другом месте?
Что не так?
Привязка указывается при регистрации таксономии. Можно попробовать убрать эту строчку из типа записи.