Создание кастомного тип постов в Wordpress

В Wordpress всем известны следующие стандартные типы материалов:
  • запись
  • страница
  • медиавложение
Зачастую ограничиться этим списком бывает сложно, если на сайте необходимо выводить какой-нибудь материал с особыми полями, шаблонами оформления, инструментами и т.д. Мне, например, захотелось в своем шаблоне сделать особый тип материалов "Рецепт". По сути, это точно такая же "Запись", но с дополнительными полями, куда можно вносить ингредиенты, шаги инструкции и т.д. с последующей разметкой schema.org. Кроме того, под посты типа "Рецепт" я могу создать файл шаблона а-ля single-recipe.php, и страницы именно с рецептами будут выглядеть несколько иначе, чем обычные новости или страницы сайта.

Как зарегистрировать новый тип поста - register_post_type

Проходим в файл functions.php, и где-нибудь там в удобном месте вставляем это:

add_action('init', 'register_post_types');
function register_post_types(){
 register_post_type('recipe', array( // вместо recipe название вашего типа поста
  'label'  => null,
  'labels' => array(
   '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'          => 'Рецепты',
  ),
  'description'         => '',
  'public'              => true,
  'publicly_queryable'  => null,
  'exclude_from_search' => false,
  'show_ui'             => null,
  'show_in_menu'        => true,
  'show_in_admin_bar'   => null,
  'show_in_nav_menus'   => null,
  'show_in_rest'        => null,
  'rest_base'           => null,
  'menu_position'       => 5,
  'menu_icon'           => null, 
  'hierarchical'        => false,
  'supports'            => array('title','editor','thumbnail','excerpt','custom-fields','comments'),
  'taxonomies'          => array('category','post_tag'),
  'has_archive'         => true,
  'rewrite'             => true,
  'query_var'           => true,
 ) );
}
Аргументов, как можно заметить, очень много. Использовать все необязательно, но знать их возможности желательно. Полный список аргументов и их функции можно узнать здесь
После этого обязательно проходим в Настройки - Постоянные ссылки, и ничего не меняя нажимаем сохранить, чтобы произошла перезапись.

Важные моменты

  • С помощью аргумента taxonomies новый тип постов связан с существующей таксономией - категориями и тегами. При необходимости можно создать также кастомную таксономию специально под кастомные записи. Но это уже другая тема.
  • После создания нового типа записей в меню админки должен появиться пункт с новым типом записей, где их собственного и можно будет создавать.
Для кастомных типов нельзя использовать названия, зарезервированные WP -
  • postpageattachmentrevisionnav_menu_item
  • actionordertheme
Чтобы вообще все было красиво, можно в functions также добавить следующие кусочки:

Этот удаляет slug кастомного типа записей в URL записей. (Если устраивает slug в ссылках, можно оставить как есть и не добавлять это в functions)
function true_post_type_rewrite() {
global $wp_rewrite;
// параметры add_rewrite_tag('%название_тега%', '%маска_символов%', '%url_параметр%')
$wp_rewrite->add_rewrite_tag("%recipe%", '([^/]+)', "recipe="); //название тега - slug записей, у меня recipe
$wp_rewrite->add_permastruct('recipe', '%recipe%' );
}
add_action( 'init', 'true_post_type_rewrite');
А этот добавляет новые кастомные записи в основной цикл Wordpress, чтобы они появлялись в категориях, на главной и в любых других листингах, которые формируются циклом.
function true_rewrite_conflicts( $request ) {
if(!is_admin())
$request['post_type'] = array('recipe', 'post', 'page', 'blog', 'doctors'); // перечисляем типы записей с подобной структурой пермалинков
return $request;
}
add_filter( 'request',  'true_rewrite_conflicts' );

Комментарии

Отправить комментарий

Популярные сообщения из этого блога

Легенда об Андрогинах

Меняем форму комментирования Wordpress - удаляем поле URL, label полей и надпись "Ваш email не будет опубликован"