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

Что такое пользовательские(произвольные) типы постов Wordpress?

Помимо стандартных типов постов(запись, страница, вложения и др.) в WordPress позволяет создавать собственные типы записей. В данной системе управления контентом их называют пользовательские или произвольные типы записей(постов).

Их обычно создают для специфических сайтов, вроде интернет магазинов, веб-ресурсов по продаже и аренде недвижимости, сервисов по обзору фильмов и т. д.

Как создать пользовательский тип записи?

Рекомендуется скрипт регистрации своего типа поста оформлять в виде плагина, чтобы в дальнейшем можно было сменить тему с сохранением данной функции.

Однако зарегистрировать произвольный тип записи можно в functions.php с помощью функции register_post_type().

// Регистрация нового типа записей 

add_action('init', 'sfc_register_custom_post_type');
function sfc_register_custom_post_type() {
/*Названия заголовков в панели управления для произвольного типа записи*/
	$labels = [
		'name' => 'Недвижимость',
		'singular_name' => 'Недвижимость',
		'add_new' => 'Добавить объект',
		'add_new_item'       => 'Добавить новый объект',
		'edit_item'          => 'Редактировать объект',
		'new_item'           => 'Новый объект',
		'view_item'          => 'Посмотреть объект',
		'search_items'       => 'Найти объект',
		'not_found'          =>  'Объект не найден',
		'not_found_in_trash' => 'В корзине объектов не найдено',
		'parent_item_colon'  => '',
		'menu_name'          => 'Недвижимость',
	];
	$args = [
		'labels' => $labels,
		'public' => true,
		'menu_icon' => 'dashicons-admin-multisite',
		'has_archive' => true,
		'taxonomies' => array('sfc-type-property'), 
		'rewrite' => array('slug' => 'property'), 
		'supports' => array('title','editor','thumbnail', 'except', 'custom-fields','revisions'),
	];

	register_post_type('sfc-property', $args);
}

Вызывать функцию register_post_type() надо в момент запуска события init.

Функция принимает 2 параметра: $post_type — название нового типа записи(не более 20 символов) и $args — массив аргументов.

Добавляйте префикс(напр. sfc- )в начале названия типа записи, чтобы $post_type был уникальным для сайта.

Если вам необходимо для типа поста зарегистрировать таксономию, укажите в параметре 'taxonomies' массив с их значениями. Собственные таксономии надо также зарегистрировать.

Если Вы хотите изменить в URL название ярлык( в нашем примере 'sfc-property') на свой(например, 'property') добавьте параметр 'rewrite'.

Файлы шаблонов для пользовательского типа записи?

Для произвольных типов постов можно создать конкретные файлы шаблонов:

    • single-{post_type}.php – показывает отдельную запись произвольного типа
    • archive-{post_type}.php – показывает архив записей произвольного типа

Для нашего типа поста 'sfc-property', файлы шаблонов будут иметь названия single-sfc-property.php и archive-sfc-property.php. Если этих ФШ не будет, то WP по иерархии шаблонов будет использовать single.php и archive.php либо index.php в случае отсутствия архива.

Запрос для пользовательского типа записи

Чтобы получить объект с постами произвольного типа, нужно передать post_type в конструктор класса WP_Query.

Здесь скрипт выводит просматривает 10 последний записей типа 'product' и выводит заголовок и содержимое по одному.

$args = [
    'post_type'      => 'product',
    'posts_per_page' => 10,
];
$loop = new WP_Query($args);
while ($loop->have_posts()) {
    $loop->the_post();
    ?>
    
<div class="entry-content">
        <?php the_title(); ?>
        <?php the_content(); ?>
    </div>

    <?php
}

Изменение основного запроса

Следует знать, что при регистрации своего типа записи WP не добавляет их в основной запрос. Это означает, что они не отображаются на главной странице, архивной и не участвуют в поиске. Чтобы включить новый тип записи в основной запрос, надо включить их в методе set.

Этот код позволяет показывать на главной странице записи, страницы и произвольные посты 'movie'.

function wporg_add_custom_post_types($query)
{
    if (is_home() && $query->is_main_query()) {
        $query->set('post_type', ['post', 'page', 'movie']);
    }
    return $query;
}
add_action('pre_get_posts', 'wporg_add_custom_post_types');

Источник: https://developer.wordpress.org/plugins/post-types/registering-custom-post-types/
https://developer.wordpress.org/plugins/post-types/working-with-custom-post-types/
https://developer.wordpress.org/themes/template-files-section/custom-post-type-template-files/