Пользовательские типы записи и таксономии дают огромные возможности расширения функционала сайта.
Пользовательский тип записи
Вставляем в funсtions.php
// Пользовательский тип записи
add_action( 'init', 'register_post_type_track' ); // Использовать функцию только внутри хука init
function register_post_type_track() {
$labels = array(
'name' => 'Трэк',
'singular_name' => 'Track', // админ панель Добавить->Функцию
'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,
'exclude_from_search' => false, // исключить тип записи из результатов поиска
'show_ui' => true, // показывать интерфейс в админке
'has_archive' => true,
'menu_icon' => get_stylesheet_directory_uri() .'/img/music_icon.png', // иконка в меню
'menu_position' => 20, // порядок в меню
'supports' => array( 'title', 'editor', 'comments', 'author', 'thumbnail'),
'taxonomies' => array('category') // добавляем поддержку стандартных таксономий 'post_tag', 'category', либо пользовательскую 'album' (через запятую)
);
register_post_type('track', $args);
}
Чтобы в произвольный тип записи добавить редактор Guttenberg нужно добавить еще один параметр
‘show_in_rest’ => true,
// Тексты уведомлений для типа постов
add_filter( 'post_updated_messages', 'true_post_type_messages' );
function true_post_type_messages( $messages ) {
global $post, $post_ID;
$messages['track'] = array( // track - название созданного нами типа записей
0 => '', // Данный индекс не используется.
1 => sprintf( 'Трек обновлен. <a href="%s">Просмотр</a>', esc_url( get_permalink($post_ID) ) ),
2 => 'Трек обновлён.',
3 => 'Трек удалён.',
4 => 'Трек обновлен.',
5 => isset($_GET['revision']) ? sprintf( 'Трек восстановлен из редакции: %s', wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
6 => sprintf( 'Трек опубликован на сайте. <a href="%s">Просмотр</a>', esc_url( get_permalink($post_ID) ) ),
7 => 'Трек сохранен.',
8 => sprintf( 'Отправлен на проверку. <a target="_blank" href="%s">Просмотр</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
9 => sprintf( 'Запланирован на публикацию: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Просмотр</a>', date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
10 => sprintf( 'Черновик обновлён. <a target="_blank" href="%s">Просмотр</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
);
return $messages;
}
Иконку пункта меню можно делать картинкой, как в примере выше
‘menu_icon’ => get_stylesheet_directory_uri() .’/img/music_icon.png’, // иконка png в меню
или применить стандартный для админки wordpress набор иконок Dashicons
‘menu_icon’ => ‘dashicons-format-audio’, // иконка dashicons в меню
Навигация на следующие и предыдущие пользовательские записи, а также ссылка на архив пользовательских записей данного типа:
<!-- Навигация пользовательских записей -->
<?php if( is_singular('track') ) : ?>
<a href="<?php echo get_post_type_archive_link($post_type); ?>"><p><i class="fa fa-level-up"></i>Перейти к списку пользовательских записей</p></a>
<hr class="line-wt">
<div id="nav-left"><?php previous_post_link( '%link' ) ?></div>
<div id="nav-right"><?php next_post_link( '%link' ) ?></div>
<?php endif; ?>
Вывод общего количества записей произвольного типа:
<?php echo wp_count_posts('project')->publish; ?>
Добавить для пользовательского типа записей редактор Gutenberg
Необходимо добавить параметр
'show_in_rest' => true,
Пользовательский тип таксономии
Вставляем в funсtions.php
// Пользовательская таксономия
function add_new_taxonomies() {
/* создаем функцию с произвольным именем и вставляем в неё register_taxonomy() */
register_taxonomy('album',
array('track'),
array(
'hierarchical' => false, // true - по типу рубрик, false - по типу меток, по умолчанию - false
'labels' => array(
/* ярлыки, нужные при создании UI, можете не писать ничего, тогда будут использованы ярлыки по умолчанию */
'name' => 'Альбом',
'singular_name' => 'Album',
'search_items' => 'Найти альбом',
'popular_items' => 'Популярные альбомы',
'all_items' => 'Все альбомы',
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => 'Редактировать альбом',
'update_item' => 'Обновить альбом',
'add_new_item' => 'Добавить новый альбом',
'new_item_name' => 'Название нового альбома',
'separate_items_with_commas' => 'Разделяйте альбомы запятыми',
'add_or_remove_items' => 'Добавить или удалить альбом',
'choose_from_most_used' => 'Выбрать из наиболее часто используемых альбомов',
'menu_name' => 'Альбомы'
),
'public' => true, // каждый может использовать таксономию, либо только администраторы, по умолчанию - true
'show_in_nav_menus' => true, // добавить на страницу создания меню
'show_ui' => true, // добавить интерфейс создания и редактирования
'show_tagcloud' => true, // нужно ли разрешить облако тегов для этой таксономии
'update_count_callback' => '_update_post_term_count', // callback-функция для обновления счетчика $object_type
'query_var' => true, // разрешено ли использование query_var, также можно указать строку, которая будет использоваться в качестве него, по умолчанию - имя таксономии
'rewrite' => array(
/* настройки URL пермалинков */
'slug' => 'album', // ярлык
'hierarchical' => true // разрешить вложенность
),
)
);
}
add_action( 'init', 'add_new_taxonomies', 0 );