Трусливый post type. Лучшие WordPress-плагины для работы с произвольными типами записей. Шаблон для создания нового типа записи

Создает новый тип записи или изменяет имеющийся.

С версии 4.6 был создан новый класс WP_Post_Type и весь код функции теперь обрабатывается этим классом, а эта функция стала оберткой для него.

Таксономии

Если для нового типа записи регистрируется таксономия, то всегда регистрируйте эту таксономию при регистрации типа записи, для этого используя параметр taxonomies . Если вы этого не сделаете, тип поста и таксономии не будут опознаны как связанные при срабатывании хуков, таких как: parse_query или pre_get_posts . Это может привести к неожиданным последствиям и ошибкам.

Таксономии нужно регистрировать отдельно. Таксономия указывается при регистрации типа записи, однако это только связь, регистрировать её нужно отдельно, с помощью register_taxonomy() .

Важно: после создания нового типа записи. Обязательно нужно зайти на страницу Настройки → Постоянные ссылки. Нужно это для того, чтобы правила ЧПУ были пересозданы и туда были добавлены правила нового типа записи.

Возвращает

WP_Post_Type объект (с версии 4.6).

Шаблон для создания нового типа записи
add_action("init", "register_post_types"); function register_post_types(){ register_post_type("post_type_name", array("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, // зависит от public // "exclude_from_search" => null, // зависит от public // "show_ui" => null, // зависит от public // "show_in_nav_menus" => null, // зависит от public "show_in_menu" => null, // показывать ли в меню адмнки // "show_in_admin_bar" => null, // зависит от show_in_menu "show_in_rest" => null, // добавить в REST API. C WP 4.7 "rest_base" => null, // $post_type. C WP 4.7 "menu_position" => null, "menu_icon" => null, //"capability_type" => "post", //"capabilities" => "post", // массив дополнительных прав для этого типа записи //"map_meta_cap" => null, // Ставим true чтобы включить дефолтный обработчик специальных прав "hierarchical" => false, "supports" => [ "title", "editor" ], // "title","editor","author","thumbnail","excerpt","trackbacks","custom-fields","comments","revisions","page-attributes","post-formats" "taxonomies" => , "has_archive" => false, "rewrite" => true, "query_var" => true,)); }

Использование

register_post_type($post_type, $args); $post_type(строка) (обязательный)

Название типа записи (максимум 20 символов). Может содержать только строчные символы, числа, _ или - : a-z0-9_- .

Зарезервированные названия для типов постов . Нельзя использовать следующие названия для новых типов постов, так как они используются WordPress и ваш код будет конфликтовать с текущим кодом или функциями WordPress:

Post page attachment revision nav_menu_item custom_css customize_changeset action author order theme $args(массив) Массив аргументов.
По умолчанию: array() (параметры по умолчанию)

Аргументы параметра $args

label(строка) Имя типа записи помеченное для перевода на другой язык.
По умолчанию: $post_type labels(массив)

Для неустановленных строк (т.е. по умолчанию), будут использованы:

  • Для не древовидных типов записей - названия "постов".
  • Для древовидных типов записей - названия "постоянных страниц".

В массиве можно указать следующие аргументы:

"name" => "", // основное название для типа записи, обычно во множественном числе. "singular_name" => "", // название для одной записи этого типа. "add_new" => "", // текст для добавления новой записи, как "добавить новый" у постов в админ-панели. // Если нужно использовать перевод названия, вписывайте подобным образом: _x("Add New", "product"); "add_new_item" => "", // текст заголовка у вновь создаваемой записи в админ-панели. Как "Добавить новый пост" у постов. "edit_item" => "", // текст для редактирования типа записи. По умолчанию: редактировать пост/редактировать страницу. "new_item" => "", // текст новой записи. По умолчанию: "Новый пост" "view_item" => "", // текст для просмотра записи этого типа. По умолчанию: "Посмотреть пост"/"Посмотреть страницу". "search_items" => "", // текст для поиска по этим типам записи. По умолчанию "Найти пост"/"найти страницу". "not_found" => "", // текст, если в результате поиска ничего не было найдено. // По умолчанию: "Постов не было найдено"/"Страниц не было найдено". "not_found_in_trash" => "", // текст, если не было найдено в корзине. По умолчанию "Постов не было найдено в корзине"/"Страниц // не было найдено в корзине". "parent_item_colon" => "", // текст для родительских типов. Этот параметр не используется для не древовидных типов записей. // По умолчанию "Родительская страница". "all_items" => "", // Все записи. По умолчанию равен menu_name "archives" => "", // Архивы записей. По умолчанию равен all_items "insert_into_item" => "", // Вставить в запись "uploaded_to_this_item" => "", // Загружено для этой записи "featured_image" => "", // Миниатюра записи "set_featured_image" => "", // Установить миниатюру записи "remove_featured_image" => "", // Удалить миниатюру записи "use_featured_image" => "", // Использовать как миниатюру записи "filter_items_list" => "", // Фильтровать список записей "items_list_navigation" => "", // Навигация по записям "items_list" => "", // Список записей "menu_name" => "", // Название меню. По умолчанию равен name. "name_admin_bar" => "", // Название в админ баре (тулбаре). По умолчанию равен singular_name. "view_items" => "", // Название в тулбаре, для страницы архива типа записей. По умолчанию: «View Posts» / «View Pages». С WP 4.7. "attributes" => "", // Название для метабокса атрибутов записи (у страниц это метабокс «Свойства страницы» - «Page Attributes»). // По умолчанию: «Post Attributes» или «Page Attributes». С WP 4.7. "item_updated" => "", // Текст заметки в редакторе записи при обновлении записи. С WP 5.0. // По умолчанию: «Post updated.» / «Page updated.» "item_published" => "", // Текст заметки в редакторе записи при публикации записи. С WP 5.0. // По умолчанию: «Post published.» / «Page published.» "item_published_privately" => "", // Текст заметки в редакторе записи при публикации private записи. С WP 5.0. // По умолчанию: «Post published privately.» / «Page published "item_reverted_to_draft" => "", // Текст заметки в редакторе записи при возврате записи в draft. С WP 5.0. // По умолчанию: «Post reverted to draft.» / «Page reverted to "item_scheduled" => "", // Текст заметки в редакторе записи при запланированной публикации на будущую дату. С WP 5.0. // По умолчанию: «Post scheduled.» / «Page scheduled.»

Для полного списка значений см. get_post_type_labels()

По умолчанию: если не установлено, name и singular_name примят значение аргумента label

Description(строка) Короткое описание этого типа записи. Значение используется в REST API. Значение можно получить с помощью функции get_the_post_type_description() .
По умолчанию: "" public(логический)

Определяет является ли тип записи публичным или нет. На основе этого параметра строятся много других, т.е. это своего рода пред-установка для следующих параметров:

    • show_ui = false - не показывать пользовательский интерфейс (UI) для этого типа записей
    • publicly_queryable = false - запросы относящиеся к этому типу записей не будут работать в шаблоне
    • exclude_from_search = true - этот тип записей не будет учитываться при поиске по сайту
    • show_in_nav_menus = false - этот тип записей будет спрятан из выбора меню навигации
  • true
    • show_ui = true
    • publicly_queryable = true
    • exclude_from_search = false
    • show_in_nav_menus = true
  • title - блок заголовка;
  • editor - блок для ввода контента;
  • author - блок выбора автора;
  • thumbnail блок выбора миниатюры записи. Нужно также включить поддержку в установке темы post-thumbnails ;
  • excerpt - блок ввода цитаты;
  • trackbacks - включает поддержку трекбеков и пингов (за блоки не отвечает);
  • custom-fields - блок установки произвольных полей;
  • comments - блок комментариев (обсуждение);
  • revisions - блок ревизий (не отображается пока нет ревизий);
  • page-attributes - блок атрибутов постоянных страниц (шаблон и древовидная связь записей, древовидность должна быть включена).
  • post-formats – блок форматов записи, если они включены в теме.

По умолчанию: array("title","editor")

Register_meta_box_cb(строка) callback функция, которая будет срабатывать при установки мета блоков для страницы создания/редактирования этого типа записи. Используйте remove_meta_box() и add_meta_box() в callback функции.
По умолчанию: нет taxonomies(массив)

Массив зарегистрированных таксономий, которые будут связаны с этим типом записей, например: category или post_tag .

Связать таксономии с записью можно позднее через функцию register_taxonomy_for_object_type() .

Таксономии нужно регистрировать с помощью функции register_taxonomy() .

Этот параметр позволяет указать, какую группу конечных точек мы хотим подключить к создаваемому типу записи (к URL записи). Например, если указать "permalink_epmask" = EP_PAGES & EP_TAGS , то наш тип записи будет иметь все дополнительные варианты URL (конечные точки), которые предусмотрены для постоянных страниц и меток.

По умолчанию permalink_epmask = EP_PERMALINK - это означает, что в URL создаваемого типа записи (в правила ЧПУ) будут добавлены конечные точки, которые добавляются к обычным записям WordPress: пагинация, страница комментов и т.д.

Если не нужно добавлять никаких конечных точек к новому типу записи, то нужно указать EP_NONE . Или наоборот, указываем EP_ALL , когда нужно добавить все конечные точки.

По умолчанию: EP_PERMALINK

Has_archive(строка/логический)

Включить поддержку страниц архивов для этого типа записей (пр. УРЛ записи выглядит так: site.ru/type/post_name , тогда УРЛ архива будет такой: site.ru/type .

Если указать строку, то она будет использована в ЧПУ. Например, укажем тут typepage и получим ссылку на архив типа записи такого вида: site.ru/typepage .
Файл этого архива в теме будет иметь вид archive-type.php . Для архивов будет добавлено новое правило ЧПУ, если аргумент rewrite включен.
По умолчанию: false

Rewrite(массив/логический)

Использовать ли ЧПУ для этого типа записи. Чтобы не использовать ЧПУ укажите false. По умолчанию: true - название типа записи используется как префикс в ссылке. Можно в массиве указать дополнительные параметры для построения ЧПУ:

    slug (строка)
    Префикс в ЧПУ (/префикс/ярлык_записи). Используйте array("slug" => $slug) , чтобы создать другой префикс.
    В этом параметре можно указывать плейсхолдеры типа %category% . Но их нужно создать с помощью add_rewrite_tag() и научить WP их понимать.
    По умолчанию: название типа записи

    with_front (логический)
    Нужно ли в начало вставлять общий префикс из настроек. Префикс берется из $wp_rewite->front . Например, если структура постоянных ссылок записей в настройках имеет вид blog/%postname% , то при false получим: /news/название_поста, а при true получим: /blog/news/название_поста.
    По умолчанию: true

    feeds (логический)
    Добавить ли правило ЧПУ для RSS ленты этого типа записи.
    По умолчанию: значение аргумента has_archive

  • pages (логический)
    Добавить ли правило ЧПУ для пагинации архива записей этого типа. Пр: /post_type/page/2 .
    По умолчанию: true

По умолчанию: true (тип записи используется как префикс)

Query_var(строка/логический)

Устанавливает название параметра запроса для создаваемого типа записи.

Ставим false, чтобы убрать возможность запросов.

  • false - отключает параметр запроса. Запись не будет доступна по URL: /?{query_var}={post_slug} .
  • string - указывает название параметра зпроса. /?{query_var_string}={post_slug} .

Заметка: query_var не имеет смысла, если параметр publicly_queryable = false .

Заметка: Этот параметр добавляет указанное значение (если не указано, то ярлык типа записи) в список разрешенных параметров WordPress, чтобы WordPress понимал этот параметр запроса, см. add_rewrite_tag() . WordPress удаляет любые параметры запроса, о которых он не знает.

Пример:
Допустим мы регаем тип записи book и указали в этом параметре строку bookname . Теперь, пройде на страницу книги по ссылке /book/harry-potter , в коде обрабатывающем эту страницу get_query_var("bookname") вернет harry-potter . А если бы мы ничего не указали в этом параметре (он был бы true), то чтобы получить harry-potter , нам нужно было бы использовать get_query_var("book") .

По умолчанию: true - устанавливается аргумент $post_type

Can_export(логический) Возможность экспорта этого типа записей.
По умолчанию: true delete_with_user(логический)

  • true - удалять записи этого типа принадлежащие пользователю при удалении пользователя. Если включена корзина, записи не удаляться, а поместятся в корзину.
  • false - при удалении пользователя его записи этого типа никак не будут обрабатываться.
  • null - записи удаляться или будут перемещены в корзину, если post_type_supports("author") установлена. И не обработаются, если поддержки "author" у типа записи нет.
// $tax_slug = get_term_parents_list($term_id, $tax_name, array("separator" => "/", "format" => "slug", "link" => false, "inclusive" => true,));

Также важно, чтобы при реге типа записи, параметр hierarchical был false !

#3 Добавление таксономии в ЧПУ (у записи и таксы одинаковый префикс)

Этот пример показывает как создать запись типа Вопросы и разделы для нее. При этом ЧПУ будут:

  • У записи: site.ru/faq/{категория}/{ярлык-записи}
  • У таксы: site.ru/faq/{категория}

Тут важно сначала регнуть таксу, а потом тип записи...

Add_action("init", "register_faq_post_type"); function register_faq_post_type() { // Раздел вопроса - faqcat register_taxonomy("faqcat", array("faq"), array("label" => "Раздел вопроса", // определяется параметром $labels->name "labels" => array("name" => "Разделы вопросов", "singular_name" => "Раздел вопроса", "search_items" => "Искать Раздел вопроса", "all_items" => "Все Разделы вопросов", "parent_item" => "Родит. раздел вопроса", "parent_item_colon" => "Родит. раздел вопроса:", "edit_item" => "Ред. Раздел вопроса", "update_item" => "Обновить Раздел вопроса", "add_new_item" => "Добавить Раздел вопроса", "new_item_name" => "Новый Раздел вопроса", "menu_name" => "Раздел вопроса",), "description" => "Рубрики для раздела вопросов", // описание таксономии "public" => true, "show_in_nav_menus" => false, // равен аргументу public "show_ui" => true, // равен аргументу public "show_tagcloud" => false, // равен аргументу show_ui "hierarchical" => true, "rewrite" => array("slug"=>"faq", "hierarchical"=>false, "with_front"=>false, "feed"=>false), "show_admin_column" => true, // Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5))); // тип записи - вопросы - faq register_post_type("faq", array("label" => "Вопросы", "labels" => array("name" => "Вопросы", "singular_name" => "Вопрос", "menu_name" => "Архив вопросов", "all_items" => "Все вопросы", "add_new" => "Добавить вопрос", "add_new_item" => "Добавить новый вопрос", "edit" => "Редактировать", "edit_item" => "Редактировать вопрос", "new_item" => "Новый вопрос",), "description" => "", "public" => true, "publicly_queryable" => true, "show_ui" => true, "show_in_rest" => false, "rest_base" => "", "show_in_menu" => true, "exclude_from_search" => false, "capability_type" => "post", "map_meta_cap" => true, "hierarchical" => false, "rewrite" => array("slug"=>"faq/%faqcat%", "with_front"=>false, "pages"=>false, "feeds"=>false, "feed"=>false), "has_archive" => "faq", "query_var" => true, "supports" => array("title", "editor"), "taxonomies" => array("faqcat"),)); } ## Отфильтруем ЧПУ произвольного типа // фильтр: apply_filters("post_type_link", $post_link, $post, $leavename, $sample); add_filter("post_type_link", "faq_permalink", 1, 2); function faq_permalink($permalink, $post){ // выходим если это не наш тип записи: без холдера %products% if(strpos($permalink, "%faqcat%") === false) return $permalink; // Получаем элементы таксы $terms = get_the_terms($post, "faqcat"); // если есть элемент заменим холдер if(! is_wp_error($terms) && !empty($terms) && is_object($terms)) $term_slug = array_pop($terms)->slug; // элемента нет, а должен быть... else $term_slug = "no-faqcat"; return str_replace("%faqcat%", $term_slug, $permalink); }

Заметки

Плагин для реги типа записи

Есть удобный плагин, который позволяет регистрировать новые типы записей (постов) и новые таксономии: Custom Post Type UI

Переименование заголовков типа записи

Если тип записи уже зарегистрирован, но нам нужно назвать его как-то иначе, используйте следующий код.

Этот код показывает, как переименовать стандартный тип записи "Записи" в "Статьи":

## заменим слово «записи» на «статьи» //$labels = apply_filters("post_type_labels_{$post_type}", $labels); add_filter("post_type_labels_post", "rename_posts_labels"); function rename_posts_labels($labels){ // заменять автоматически не пойдет например заменили: Запись = Статья, а в тесте получится так "Просмотреть статья" /* оригинал stdClass Object ("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" => "", "all_items" => "Все записи", "archives" => "Архивы записей", "insert_into_item" => "Вставить в запись", "uploaded_to_this_item" => "Загруженные для этой записи", "featured_image" => "Миниатюра записи", "set_featured_image" => "Задать миниатюру", "remove_featured_image" => "Удалить миниатюру", "use_featured_image" => "Использовать как миниатюру", "filter_items_list" => "Фильтровать список записей", "items_list_navigation" => "Навигация по списку записей", "items_list" => "Список записей", "menu_name" => "Записи", "name_admin_bar" => "Запись",) */ $new = 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" => "", "all_items" => "Все статьи", "archives" => "Архивы статей", "insert_into_item" => "Вставить в статью", "uploaded_to_this_item" => "Загруженные для этой статьи", "featured_image" => "Миниатюра статьи", "filter_items_list" => "Фильтровать список статей", "items_list_navigation" => "Навигация по списку статей", "items_list" => "Список статей", "menu_name" => "Статьи", "name_admin_bar" => "Статью", // пункте "добавить"); return (object) array_merge((array) $labels, $new); }

Очень дешевые, но качественные подписчики в Инстаграме доступны по адресу https://doctorsmm.com/ . Тут Вы сможете найти любое предложение персонально для Вашего аккаунта. На сайте представлено широкое разнообразие качества добавляемых страниц и скоростной режим, а также действует таргетирование аудитории по географическому признаку.

Заметки

  • Global. Массив. $wp_post_types List of post types.

Список изменений

С версии 2.9.0 Введена.
С версии 3.0.0 The show_ui argument is now enforced on the new post screen.
С версии 4.4.0 The show_ui argument is now enforced on the post type listing screen and post editing screen.
С версии 4.6.0 Post type object returned is now an instance of WP_Post_Type .
С версии 4.7.0 Introduced show_in_rest , rest_base and rest_controller_class arguments to register the post type in REST API.

Код register post type : wp-includes/post.php WP 5.2.3

20) { _doing_it_wrong(__FUNCTION__, __("Post type names must be between 1 and 20 characters in length."), "4.2.0"); return new WP_Error("post_type_length_invalid", __("Post type names must be between 1 and 20 characters in length.")); } $post_type_object = new WP_Post_Type($post_type, $args); $post_type_object->add_supports(); $post_type_object->add_rewrite_rules(); $post_type_object->register_meta_boxes(); $wp_post_types[ $post_type ] = $post_type_object; $post_type_object->add_hooks(); $post_type_object->register_taxonomies(); /** * Fires after a post type is registered. * * @since 3.3.0 * @since 4.6.0 Converted the `$post_type` parameter to accept a `WP_Post_Type` object. * * @param string $post_type Post type. * @param WP_Post_Type $post_type_object Arguments used to register the post type. */ do_action("registered_post_type", $post_type, $post_type_object); return $post_type_object; }

На сегодняшнем уроке мы познакомимся с понятием custom post type , а также научимся создавать свой кастомный post type и шаблон для него. Custom post type это одно из основных направлений в WordPress , с которым работают разработчики.

В WordPress-е блоге посты и страницы - все это post type и чтобы расширить функционал, разработчику нужно добавлять новые post type . Например у вас сайт для продажи книг, вы же не будете публиковать эти книги, как блог-посты. Для этого вы создадите новый post type с названием "book" , у которого будет свой внешний вид, свой шаблон и свои настройки.

Сегодня мы создадим свой post type под названием "book" , который будет иметь кастомный шаблон для публичного поста и для страницы с архивами. Давайте сначала ознакомимся с документацией WordPress - Codex/Post Type . Первым делом в кодексе перечислены все названия в (Default Post Types) , которые мы не можем использовать при регистрации новых названий постов.

Для создания кастомных постов в WordPress существует специальная функция - register_post_type() . Разберем на примере ниже.

Функция register_post_type подключается к ядру WordPress-а при помощи другой функции-хука - add_action . Хук это крючок, за который мы цепляем нашу функцию к ядру WordPress , который при инициализации своих функций, добавляет и нашу.

Давайте попробуем зарегистрировать наш post type , скопируем кусок кода из примера выше и вставим его в файл function.php , стартовой темы underscore , которую мы установили на прошлом уроке и назвали my_theme - "Файлы темы Wordpress" . Сделать это можно через админку WordPress-а в теме, Внешний вид / Редактор , открываете файл function.php и вставляете код из кодекса внизу документа.

Разберем подробнее этот код. WordPress регистрирует post type при помощи функции register_post_type . В круглых скобках передаются параметры, первый параметр acme_product - это id нового типа поста, который мы меняем на свой book .

Register_post_type("book",

За ним идет параметр, который получает эта функция, это массив настроек, в примере их всего три, а в документации гораздо больше. Переименуем "Products" на "books" , а "Product" на "book" .

Array(
"labels" => array(
"name" => __("books"),
"singular_name" => __("book")
),

Public означает, что пост публичный, его видят все и он попадает в архив has_archive .

"public" => true,
"has_archive" => true,
)

Обязательно выше кода пропишите комментарии, что это за код, чтобы самим потом не забыть, зачем вы туда его поставили.

/**
* My blog custome code.
*/

Сохраняем пост идем в консоль админки и видим новый тип поста book , однако он с минимальным количеством настроек.

На странице codex вы увидите полный список настроек. Нам надо добавить возможность добавления превью-картинки, передадим в массиве параметр "thumbnail" . Кроме того, вернем назад title и editor .

"supports" => array("title", "editor", "thumbnail"),

Точно так же можно добавлять и другие настройки из документации. Рекомендуется для пользовательских названий, в том числе и для post type применять префиксы (my_book) , чтобы избежать конфликта с другими плагинами, ведь названия могут совпасть. Для избежания ошибок WordPress рекомендует все вами разработанные функции, переменные, id , классы и константы прописывать с префиксами.

Кастомный шаблон для нового post type

Создадим два поста в новом типе записей book с названиями Book 1 и Book 2 и откроем сайт по адресу http://my_blog.com/book/.

Мы видим, что загрузился нами созданный post type book , а не дефолтный post type WordPress-а , но загружаются все равно старый archive.php , а нам надо создать свой, вместо дефолтного. Мы хотим, чтобы книги не находились в блог постах, а выглядели иначе, без типичной блоговой структуры. Создадим пустой файл archive-book.php и подключим к нему шапку,

get_header();
?>

get_footer();
?>

и сделаем вывод контента в цикле, скопировав код из раздела документации Post_Types , заменив "product" на "book" .

$args = array("post_type" => "book", "posts_per_page" => 10);
$loop = new WP_Query($args);
while ($loop->have_posts()) : $loop->the_post();
the_title();
echo "

";
the_content();
echo "
";
endwhile;
?>

Аналогичный действия надо сделать и для файла single.php .

Общеизвестно, что контент является основным компонентом любого веб-сайта. WordPress предлагает по умолчанию несколько видов контента, нацеленных больше на блоговую или новостную ориентацию. Однако для создания сайтов с иной, нестандартной, структурой (например, интернет-магазины или сайты, предоставляющие какие-либо услуги) необходимо создавать свои типы, отвечающие заданным критериям, добавляя гибкости для дальнейшего расширения ресурса.

Что такое произвольные типы записей в WordPress?

Весь контент сайта “движок” хранит и выводит в виде так называемых записей, каждая из которых относится к определенному типу. Например, Страница относится к типу записей “page ”, а блоговый пост – “post ”. Это стандартные типы данных WordPress, которые уже присутствуют в свежеустановленной копии “движка”. Произвольный же тип – это сгенерированный вручную новый тип контента. В момент его объявления в системе будет зарегистрирован новый тип записей. Приведем примеры случаев, когда необходимо создавать произвольный тип данных:

  • Books (книги),
  • Organizations (организации),
  • People (люди),
  • Products (продукты),
  • Places (места) и др.

Зачем создавать свой тип записей WordPress?

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

В каких случаях стоит создавать произвольный тип записей?

Обычно создание произвольного типа записей необходимо для контента, вывод которого не вписывается в рамки встроенных типов (Записей и Страниц ). Более того, новый тип позволит добавить к записям нужные опции (например, имена, адреса, телефонные номера и пр.)

Плагины для работы с произвольными типами записей

Произвольные (нестандартные) типы записей в WordPress можно создать двумя путями: с помощью плагина или вручную. Последний способ является наиболее трудоемким, так как предусматривает хорошую подготовленность пользователя в языках программирования. Мы же рассмотрим более легкий вариант, решающий ту же задачу, но более простым методом – через админ-интерфейс, не требуя каких-либо знаний в программировании. Для этого разработаны и успешно применяются специальные плагины. Познакомимся с наиболее популярными из них.

Плагин Custom Post Type UI

Дополнение Custom Post Type UI обеспечивает пользователю простой и понятный интерфейс для создания и управления произвольными типами данных в WordPress. Среди основных его преимуществ можно выделить:

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

Плагин Custom Post Type UI также имеет негативные стороны, особенно для начинающего WordPress-пользователя:

  • созданные через плагин типы записей придется вручную добавлять в темы;
  • довольно скудное описание возможностей;
  • отсутствие возможности добавления произвольных полей.

Плагин Toolset Types

Плагин Toolset Types , в отличии от предыдущего, позволит Вам добавить произвольные поля и таксономии (категоризацию). Среди его основных возможностей:

  • поддержка расширенных возможностей произвольных типов;
  • возможность управления доступом к полям, которые могут редактировать и просматривать пользователи;
  • наличие всплывающих подсказок по сложным возможностям;
  • возможность создания отношений “родительский – дочерний элементы” между любыми типами;
  • присутствие возможности экспорта/импорта для данных плагина;
  • мультиязычность;
  • возможность повторения всех полей.

Существенным минусом плагина, особенно для начинающих пользователей, является неудобство в работе, поскольку произвольные типы записей и произвольные поля представлены на разных экранах панели администратора.

Плагин Custom Post Types and Custom Fields creator – WCK

WCK Custom Post Type Creator – очередной плагин для создания и управления произвольными типами записей WordPress, обеспечивающий удобный и понятный интерфейс. Плюсы дополнения:

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

Плагин Custom Post Type Maker

Custom Post Type Maker – WordPress-плагин, позволяющий создавать произвольные типы записей и таксономии с максимальным удобством для пользователя. Решение полностью интегрировано с WordPress API и обеспечивает поддержку практически всех параметров Custom Post Type API . Имеет ряд преимуществ:

  • наличие продуманного интерфейса с отдельными секциями Post Types и Taxonomies ;
  • присутствие интерфейса для управления произвольными типами записей, такими как обычные записи и страницы;
  • предоставляет все необходимые возможности для создания и управления произвольными типами записей;
  • обеспечивает возможность задавать практически все параметры Custom Post Type API .

Среди недостатков плагина можно выделить отсутствие возможности вывода произвольных типов записей и таксономий.

Плагин CPT-onomies

CPT-onomies – плагин для создания произвольных типов записей, совместимый с мультисайтами в WordPress. Позволяет создавать мощные таксономии и отношения между записями. Среди преимуществ можно выделить:

  • возможность использования таксономий;
  • возможность создания отношений между записями;
  • поддержка регистрации других произвольных типов записей, создаваемых плагинами и темами WordPress;
  • полная поддержка мультисайтов. Есть возможность регистрации произвольных типов записей и таксономий по всей сети или только для определенных сайтов.

Плагин давно не обновлялся, поэтому не так популярен между WordPress-пользователями.

Плагин MB Custom Post Type

Плагин MB Custom Post Type позволяет создавать произвольные типы записей и таксономии, обеспечивая легкое управление ими, благодаря понятному интерфейсу. Среди плюсов дополнения можно выделить следующие:

  • поддержка всех аргументов типа post ;
  • удобство в использовании;
  • поддержка режима live-редактирования, который автоматически заполняет все необходимые метки;
  • поддержка импорта/экспорта для созданных типов записей;
  • возможность расширения функционала при помощи аддонов.

Для работы MB Custom Post Type необходима установка плагина Meta Box .

Плагин Custom Post Type Generator

Custom Post Type Generator – простое и понятное решение, позволяющее генерировать произвольные типы записей из консоли WordPress. Плагин обеспечивает:

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

Недостатком Custom Post Type Generator является отсутствие вывода зарегистрированных типов записей и таксономий в списке редактируемых объектов.

Плагин Pods – Custom Content Types and Fields

С помощью плагина Pods Вы сможете создавать практически любой тип контента вне зависимости от его сложности. Благодаря удобному интерфейсу, можно легко управлять произвольными полями и типами контента. Преимущества решения:

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

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

Нашей статьи, посвященной созданию и использованию собственных типов записей, мы охватили суть пользовательских собственных типов записей в Wordpress, а также постарались начать работать над созданием собственных типов. Мы также осветили способы сохранения модульности за счет использования отдельного PHP-файла, что позволяет нам переносить типы записей от шаблона к шаблону.

Сегодня же мы хотим рассказать вам о процессе создания таксономии для собственных типов постов, а также о создании собственных полей и мета-блоков, о сохранении данных и использовании их в собственных шаблонах для Wordpress.

Давайте приступим!

Создание таксономии (для возможности сортировки по категории)

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

Для этого мы будем использовать Wordpress-функцию . Как вы можете видеть ниже и в codex.wordpress.org, аргументы, которые она принимает, это taxonomy, за которым следует тип объекта и, наконец, $args. Для нашего примера мы создали 2 таксономии – Skills и Club Level. Мы применяем таксономии к типу записей athlete, а затем задаем аргументы, включая ярлыки и переписываем привилегии. Давайте взглянем на код.

Register_taxonomy("Sport", array("athlete"), array("hierarchical" => true, "label" => "Sport", "singular_label" => "Sport", "rewrite" => true));
register_taxonomy("Club Level", array("athlete"), array("hierarchical" => true, "label" => "Club Level", "singular_label" => "Club Level", "rewrite" => true));
Зарегистрированные таксономии выглядят примерно следующим образом.

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

Закончили уже?

Хм, в целом, у вас уже есть собственный тип записи, который функционирует. Но на данный момент он ничем не отличается от обычных записей. Давайте окунемся в создание собственных полей для ваших записей, которые позволят вам указывать уникальную информацию, а затем отображать её в шаблонах.

Создание собственных полей

Для того чтобы начать творить настоящее волшебство с помощью собственных типов записей, для начала вам нужно будет инициализировать функцию для возможности добавлять мета-блоки. Нашу мы назовем admin_init(), и выглядеть она будет следующим образом:

Add_action("admin_init", "admin_init");

function admin_init(){
add_meta_box("personal_info", "Personal Info", "personal_info", "athlete", "normal", "low");
}
Первая часть нашего кода инициализирует функцию admin_init(). Понятно, что вторая часть данного кода представляет собой саму функцию. В целом, этот код сообщает вашему шаблону о необходимости создать новый мета-блок под названием «Personal Info», поместить его в тип записи athlete и затем дать ему низкий приоритет (расположение в типе записи).

Круто! Ну а теперь мы закончили?

Нет еще. Но уже совсем близко! Давайте добавим еще несколько собственных полей. Это больше относится к HTML, нежели к PHP.

Создание полей в собственных мета-блоках

А теперь начинается самое интересное. Мы собираемся создать мета-блок с личными данными (мы его уже сделали выше, а сейчас собираемся заполнить его), который будет спрашивать имя и фамилию человека, пол, адрес электронной почты, номер телефона и дату рождения.

Для того чтобы сделать это, мы создаем функцию под названием personal_info(). Та же функция, которую мы вызывали в функции admin_init(). А теперь, включаем свет? Все линии сходятся.

Категории по умолчанию используются только для постов. Однако в некоторых сценариях у вас может возникнуть желание использовать их с пользовательским типом постов. В этой статье мы расскажем вам как это можно сделать.

Способ с плагином

Для начинающих пользователей мы рекомендуем использовать Custom Post Type UI плагин, чтобы создать пользовательский тип постов. Используя этот плагин, у вас есть возможность ассоциировать пользовательский тип постов с любой встроенной или пользовательской таксономией, включая категории. После установки плагина зайдите в CPT UI » Add/Edit Post Types для того, чтобы создать новый пользовательский тип постов или отредактировать существующий.

Прокрутите вниз до Advanced Options и там вы увидите параметр Built in Taxnomies. Отметьте ячейку напротив категорий и сохраните свой тип постов.

Ручное добавление категорий для пользовательского типа постов

Если вы создали пользовательский тип постов, добавив код в файл functions.php, то вам придется изменить этот код, чтобы добавить категорию как поддерживаемую таксономию. Все, что от вас требуется, это добавить эту строчку в аргументы вашего пользовательского типа постов:

‘taxonomies’ => array(‘category’),

Не исключено, что у вас уже есть эта строка в коде с какой-нибудь другой пользовательской таксономией. Если это так, то вам надо просто добавить запятую после нее и добавить категорию:

‘taxonomies’ => array(‘topics’, ‘category’),

Вот пример целого кода, где мы создали пользовательский тип постов под названием «фильмы» с поддержкой всех встроенных категорий.

Function custom_post_type() { // Set UI labels for Custom Post Type $labels = array("name" => _x("Movies", "Post Type General Name", "twentythirteen"), "singular_name" => _x("Movie", "Post Type Singular Name", "twentythirteen"), "menu_name" => __("Movies", "twentythirteen"), "parent_item_colon" => __("Parent Movie", "twentythirteen"), "all_items" => __("All Movies", "twentythirteen"), "view_item" => __("View Movie", "twentythirteen"), "add_new_item" => __("Add New Movie", "twentythirteen"), "add_new" => __("Add New", "twentythirteen"), "edit_item" => __("Edit Movie", "twentythirteen"), "update_item" => __("Update Movie", "twentythirteen"), "search_items" => __("Search Movie", "twentythirteen"), "not_found" => __("Not Found", "twentythirteen"), "not_found_in_trash" => __("Not found in Trash", "twentythirteen"),); // Set other options for Custom Post Type $args = array("label" => __("movies", "twentythirteen"), "description" => __("Movie news and reviews", "twentythirteen"), "labels" => $labels, "supports" => array("title", "editor", "excerpt", "author", "thumbnail", "comments", "revisions", "custom-fields",), "hierarchical" => false, "public" => true, "show_ui" => true, "show_in_menu" => true, "show_in_nav_menus" => true, "show_in_admin_bar" => true, "menu_position" => 5, "can_export" => true, "has_archive" => true, "exclude_from_search" => false, "publicly_queryable" => true, "capability_type" => "page", // This is where we add taxonomies to our CPT "taxonomies" => array("category"),); // Registering your Custom Post Type register_post_type("movies", $args); } /* Hook into the "init" action so that the function * Containing our post type registration is not * unnecessarily executed. */ add_action("init", "custom_post_type", 0);

Отображение нескольких типов постов на странице категории

По умолчанию страницы категории на сайте WordPress отображают стандартный тип постов. Если хотите, чтобы ваш тип постов отображался бы на той же странице категорий, что и посты по умолчанию, то вам надо добавить следующий код в файл functions.php:

Add_filter("pre_get_posts", "query_post_type"); function query_post_type($query) { if(is_category()) { $post_type = get_query_var("post_type"); if($post_type) $post_type = $post_type; else $post_type = array("nav_menu_item", "post", "movies"); // don"t forget nav_menu_item to allow menus to work! $query->set("post_type",$post_type); return $query; } }

Не забудьте поменять movies на название своего пользовательского типа постов.

Наша специальность - разработка и поддержка сайтов на WordPress. Контакты для бесплатной консультации - ,