Иногда требуется выделить определенные записи, создав для них отдельный раздел. Например, уже стала обычной практика создания на базе блога раздела портфолио, в котором размещаются работы. Такие записи обычно публикуют в отдельном разделе, и даже их оформление отличается от других записей. Создаются такие особые публикации с помощью пользовательских типов записей, работу с которыми поддерживает WordPress.
Некоторые спросят, зачем же создавать отдельный вид записей, если можно просто создать отдельную категорию? Конечно, это дело вкуса – как обозначать запись разного рода на сайте, но обычно пользовательские типы записей создают для создания нескольких потоков записей.
Для создания пользовательского типа записей нужно добавить в файл functions.php:
add_action( 'init', 'create_post_type' );
function create_post_type() {
register_post_type( 'portfolio',
array(
'labels' => array( // добавляем новые элементы в административную частьку
'name' => __( 'Портфолио' ),
'singular_name' => __( 'Работа' ),
'has_archive' => true,
'add_new' => 'Добавить новую работу',
'not_found' => 'Ничего не найдено',
'not_found_in_trash' => 'В корзине работ не найдено'
),
'public' => true,
'has_archive' => true,
'supports' => array( //добавляем элементы в редактор
'title',
'editor',
'author',
'trackbacks',
'thumbnail',
'page-attributes',
'post-formats',
'custom-fields'
),
'taxonomies' => array('category', 'post_tag') //добавляем к записям необходимый набор таксономий
));
}
В данном примере код регистрирует пользовательский тип записей Портфолио.
Для вывода записей типа Портфолио вместе с другими записями блога на главной странице нужно добавить в файл functions.php:
add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( ( is_home() && false == $query->query_vars['suppress_filters'] ) || is_feed() )
$query->set( 'post_type', array( 'post', 'portfolio' ) );
return $query;
}
Для того, чтобы записи пользовательского типа попадали в общую ленту RSS, в файл functions.php нужно еще добавить:
function rss_mod($args) {
if (isset($args['feed']) && !isset($args['post_type']))
$args['post_type'] = array('post', 'portfolio');
return $args;
}
add_filter('request', 'rss_mod');
Чтобы создать отдельный поток записей пользовательского типа, нужно добавить в файл functions.php:
add_filter('pre_get_posts', 'query_post_type');
function query_post_type($query) {
if(is_category() || is_tag()) {
$post_type = get_query_var('post_type');
if($post_type)
$post_type = $post_type;
else
$post_type = array('post','portfolio');
$query->set('post_type',$post_type);
return $query;
}}
Этот код создает архив записей Портфолио, у которого есть своя ссылка: вашсайт.name/portfolio/
У записи пользовательского типа должен быть свой шаблон – файл, отвечающий за то, как выглядит такая запись. Этот файл легко создать копированием файла single.php. В приведенных выше примерах создается пользовательский тип записей Портфолио (ярлык – portfolio), давайте создадим для него шаблон. Для этого нужно скопировать файл single.php и переименовать его в single-portfolio.php.
Правило создания шаблона для пользовательского типа записей таково: single-ЯРЛЫК_ШАБЛОНА.php. Если этот файл не существует, то WordPress будет использовать для отображения записей пользовательского типа шаблон single.php. Подробнее о шаблонах в WordPress и их иерархии.









Как я не создавал шаблон, ну не хочет он отображать и всё тут! постоянно ошибка вылетает(
Работает все на ура. спасибо.
Подскажите, вот строка ‘taxonomies’ => array(‘category’, ‘post_tag’) она не показывает разделы в колонке, если у нас таксономия тоже не стандартная, что делать? пробовал вписать ‘taxonomies’ => array(‘gallery_tax’), но тоже не работает (
только с вашей статьей получилось все сделать. спасибо!
Приветствую! Есть шаблон для вывода пользовательских типов записей у меня archive-products.php а для категорий этого типа записей как сделать шаблон? Сейчас используется archive.php Спасибо!