От автора: Дни, когда WordPress был просто системой для блогов, прошли. Возможность расширения функционала с помощью плагинов и тем, группировка постов, структурирование данных по типам, а также появление в ядре WP Rest API привели к эволюционированию WordPress в полномасштабную систему управления контентом и платформу разработки.
За эти годы я успешно создал большое количество кастомных веб-приложений на новейших версиях WordPress, в которых по полной использовались кастомные типы постов. Примером может послужить сайт theme marketplace моего плагина для WordPress ProfilePress.
Если подробнее присмотреться к магазину тем по ссылке выше, можно заметить, что на нем используется кастомная система постраничной навигации на основе URL ссылок для следующей и предыдущей страниц. Т.е. можно создать свою систему постраничной навигации, которая отлично будет работать с запросами постов пользовательских типов.
Ну хватит долгих речей, перейдем к основной цели данного урока – изучению всех тонкостей пользовательских типов в WordPress.
Надеюсь, мы решим множество проблем, с которыми я лично столкнулся при работе с кастомными типами постов, а также рассмотрим другие крутые возможности.

Бесплатный курс «Создание тем на WordPress. Быстрый старт»
Изучите курс и узнайте, как создавать уникальные темы на WordPress с нестандартной структурой страниц
Скачать курсОпределение пользовательского типа постов
WordPress может хранить и отображать множество различных типов контента. Одна часть данного контента называется постом, хотя пост сам по себе является специфическим типом постов. «Все типы постов хранятся в одном месте, в таблице wp_posts базы данных, но посты различаются по колонке post_type»
Post type относится к различным структурированным данным, сгруппированным вместе, и которые обслуживаются в базе данных WordPress в таблице posts.
Примером типа постов служит тип post (группа постов из блога), page (группа страниц), attachment (группа загружаемых медиа файлов), а также revision (группа редакций постов). Все эти типы родные или встроенные в WordPress. Зная, что такое тип поста, можно создать и зарегистрировать новый тип, который будет относиться к кастомным типам постов.
Если вы создаете сайт для компании или бизнеса на WordPress, то типами постов могут быть Portfolio, Testimonials и Products. Теперь, когда мы разобрались с концепцией пользовательских типов постов, давайте научимся их создавать.
Как создать пользовательский тип постов
Создать пользовательский тип постов довольно просто. Сперва, необходимо зарегистрировать тип при помощи функции register_post_type(), затем поместить его в функцию и прикрепить все это к экшену init:
1 2 3 4 5 6 7 8 9 10 11 |
function portfolio_cpt() { $args = array( 'label' => 'Portfolio', 'public' => true, ); register_post_type( 'portfolio', $args ); } add_action( 'init', 'portfolio_cpt' ); |
В коде выше можно заметить, что второй параметр функции register_post_type() принимает массив из нескольких обязательных аргументов, которые нужны для создания пользовательского типа поста. Созданный тип Portfolio можно посмотреть в панели администратора.
Необходимо также сказать, что в функции register_post_type() второй аргумент необязательный. Пользовательский тип постов можно создать и по-другому:
1 2 3 4 5 6 |
function portfolio_cpt() { register_post_type( 'portfolio' ); } add_action( 'init', 'portfolio_cpt' ); |
Если создать тип, как показано выше, то он не будет отображаться в панели администратора (хотя к нему по-прежнему можно обратиться по ссылке //example.com/wp-admin/edit.php?post_type=portfolio“), название также не будет отображаться (label), а уведомления администратора будут такими же, как и для встроенных типов постов. Пробежимся по аргументам массива настройки пользовательских типов и по соответствующим функциям.
Label
Множественное описательное имя типа. К примеру, если создать тип movie, то он должен называться Movies. По умолчанию стоит $post_type – первый параметр в функции register_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: Текст отображается, когда в корзине нет постов.
Полный список лейблов и их описаний можно найти по ссылке.
Description
Краткое описание типа поста. Я не нашел, где в WordPress можно это задействовать.
Public
В зависимости от Булева значения оно автоматически решит, какие должны быть аргументы, если они не заданы. Если вы хотите контролировать публичные аргументы, можно задать три аргумента:
show_ui: задает, отображать ли экраны панели администратора.
publicly_queryable: задает, можно ли выполнить запросы по этому типу постов со стороны пользователя.
exclude_from_search: должны ли посты появляться в результатах поиска.
menu_position
По умолчанию новый тип постов добавляется после пункта меню «Комментарии» в панели администратора. Но есть возможность передвинуть данный новый пункт меню. К примеру, если задать menu_position значение 70, то ваш пункт меню окажется ниже пункта «Пользователи».
menu_icon
Новым типам постов присваиваются иконки по умолчанию, но если вы хотите указать свои иконки, добавьте адрес к иконке к значению данного лейбла.
1 |
'menu_icon' => get_stylesheet_directory_uri() . '/images/portfolio-icon.png', |
В качестве иконок для пользовательских типов постов можно использовать dashicon. Скажем, вы хотите использовать иконку download dashicon, для этого присвойте лейблу ниже значение dashicons-download:

Бесплатный курс «Создание тем на WordPress. Быстрый старт»
Изучите курс и узнайте, как создавать уникальные темы на WordPress с нестандартной структурой страниц
Скачать курс
1 |
'menu_icon' => 'dashicons-download', |
Hierarchical
С помощью этого аргумента можно задавать иерархию для новых типов. По умолчанию стоит значение false. Если установить true, новые типы станут иерархическими.
Supports
С помощью этого аргумента можно задать массив мета боксов и полей, которые будут появляться на экране во время редактирования или создания нового поста. По умолчанию стоит title и editor. Если задать false, отключится стандартное поведение. Есть несколько возможных опций:
title: Поле ввода текста для создания заголовка поста.
editor: TinyMCE редактор для написания текста поста.
author: Выпадающий список, где можно сменить автора поста.
thumbnail: встроенные изображения.
excerpt: Область textarea для отрывка поста.
trackbacks: включение и отключение трекбеков и пингбеков.
custom-fields: кастомные поля input.
comments: включение или отключение комментариев.
revisions: Возможность редакции постов.
post-formats: Добавляет форматы постов
page-attributes: Атрибуты страницы. Важный параметр для иерархических типов постов, можно выбрать родительский пост.
register_meta_box_cb
Добавляет колбэк функцию, которая вызывается при установке мета боксов для формы редактирования. Функция принимает один аргумент $post, в котором хранится объект WP_Post текущего редактируемого поста. Функция особенно полезна для разработчиков. С ее помощью можно создавать пользовательские мета боксы, которые будут отображаться на экране редактирования типа.
1 |
'register_meta_box_cb' => 'metabox_callback_func', |
Taxonomies
Массив зарегистрированных таксономий, таких как category или post_tag, которые будут использоваться с кастомным типом постов.
1 |
'taxonomies' => array( 'post_tag', 'category '), |
has_archive
Если установить данный аргумент в true, к кастомным типам постов добавятся архивы. К примеру, новый тип books, если зайти на страницу //yoursite.com/books, то отобразится список постов по типу books.
Rewrite
С помощью данного аргумента при просмотре одного поста или архива можно задать структуру ссылок данного типа. По умолчанию стоит true и используется переменная $post_type. Чтобы отключить перезапись, необходимо установить данный параметр в false. Для полной ясности разберем пару примеров. Скажем, вы создали новый тип постов review и хотите изменить URL с review на assessment. Аргумент для перезаписи ниже изменит URL с //example.com/review/harry-potter/ на //example.com/assessment/harry-potter/ для конкретного поста и //example.com/review/ на //example.com/assessment/ для архива данного типа.
1 2 3 4 |
'rewrite' => array( 'slug' => 'assessment', 'with_front' => false ), |
Всегда при изменении URL в WordPress сохраняйте изменения в панели Настройки >> ссылки для повторного создания правил перезаписи. Параметр slug отвечает за URL, а with_front задает будет структуру ссылки. Все еще не поняли для чего нужен with_front? Разберем пример. Скажем, структура вашей ссылки точно такая же как на изображении ниже с надписью blog на конце.
Если with_front равен false, URL конкретного поста и архива будут выглядеть //example.com/blog/assessment/harry-potter/ и //example.com/blog/assessment соответственно, но если задать true, то ссылки к посту и к архиву будут следующие //example.com/assessment/harry-potter/ и //example.com/assessment/. Заметили, что в последних ссылках нет blog? Вот в этом разница.
can_export
С помощью данного аргумента можно задать, можно ли экспортировать посты кастомного типа через инструменты WordPress. По умолчанию стоит true.
query_var
С помощью данного аргумента можно контролировать переменные запроса, используемые для получения постов данного типа.
Если задано true, вы сможете запросить кастомный тип book по ссылке example.com/?book=harry-potter, где harry-potter это параметр slug ссылки. Если задать строку, а не true, можно написать так: example.com/?publication=harry-potter.
Нюанс с query_var
Если query_var не задан в аргументе массива регистрации типа, по умолчанию устанавливается значение $post_type, т.е. данный параметр задан всегда, если его принудительно не установить в false.
И тут есть один нюанс. Если значение query_var добавить через строку запроса в URL, всегда будет выдаваться страница 404. Тут нужно прояснить. Скажем, значение query_var равно review, то URL вашего сайта можно указать в любой из следующих форм:
//example.com/?review=some-random-string
//example.com/a-post-slug-here/?review=some-random-string
//example.com/a-post-slug-here/?foo=bar&review=some-random-string
Эти ссылки приведут вас на странице 404. Об этом я узнал по собственному горькому опыту. Когда я столкнулся с этой проблемой я создал тему на WordPress core trac и сообщил об ошибке. У меня ушло несколько недель на то, чтобы разобраться с этой проблемой перед тем, как мне ответила команда WordPress.
Ускоряем настройку пользовательских типов постов с помощью плагинов
Теперь, когда мы разобрались с основами, стоит сказать о том, что существует масса плагинов для WordPress, с помощью которых можно сильно упростить процесс создания кастомных типов постов. Примеры (не все):
Custom Post Type UI
Pods Framework
Custom Post Type Maker
Заключение
В этом уроке мы узнали, что такое пользовательские типы постов и как их создавать. Эта первая статья из серии о кастомных типах постов в WordPress. В следующем уроке мы научимся настраивать различные уведомления в панели администратора, узнаем, как регистрировать кастомные таксономии к определенным типам постов и как добавлять вкладку контекстной справки на экран пользовательского типа постов.
Автор: Agbonghama Collins
Источник: //www.sitepoint.com/
Редакция: Команда webformyself.

Бесплатный курс «Создание тем на WordPress. Быстрый старт»
Изучите курс и узнайте, как создавать уникальные темы на WordPress с нестандартной структурой страниц
Скачать курс
Создание тем на WordPress. Быстрый старт
Изучите курс и узнайте, как создать тему на WordPress
Смотреть
Комментарии (1)