Иногда требуется выделить определенные записи, создав для них отдельный раздел. Например, уже стала обычной практика создания на базе блога раздела портфолио, в котором размещаются работы. Такие записи обычно публикуют в отдельном разделе, и даже их оформление отличается от других записей. Создаются такие особые публикации с помощью пользовательских типов записей, работу с которыми поддерживает 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 Спасибо!