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
— поддержка различного функционала, можно например включить поддержку комментирования и миниатюр. В данном примере включается заголовок, редактор, комментарии, автор и миниатюры записей
После размещения вышеприведенного кода, в меню панели администрирования появится новый раздел «Портфолио» с возможностью добавления новых записей.
Создание рубрик для произвольных типов записей
Для возможности создания рубрик необходимо добавить в массив $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