Register post type


Недавно один из наших читателей спросил, возможно ли добавить рубрики произвольным типам записей. Рубрики — один из видов встроенных таксономий в WordPress. По-умолчанию, они появляются только у записей. Однако, в некоторых случаях вам может понадобиться назначить их другим, произвольным типам записей. В этой статье мы покажем вам как добавить рубрики для произвольных типов записей в WordPress. Также мы покажем как вывести различные типы записей на страницу архива рубрики.

categoriesforcpts[1]

Реализация с помощью плагина

Для новичков рекомендуется использовать плагин Custom Post Type UI для создания произвольных типов записей. При использовании этого плагина у вас будет опция для ассоциации вашего произвольного типа записей с любой встроенной или произвольной таксономией, включая рубрики.

Первым делом вам необходимо установить и активировать плагин Custom Post Type UI

После установки переходим в CPT UI » Add/Edit Post Types для создания нового типа записи или редактирования существующего, созданного этим плагином.


editposttypes[1]

Прокручиваем страницу к Advanced Options и видим опцию Built in Taxnomies. Отмечаем галочку рядом с рубриками и сохраняем тип записи.

enablecategoriesforcpt[1]

Не забудьте нажать на кнопку «save post type» для сохранения изменений.

Добавляем рубрики произвольному типу записей вручную

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

Все, что вам нужно сделать, это добавить следующую строку в параметры своего ПТЗ (произвольного типа записи).

  'taxonomies' => array( 'category' ),  

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


  'taxonomies'		 => array('topics', 'category' ),  

Ниже представлен полный пример кода, где мы создали произвольный тип записи под названием Movies, который будет поддерживать встроенные рубрики.

  function custom_post_type() {    // Указываем метки UI для произвольного типа записи  	$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' ),  	);    // Задаем опции для произвольного типа записи    	$args = array(  		'label' => __( 'movies', 'twentythirteen' ),  		'description' => __( 'Movie news and rev.  

able' => true, 'capability_type' => 'page', // Вот здесь мы добавим таксономии в наш ПТЗ 'taxonomies' => array( 'category' ), ); // Регистрируем произвольный тип записи register_post_type( 'movies', $args ); } 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');   $query->set('post_type',$post_type);   return $query;   }  }  

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

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

wpincode.com


Полное руководство по пользовательским типам постов в WordPress

От автора: Дни, когда WordPress был просто системой для блогов, прошли. Возможность расширения функционала с помощью плагинов и тем, группировка постов, структурирование данных по типам, а также появление в ядре WP Rest API привели к эволюционированию WordPress в полномасштабную систему управления контентом и платформу разработки.

За эти годы я успешно создал большое количество кастомных веб-приложений на новейших версиях WordPress, в которых по полной использовались кастомные типы постов. Примером может послужить сайт theme marketplace моего плагина для WordPress ProfilePress.

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


Ну хватит долгих речей, перейдем к основной цели данного урока – изучению всех тонкостей пользовательских типов в WordPress.

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

Определение пользовательского типа постов

WordPress может хранить и отображать множество различных типов контента. Одна часть данного контента называется постом, хотя пост сам по себе является специфическим типом постов. «Все типы постов хранятся в одном месте, в таблице wp_posts базы данных, но посты различаются по колонке post_type»

Post type относится к различным структурированным данным, сгруппированным вместе, и которые обслуживаются в базе данных WordPress в таблице posts.

Примером типа постов служит тип post (группа постов из блога), page (группа страниц), attachment (группа загружаемых медиа файлов), а также revision (группа редакций постов). Все эти типы родные или встроенные в WordPress. Зная, что такое тип поста, можно создать и зарегистрировать новый тип, который будет относиться к кастомным типам постов.

Если вы создаете сайт для компании или бизнеса на WordPress, то типами постов могут быть Portfolio, Testimonials и Products. Теперь, когда мы разобрались с концепцией пользовательских типов постов, давайте научимся их создавать.


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

Создать пользовательский тип постов довольно просто. Сперва, необходимо зарегистрировать тип при помощи функции register_post_type(), затем поместить его в функцию и прикрепить все это к экшену init:

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

Register post type

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

Если создать тип, как показано выше, то он не будет отображаться в панели администратора (хотя к нему по-прежнему можно обратиться по ссылке http://example.com/wp-admin/edit.php?post_type=portfolio“), название также не будет отображаться (label), а уведомления администратора будут такими же, как и для встроенных типов постов. Пробежимся по аргументам массива настройки пользовательских типов и по соответствующим функциям.

Label

Множественное описательное имя типа. К примеру, если создать тип movie, то он должен называться Movies. По умолчанию стоит $post_type – первый параметр в функции register_post_type().

Labels

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


Полный список лейблов и их описаний можно найти по ссылке.

Description

Краткое описание типа поста. Я не нашел, где в WordPress можно это задействовать.

Public

В зависимости от Булева значения оно автоматически решит, какие должны быть аргументы, если они не заданы. Если вы хотите контролировать публичные аргументы, можно задать три аргумента:

menu_position

По умолчанию новый тип постов добавляется после пункта меню «Комментарии» в панели администратора. Но есть возможность передвинуть данный новый пункт меню. К примеру, если задать menu_position значение 70, то ваш пункт меню окажется ниже пункта «Пользователи».

menu_icon

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

В качестве иконок для пользовательских типов постов можно использовать dashicon. Скажем, вы хотите использовать иконку download dashicon, для этого присвойте лейблу ниже значение dashicons-download:

Hierarchical

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

Supports

С помощью этого аргумента можно задать массив мета боксов и полей, которые будут появляться на экране во время редактирования или создания нового поста. По умолчанию стоит title и editor. Если задать false, отключится стандартное поведение. Есть несколько возможных опций:


register_meta_box_cb

Добавляет колбэк функцию, которая вызывается при установке мета боксов для формы редактирования. Функция принимает один аргумент $post, в котором хранится объект WP_Post текущего редактируемого поста. Функция особенно полезна для разработчиков. С ее помощью можно создавать пользовательские мета боксы, которые будут отображаться на экране редактирования типа.

Taxonomies

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

has_archive

Если установить данный аргумент в true, к кастомным типам постов добавятся архивы. К примеру, новый тип books, если зайти на страницу http://yoursite.com/books, то отобразится список постов по типу books.

Rewrite

С помощью данного аргумента при просмотре одного поста или архива можно задать структуру ссылок данного типа. По умолчанию стоит true и используется переменная $post_type. Чтобы отключить перезапись, необходимо установить данный параметр в false. Для полной ясности разберем пару примеров. Скажем, вы создали новый тип постов review и хотите изменить URL с review на assessment. Аргумент для перезаписи ниже изменит URL с http://example.com/review/harry-potter/ на http://example.com/assessment/harry-potter/ для конкретного поста и http://example.com/review/ на http://example.com/assessment/ для архива данного типа.


Всегда при изменении URL в WordPress сохраняйте изменения в панели Настройки >> ссылки для повторного создания правил перезаписи. Параметр slug отвечает за URL, а with_front задает будет структуру ссылки. Все еще не поняли для чего нужен with_front? Разберем пример. Скажем, структура вашей ссылки точно такая же как на изображении ниже с надписью blog на конце.

Register post type

Если with_front равен false, URL конкретного поста и архива будут выглядеть http://example.com/blog/assessment/harry-potter/ и http://example.com/blog/assessment соответственно, но если задать true, то ссылки к посту и к архиву будут следующие http://example.com/assessment/harry-potter/ и http://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 вашего сайта можно указать в любой из следующих форм:

Эти ссылки приведут вас на странице 404. Об этом я узнал по собственному горькому опыту. Когда я столкнулся с этой проблемой я создал тему на WordPress core trac и сообщил об ошибке. У меня ушло несколько недель на то, чтобы разобраться с этой проблемой перед тем, как мне ответила команда WordPress.

Ускоряем настройку пользовательских типов постов с помощью плагинов

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

Заключение

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

Автор: Agbonghama Collins

Источник: http://www.sitepoint.com/

Редакция: Команда webformyself.

Register post type

webformyself.com

function register_custom_post_types()  {   /* Register custom post types   *****************************/   register_post_type('news', array('public' => true, 'publicly_queryable' => true, 'has_archive' => true, 'hierarchical' => false, 'menu_icon' => get_stylesheet_directory_uri() . '/images/news-icon.png', 'labels' => array('name' => _x('Новости', 'post type general name'), 'singular_name' => _x('Новость', 'post type singular name'), 'add_new' => _x('Добавить новую', 'Новость'), 'add_new_item' => __('Добавить новую новость'), 'edit_item' => __('Редактировать новость'), 'new_item' => __('Новая новость'), 'view_item' => __('Посмотреть новость'), 'search_items' => __('Поиск новостей'), 'not_found' => __('Новостей не найдено'), 'not_found_in_trash' => __('Новостей не найдено в корзине'), 'parent_item_colon' => ''), 'show_ui' => true, 'menu_position' => 5, 'show_in_nav_menus' => false, 'query_var' => true, 'rewrite' => true, 'rewrite' => array('slug' => 'nitem', 'with_front' => FALSE), 'register_meta_box_cb' => 'news_add_box', 'supports' => array('title', 'thumbnail', 'excerpt', 'editor', 'author', 'comments')));   register_post_type('banners', array('public' => true, 'publicly_queryable' => true, 'has_archive' => false, 'hierarchical' => false, 'menu_icon' => get_stylesheet_directory_uri() . '/images/banners-icon.png', 'labels' => array('name' => _x('Баннеры', 'post type general name'), 'singular_name' => _x('Баннер', 'post type singular name'), 'add_new' => _x('Добавить новый', 'Баннер'), 'add_new_item' => __('Добавить новый баннер'), 'edit_item' => __('Редактировать баннер'), 'new_item' => __('Новый баннер'), 'view_item' => __('Посмотреть баннер'), 'search_items' => __('Поиск баннеров'), 'not_found' => __('Баннеры не найдены'), 'not_found_in_trash' => __('Корзина пуста'), 'parent_item_colon' => ''), 'show_ui' => true, 'menu_position' => 5, 'show_in_nav_menus' => false, 'query_var' => true, 'rewrite' => true, 'rewrite' => array('slug' => 'banners', 'with_front' => FALSE), 'supports' => array('title')));   register_post_type('ads', array('public' => true, 'publicly_queryable' => true, 'has_archive' => true, 'hierarchical' => false, 'menu_icon' => get_stylesheet_directory_uri() . '/images/adsa_icon.png', 'labels' => array('name' => _x('Объявления', 'post type general name'), 'singular_name' => _x('Объявление', 'post type singular name'), 'add_new' => _x('Добавить новое', 'Объявление'), 'add_new_item' => __('Добавить новое объявление'), 'edit_item' => __('Редактировать объявление'), 'new_item' => __('Новое объявление'), 'view_item' => __('Посмотреть объявление'), 'search_items' => __('Поиск объявлений'), 'not_found' => __('Объявления не найдены'), 'not_found_in_trash' => __('Корзина пуста'), 'parent_item_colon' => ''), 'show_ui' => true, 'menu_position' => 5, 'show_in_nav_menus' => false, 'query_var' => true, 'rewrite' => true, 'rewrite' => array('slug' => 'ads', 'with_front' => FALSE), 'register_meta_box_cb' => 'ads_add_box', 'supports' => array('title', 'thumbnail', 'editor', 'author', 'comments')));   register_post_type('catalog', array('public' => true, 'publicly_queryable' => true, 'has_archive' => true, 'hierarchical' => false, 'menu_icon' => get_stylesheet_directory_uri() . '/images/catalog_icon.png', 'labels' => array('name' => _x('Справочник', 'post type general name'), 'singular_name' => _x('Организация', 'post type singular name'), 'add_new' => _x('Добавить организацию', 'Организация'), 'add_new_item' => __('Добавить новую организацию'), 'edit_item' => __('Редактировать организацию'), 'new_item' => __('Новая организация'), 'view_item' => __('Посмотреть организацию'), 'search_items' => __('Поиск организаций'), 'not_found' => __('Организации не найдены'), 'not_found_in_trash' => __('Корзина пуста'), 'parent_item_colon' => ''), 'show_ui' => true, 'menu_position' => 5, 'show_in_nav_menus' => false, 'query_var' => true, 'rewrite' => true, 'rewrite' => array('slug' => 'catalog', 'with_front' => FALSE), 'register_meta_box_cb' => 'cat_add_box', 'supports' => array('title', 'thumbnail', 'editor', 'author', 'comments')));   register_post_type('people', array('public' => true, 'publicly_queryable' => true, 'has_archive' => true, 'hierarchical' => false, 'menu_icon' => get_stylesheet_directory_uri() . '/images/drs-icon.png', 'labels' => array('name' => _x('Врачи', 'post type general name'), 'singular_name' => _x('Врач', 'post type singular name'), 'add_new' => _x('Добавить врача', 'врач'), 'add_new_item' => __('Добавить нового врача'), 'edit_item' => __('Редактировать запись'), 'new_item' => __('Новый врач'), 'view_item' => __('Посмотреть запись'), 'search_items' => __('Поиск врача'), 'not_found' => __('Записи не найдены'), 'not_found_in_trash' => __('Корзина пуста'), 'parent_item_colon' => ''), 'show_ui' => true, 'menu_position' => 5, 'show_in_nav_menus' => false, 'query_var' => true, 'rewrite' => true, 'register_meta_box_cb' => 'pl_add_box', 'rewrite' => array('slug' => 'people', 'with_front' => FALSE), 'supports' => array('title', 'editor', 'thumbnail', 'comments')));   /*Новости АВТОМАБИЛКИ начало*/   register_post_type('som', array('public' => true, 'publicly_queryable' => true, 'has_archive' => true, 'hierarchical' => false, 'menu_icon' => get_stylesheet_directory_uri() . '/images/car-icon.png', 'labels' => array('name' => _x('Somicadze', 'post type general name'), 'singular_name' => _x('Som', 'post type singular name'), 'add_new' => _x('Добавить запись', 'новость'), 'add_new_item' => __('Добавить новую запись'), 'edit_item' => __('Редактировать запись'), 'new_item' => __('Новая запись'), 'view_item' => __('Посмотреть запись'), 'search_items' => __('Поиск записей'), 'not_found' => __('Запись не найдена'), 'not_found_in_trash' => __('Корзина пуста'), 'parent_item_colon' => ''), 'show_ui' => true, 'menu_position' => 6, 'show_in_nav_menus' => false, 'query_var' => true, 'rewrite' => true, 'rewrite' => array('slug' => 'somnews', 'with_front' => FALSE), 'supports' => array('title', 'thumbnail', 'excerpt', 'editor', 'author', 'comments')));   /* Register custom taxonomies   *****************************/   $labelsTags = array('name' => _x('Метки', 'taxonomy general name'), 'singular_name' => _x('Метки', 'taxonomy singular name'), 'search_items' => __('Поиск меток'), 'all_items' => __('Все метки'), 'edit_item' => __('Редактировать метку'), 'update_item' => __('Обновить метку'), 'add_new_item' => __('Добавить новую метку'), 'new_item_name' => __('Новая метка'));   register_taxonomy('ntag', array('news'), array('hierarchical' => false, 'labels' => $labelsTags, 'show_ui' => 'radio', 'show_in_nav_menus' => false, 'query_var' => true, 'rewrite' => array('slug' => 'ntag')));   $labelsCat = array('name' => _x('Рубрики новостей', 'taxonomy general name'), 'singular_name' => _x('Рубрика', 'taxonomy singular name'), 'search_items' => __('Поиск рубрик'), 'all_items' => __('Все рубрики'), 'parent_item' => __('Родительская рубрика'), 'parent_item_colon' => __('Родительская рубрика:'), 'edit_item' => __('Редактировать рубрику'), 'update_item' => __('Обновить рубрику'), 'add_new_item' => __('Добавить новую рубрику'), 'new_item_name' => __('Новая рубрика'));   register_taxonomy('ncategory', array('news'), array('hierarchical' => true, 'labels' => $labelsCat, 'show_ui' => 'radio', 'query_var' => true, 'rewrite' => array('slug' => 'ncategory')));   $labelsLoc = array('name' => _x('Регионы', 'taxonomy general name'), 'singular_name' => _x('Регион', 'taxonomy singular name'), 'search_items' => __('Поиск региона'), 'all_items' => __('Все регионы'), 'parent_item' => __('Родительский регион'), 'parent_item_colon' => __('Родительский регион:'), 'edit_item' => __('Редактировать регион'), 'update_item' => __('Обновить регион'), 'add_new_item' => __('Добавить новый регион'), 'new_item_name' => __('Новый регион'));   register_taxonomy('nlocation', array('news', 'ads', 'catalog'), array('public' => true, 'hierarchical' => true, 'labels' => $labelsLoc, 'query_var' => 'nlocation', 'show_ui' => true, 'rewrite' => array('slug' => 'nlocation', 'with_front' => false)));   $labelsAdsCat = array('name' => _x('Категории объявлений', 'taxonomy general name'), 'singular_name' => _x('Категория', 'taxonomy singular name'), 'search_items' => __('Поиск категории'), 'all_items' => __('Все категории'), 'parent_item' => __('Родительская категория'), 'parent_item_colon' => __('Родительская категория:'), 'edit_item' => __('Редактировать категорию'), 'update_item' => __('Обновить категорию'), 'add_new_item' => __('Добавить новую категорию'), 'new_item_name' => __('Новая категория'));   register_taxonomy('adscategory', 'ads', array('public' => true, 'hierarchical' => true, 'labels' => $labelsAdsCat, 'query_var' => 'adscategory', 'show_ui' => true, 'rewrite' => array('slug' => 'adscategory', 'with_front' => false)));   $labelsCatalogCat = array('name' => _x('Разделы справочника', 'taxonomy general name'), 'singular_name' => _x('Раздел', 'taxonomy singular name'), 'search_items' => __('Поиск разделов'), 'all_items' => __('Все разделы'), 'parent_item' => __('Родительский раздел'), 'parent_item_colon' => __('Родительский раздел:'), 'edit_item' => __('Редактировать раздел'), 'update_item' => __('Обновить раздел'), 'add_new_item' => __('Добавить новый раздел'), 'new_item_name' => __('Новый раздел'));   register_taxonomy('catcategory', 'catalog', array('public' => true, 'hierarchical' => true, 'labels' => $labelsCatalogCat, 'query_var' => 'catcategory', 'show_ui' => true, 'rewrite' => array('slug' => 'catcategory', 'with_front' => false)));   $labelsMedicalNewsCat = array('name' => _x('Тип', 'taxonomy general name'), 'singular_name' => _x('Тип', 'taxonomy singular name'), 'search_items' => __('Поиск типов'), 'all_items' => __('Все типы'), 'parent_item' => __('Родительский пункт'), 'parent_item_colon' => __('Родительский пункт:'), 'edit_item' => __('Редактировать'), 'update_item' => __('Обновить'), 'add_new_item' => __('Добавить новый'), 'new_item_name' => __('Новый'));   register_taxonomy('medcat', 'medicalnews', array('public' => true, 'hierarchical' => true, 'show_in_nav_menus' => false, 'labels' => $labelsMedicalNewsCat, 'query_var' => 'medcat', 'show_ui' => true, 'rewrite' => array('slug' => 'medcat', 'with_front' => false)));   $labelsSomCat = array('name' => _x('Разделы', 'taxonomy general name'), 'singular_name' => _x('Раздел', 'taxonomy singular name'), 'search_items' => __('Поиск разделов'), 'all_items' => __('Все разделы'), 'parent_item' => __('Родительский пункт'), 'parent_item_colon' => __('Родительский пункт:'), 'edit_item' => __('Редактировать'), 'update_item' => __('Обновить'), 'add_new_item' => __('Добавить новый'), 'new_item_name' => __('Новый'));   register_taxonomy('somcat', 'som', array('public' => true, 'hierarchical' => true, 'show_in_nav_menus' => false, 'labels' => $labelsSomCat, 'query_var' => 'somcat', 'show_ui' => true, 'rewrite' => array('slug' => 'somcat', 'with_front' => false)));  }

hotexamples.com

Доброго времени суток, дорогие хабравчане, я уже много лет делаю сайты на wordpress и решил поделится своим опытом. Мне сильно порадовала новость ранее опубликованная aleksandrit, о том что "WordPress используется уже на более чем 50 миллионах сайтов", это новость вдохновляет все больше изучать глубокие и скрытые возможности WordPress. Ранее подобная тема уже была опубликована bRuzом но я бы хотел подойти к вопросу иначе, шаг за шагом.

И так начнем с очевидного.

Зачем нужны custum post type

Главная цель custum post type позволить разработчику организовать данные на сайте. например: если речь идет о блоге, то у нас есть несколько типов данных(записи, медиафайлы, страницы и ссылки). Но что делать тем у кого сайт посвящен? новинкам кино индустрии? подобному сайту понадобится такой тип записей как «Обзор», у обзора должны быть такие характеристики как: жанр, год выпуска, обложка, актеры и т.д… Использования custum post type в отличие от обычных записей, дает нам возможность использовать эти данные в шаблоне, а так же искать по определенным параметрам и сортировать.

Начнем создавать

Для того чтоб создать новый тип записи нам понадобится редактировать файл functions.php который находится в директории используемого шаблона.


function create_post_type() { // создаем новый тип записи
register_post_type( 'reviews', // указываем названия типа
array(
'labels' => array(
'name' => __( 'Обзоры' ), // даем названия разделу, для панели управления
'singular_name' => __( 'Обзор' ) // даем названия одной записи
),
'public' => true,
'menu_position' => 5, // указываем место в левой баковой панели
'rewrite' => array('slug' => 'reviews') // указываем slug для ссылок например: http://mysite/reviews/
)
);
}

add_action( 'init', 'create_post_type' ); // инициируем добавления типа

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

image

Как мы видим на этой картинке у нас появились пару проблем. заголовок все еще остался таким «Добавить запись» и нету возможности добавить обложку. Попробуем это исправить, для этого нам понадобится добавить пару параметров (полный список параметров ищите в кодексе ).
function create_post_type() { // создаем новый тип записи
register_post_type( 'reviews', // указываем названия типа
array(
'labels' => array(
'name' => __( 'Обзоры' ), // даем названия разделу для панели управления
'singular_name' => __( 'Обзор' ), // даем названия одной записи
'add_new' => _x('Добавить новый'),// далее полная русификация админ. панели
'add_new_item' => __('Добавить новый обзор'),
'edit_item' => __('Редактировать обзор'),
'new_item' => __('Новый обзор'),
'all_items' => __('Все обзоры'),
'view_item' => __('Просмотр обзора'),
'search_items' => __('Поиск обзора'),
'not_found' => __('Нет обзоров'),
'not_found_in_trash' => __('обзоры не найдены'),
'menu_name' => 'Обзоры'

),
'public' => true,
'menu_position' => 5, // указываем место в левой баковой панели
'rewrite' => array('slug' => 'reviews'), // указываем slug для ссылок например: http://mysite/reviews/
'supports' => array('title', 'editor', 'thumbnail', 'revisions') // тут мы активируем поддержку миниатюр
)
);
}

add_action( 'init', 'create_post_type' ); // инициируем добавления типа

Результат:
image
И так, теперь мы полностью исправили русификацию и сделали возможным прикрепления миниатюр к нашему новому типу записи. теперь мы можем создать шаблон который будит показывать наши записи.

habr.com

Return Values

(WP_Post_Type | WP_Error
The registered post type object, or an error object.

Example

An example of registering a post type called «book».

Basic:

 function codex_custom_init() {  $args = array(  'public' => true,  'label' => 'Books'  );  register_post_type( 'book', $args ); } add_action( 'init', 'codex_custom_init' ); 

Elaborate:

 add_action( 'init', 'codex_book_init' ); /**  * Register a book post type.  *  * @link http://codex.wordpress.org/Function_Reference/register_post_type  */ function codex_book_init() { 	$labels = array( 		'name' => _x( 'Books', 'post type general name', 'your-plugin-textdomain' ), 		'singular_name' => _x( 'Book', 'post type singular name', 'your-plugin-textdomain' ), 		'menu_name' => _x( 'Books', 'admin menu', 'your-plugin-textdomain' ), 		'name_admin_bar' => _x( 'Book', 'add new on admin bar', 'your-plugin-textdomain' ), 		'add_new' => _x( 'Add New', 'book', 'your-plugin-textdomain' ), 		'add_new_item' => __( 'Add New Book', 'your-plugin-textdomain' ), 		'new_item' => __( 'New Book', 'your-plugin-textdomain' ), 		'edit_item' => __( 'Edit Book', 'your-plugin-textdomain' ), 		'view_item' => __( 'View Book', 'your-plugin-textdomain' ), 		'all_items' => __( 'All Books', 'your-plugin-textdomain' ), 		'search_items' => __( 'Search Books', 'your-plugin-textdomain' ), 		'parent_item_colon' => __( 'Parent Books:', 'your-plugin-textdomain' ), 		'not_found' => __( 'No books found.', 'your-plugin-textdomain' ), 		'not_found_in_trash' => __( 'No books found in Trash.', 'your-plugin-textdomain' ) 	);  	$args = array( 		'labels' => $labels,  'description' => __( 'Description.', 'your-plugin-textdomain' ), 		'public' => true, 		'publicly_queryable' => true, 		'show_ui' => true, 		'show_in_menu' => true, 		'query_var' => true, 		'rewrite' => array( 'slug' => 'book' ), 		'capability_type' => 'post', 		'has_archive' => true, 		'hierarchical' => false, 		'menu_position' => null, 		'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ) 	);  	register_post_type( 'book', $args ); } 

Customizing the messages:

 add_filter( 'post_updated_messages', 'codex_book_updated_messages' ); /**  * Book update messages.  *  * See /wp-admin/edit-form-advanced.php  *  * @param array $messages Existing post update messages.  *  * @return array Amended post update messages with new CPT update messages.  */ function codex_book_updated_messages( $messages ) { 	$post = get_post(); 	$post_type = get_post_type( $post ); 	$post_type_object = get_post_type_object( $post_type );  	$messages['book'] = array( 		0 => '', // Unused. Messages start at index 1. 		1 => __( 'Book updated.', 'your-plugin-textdomain' ), 		2 => __( 'Custom field updated.', 'your-plugin-textdomain' ), 		3 => __( 'Custom field deleted.', 'your-plugin-textdomain' ), 		4 => __( 'Book updated.', 'your-plugin-textdomain' ), 		/* translators: %s: date and time of the revision */ 		5 => isset( $_GET['revision'] ) ? sprintf( __( 'Book restored to revision from %s', 'your-plugin-textdomain' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 		6 => __( 'Book published.', 'your-plugin-textdomain' ), 		7 => __( 'Book saved.', 'your-plugin-textdomain' ), 		8 => __( 'Book submitted.', 'your-plugin-textdomain' ), 		9 => sprintf( 			__( 'Book scheduled for: <strong>%1$s</strong>.', 'your-plugin-textdomain' ), 			// translators: Publish box date format, see http://php.net/date 			date_i18n( __( 'M j, Y @ G:i', 'your-plugin-textdomain' ), strtotime( $post->post_date ) ) 		), 		10 => __( 'Book draft updated.', 'your-plugin-textdomain' ) 	);  	if ( $post_type_object->publicly_queryable && 'book' === $post_type ) { 		$permalink = get_permalink( $post->ID );  		$view_link = sprintf( ' <a href="%s">%s</a>', esc_url( $permalink ), __( 'View book', 'your-plugin-textdomain' ) ); 		$messages[ $post_type ][1] .= $view_link; 		$messages[ $post_type ][6] .= $view_link; 		$messages[ $post_type ][9] .= $view_link;  		$preview_permalink = add_query_arg( 'preview', 'true', $permalink ); 		$preview_link = sprintf( ' <a target="_blank" href="%s">%s</a>', esc_url( $preview_permalink ), __( 'Preview book', 'your-plugin-textdomain' ) ); 		$messages[ $post_type ][8] .= $preview_link; 		$messages[ $post_type ][10] .= $preview_link; 	}  	return $messages; } 

Adding contextual help:

 //display contextual help for Books  function codex_add_help_text( $contextual_help, $screen_id, $screen ) {  //$contextual_help .= var_dump( $screen ); // use this to help determine $screen->id  if ( 'book' == $screen->id ) {  $contextual_help =  '<p>' . __('Things to remember when adding or editing a book:', 'your_text_domain') . '</p>' .  '<ul>' .  '<li>' . __('Specify the correct genre such as Mystery, or Historic.', 'your_text_domain') . '</li>' .  '<li>' . __('Specify the correct writer of the book. Remember that the Author module refers to you, the author of this book review.', 'your_text_domain') . '</li>' .  '</ul>' .  '<p>' . __('If you want to schedule the book review to be published in the future:', 'your_text_domain') . '</p>' .  '<ul>' .  '<li>' . __('Under the Publish module, click on the Edit link next to Publish.', 'your_text_domain') . '</li>' .  '<li>' . __('Change the date to the date to actual publish this article, then click on Ok.', 'your_text_domain') . '</li>' .  '</ul>' .  '<p><strong>' . __('For more information:', 'your_text_domain') . '</strong></p>' .  '<p>' . __('<a href="http://codex.wordpress.org/Posts_Edit_SubPanel" target="_blank">Edit Posts Documentation</a>', 'your_text_domain') . '</p>' .  '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>', 'your_text_domain') . '</p>' ;  } elseif ( 'edit-book' == $screen->id ) {  $contextual_help =  '<p>' . __('This is the help screen displaying the table of books blah blah blah.', 'your_text_domain') . '</p>' ;  }  return $contextual_help; } add_action( 'contextual_help', 'codex_add_help_text', 10, 3 ); 

Adding WordPress 3.3+ Help Tab:

 function codex_custom_help_tab() {   $screen = get_current_screen();   // Return early if we're not on the book post type.  if ( 'book' != $screen->post_type )  return;   // Setup help tab args.  $args = array(  'id' => 'you_custom_id', //unique id for the tab  'title' => 'Custom Help', //unique visible title for the tab  'content' => '<h3>Help Title</h3><p>Help content</p>', //actual help text  );    // Add the help tab.  $screen->add_help_tab( $args );  }  add_action('admin_head', 'codex_custom_help_tab'); 

Flushing Rewrite on Activation

To get permalinks to work when you activate the plugin use the following example, paying attention to how my_cpt_init is called in the register_activation_hook callback:

 add_action( 'init', 'my_cpt_init' ); function my_cpt_init() {  register_post_type( ... ); }  function my_rewrite_flush() {  // First, we "add" the custom post type via the above written function.  // Note: "add" is written with quotes, as CPTs don't get added to the DB,  // They are only referenced in the post_type column with a post entry,   // when you add a post of this CPT.  my_cpt_init();   // ATTENTION: This is *only* done during plugin activation hook in this example!  // You should *NEVER EVER* do this on every page load!!  flush_rewrite_rules(); } register_activation_hook( __FILE__, 'my_rewrite_flush' ); 

For themes, you’ll need to use the after_switch_theme hook instead. Like so:

 add_action( 'init', 'my_cpt_init' ); function my_cpt_init() {  register_post_type( ... ); }  function my_rewrite_flush() {  my_cpt_init();  flush_rewrite_rules(); } add_action( 'after_switch_theme', 'my_rewrite_flush' ); 

Notes

  • Uses do_action():
    • Calls 'registered_post_type' with $post_type and $args.
  • Note that although the $public attribute is optional, the inputs passed to the register_post_type() function are exactly what is queried by the get_post_types() function. So if you verbosely set the equivalent options for publicly_queriable, show_ui, show_in_nav_menus, and exclude_from_search, this will not be handled the same as if you had set the $public attribute. See bug 18950.

Change Log

  • 4.7.0:
    • Added the `view_items` and `attributes` labels.
  • 4.6.0:
    • Post type object returned is now an instance of WP_Post_Type.
  • 4.4.0:
    • The `show_ui` argument is now enforced on the post type listing screen and post editing screen.
  • 3.5.0:
    • 'supports' argument can be set to Boolean false to disable default title and editor.
  • Since 2.9

Source File

register_post_type() is located in wp-includes/post.php.

Resources

  • Custom Post Types
  • Feeds for Custom Post Types (Trac 12943)
  • Discussion on wp-hackers about capabilities
  • Another discussion on wp-hackers about capabilities
  • Register Custom Post Types and Taxonomies the right way, so you have a reliable interconnection
  • Help file when registering post types
  • Unregister a post type

Generators

  • WordPress Post Type Generator
  • Custom Post Type Generator

Plugins

  • MB Custom Post Type plugin: Create and manage custom post types with UI
  • Create custom sorting for a post type
  • Types Plugin — Custom Post Types, Custom Taxonomy and Custom Fields
  • Custom Post Type UI Plugin
  • CMS Press
  • GD Custom Posts And Taxonomies Tools
  • Change Order for Custom Post Types in WordPress 4 and up
  • Custom Post Type Example

codex.wordpress.org

Стандартные типы записей WordPress

Каждый вид записи имеет свой уникальный идентификатор (название).

К стандартным типам записей относятся следующие из них:

Тип записи Уникальный идентификатор
Записи post
Страницы page
Вложения attachment
Ревизии revision
Меню nav_menu_item

Поговорим подробнее о каждом из них

Записи (идентификатор — post)

Данный вид записей является самым используемым и выполняет роль постов блога. Для него предусмотрены две предустановленные таксономии: категории или другое название рубрики (category) и тэги или другое название метки (post_tag). За вывод постов по умолчанию отвечает шаблон single.php

Записи

Страницы (идентификатор — page)

Страницы в целом похожи на обыкновенные записи, но не смотря на это имеют ряд различий:

  1. Страница считается статической единицей, т.е. она не принадлежит ни одной из таксономий;
  2. Страницы могут иметь иерархию. Это значит, что одна страница может быть родительской для другой/других страниц;
  3. Страницы могут иметь свой собственный шаблон вывода. Например, для страницы «Об авторе» может быть следующий шаблон вывода page-about-us.php. Для этого в начале шаблона нужно всего лишь добавить комментарий следующего вида.
    <?php /* Template Name: Об авторе */ ?>

    Далее в админ-панели выбирается нужный шаблон и все. Подробнее с созданием отдельных шаблонов вывода статических страниц Вы можете ознакомиться здесь;

  4. Страницы имеют встроенную возможность сортировки.

За вывод страниц по умолчанию отвечает шаблон page.php

Страницы

Вложения (идентификатор — attachment)

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

Вложения

Редакции (идентификатор — revision)

Редакции — это черновики. Они появляются в процессе обновления постов на блоге. Их предназначение определяется в восстановлении ранее написанных текстов. Также Вы можете при помощи хука wp_revisions_to_keep легко отключить их, путем добавления следующего кода в файл function.php Вашей темы (более подробно об отключении редакций можно прочесть здесь).

  <?php     function deactivate_revisions( $revisions )   {    return 0;  }  add_filter( 'wp_revisions_to_keep', 'deactivate_revisions' );     ?>  

Редакции

Меню (идентификатор — nav_menu_item)

Здесь объяснять особенно и нечего. Меню хранит информацию о всей навигации на Вашем сайте.

Что такое произвольный тип записей WordPress и где он может применяться

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

Register post type

Как мы видим, в админ-панели появился новый пункт меню «Магазин» с возможностью добавления новых товаров. Здесь и будут выводиться все наши добавленные товары, которые визуально отделены от общей массы всего контента. Кроме того, для данного типа записей мы с легкостью сможем добавить свои произвольные поля, например, для хранения той же цены. Конечно, можно было в обычных постах создать свою категорию и там хранить все товары, но на мой взгляд такой способ более удобен. К тому же, при таком подходе в обычных записях не будет лишних произвольных полей.

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

А теперь давайте научимся создавать произвольные типы записей. За их создание отвечает функция register_post_type($post_type, $args), которая принимает 2 параметра:

  • $post_type (строка, обязательный) — уникальный идентификатор произвольного типа записей. В нашем случае это будет идентификатор store;
  • $args — массив дополнительных аргументов.

В свою очередь функция register_post_type() цепляется за хук init. Ниже показан пример кода для создания произвольных типов записей.

  <?php     function prefix_register_name() { $labels = array( 'name' => __( 'Магазин', 'text-domain' ),//Основное название типа записей  		'singular_name' => __( 'Товары', 'text-domain' ),//Название для одной записи данного вида  		'add_new' => _x( 'Добавить товар', 'text-domain', 'text-domain' ),//Текст для добавления новой записи  		'add_new_item' => __( 'Добавить товар', 'text-domain' ),//Текст для добавления нового поста. Аналогична тексту "Добавить новый пост" у стандартных записей  		'edit_item' => __( 'Редактировать товар', 'text-domain' ),//Текст для редактирования записи  		'new_item' => __( 'Новый товар', 'text-domain' ),//Текст новой записи  		'view_item' => __( 'Просмотреть товар', 'text-domain' ),//Текст для просмотра записи  		'search_items' => __( 'Найти товар', 'text-domain' ),//Текст для кнопки поиска  		'not_found' => __( 'Товаров не найдено', 'text-domain' ),//Текст, если в результате поиска не была найдена ни одна запись  		'not_found_in_trash' => __( 'В корзине товаров нет', 'text-domain' ),//Текст, если в корзине нет записей  		'parent_item_colon' => __( 'Родительский товар:', 'text-domain' ),//Текст для родительских типов. Применяется для древовидных типов записей  		'menu_name' => __( 'Магазин', 'text-domain' ),//Текст пункта меню  	);    	$args = array(  		'labels' => $labels,//Массив, описанный выше  		'hierarchical' => false,//true - записи имеют древовидную структуру, false - записи имеют обычную структуру  		'description' => 'Магазин по продаже часов',//Описание типа записи  		'taxonomies' => array(),//Таксономии, с которыми нужно связать этот тип записей  		'public' => true,//true - публичный тип записей, false - не публичный тип записей  		'show_ui' => true,//Создавать ли логику управления данным типом записи в админ-панели  		'show_in_menu' => true,//Показывать ли тип записи в меню админ-панели  		'show_in_admin_bar' => true,//Делает тип записи доступным из меню  		'menu_position' => null,//Позиция расположения пункта меню в админ-панели  		'menu_icon' => null,//Иконка для пункта меню в админ-панели  		'show_in_nav_menus' => true,//Включить данный тип записи в навигацию, чтобы записи можно было выбирать в меню  		'publicly_queryable' => true,//true - запросы, относящиеся к этому типу записей будут работать на фронтенде сайта, false- нет  		'exclude_from_search' => false,//Исключить данный тип записи из поиска  		'has_archive' => true,//Нужна ли поддержка страниц архивов  		'query_var' => true,//Включает/Выключает возможность запросов  		'can_export' => true,//Можно ли экспортировать данный тип записей  		'rewrite' => true,//true - использовать ЧПУ для этого типа записей, false - нет  		'capability_type' => 'post',//Строка которая будет маркером для установки прав для этого типа записи. Встроенные маркеры это: post и page.  		'supports' => array(//Поля необходимые при создании данного типа записей  			'title',//блок заголовка  			'editor',//блок ввода контента  			'author',//возможность выбора автора поста  			'thumbnail',//блок миниатюры поста  			'excerpt',//поле ввода краткого описания поста (цитаты)  			'custom-fields',//произвольные поля  			'trackbacks',//блок уведомлений  			'comments',//блок комментариев поста  			'revisions',//ревизии поста  			'page-attributes',//атрибуты постоянных страниц  			'post-formats'//форматы записей, при условии, что они включены в теме  			)  	);    	register_post_type( 'store', $args );  }    ?>  

Этот код добавляем в файл functions.php Вашей темы и в админ-панели WordPress можно будет увидеть новый пункт меню с созданным Вами типом записей.

На этом все. Надеюсь, что данный материал стал для Вас полезным. Всем удачи!!!

wordpressrus.ru

Здравствуйте, уважаемые читатели XoZbloga! Система управления сайтом WordPress завоевала признание в течении нескольких лет, но настоящим прорывом стала реализация возможности разделять записи на типы. В этом уроке подробно рассмотрим пользовательские типы записей их создание и использование.

Немного истории

На практике, пользовательские типы записей появились достаточно давно, а точнее с 17 февраля 2005 года, когда в WordPress 1.5 была добавлена ​​поддержка пользовательских типов для статических страниц, посредством post_type поля в базе данных. Функция Wp_insert_post() была примерно с WordPress 1.0 так что, когда поле post_type было реализовано в 1.5, можно было достаточно просто заполнить его с помощью этой функции.

И только в версии 2.8 появилась функция register_post_type() для создания пользовательских типов и некоторые другие полезные вещи были доступны в «ночных сборках», а уже с 2.9 функции стали доступны всем.


Пользовательские типы записей в WordPress

А что сейчас?!

Пользовательский тип записи это не более чем обычная запись (статья) с определенным значением поля post_type в базе данных. В обычной записи поле post_type имеет значение post, страница имеет значение page и так далее. Однако теперь мы можем создавать свои собственные типы, чтобы указать особенности контента, содержащегося в записи. Можно создать пользовательские типы записей для книг, фильмов, анекдотов, продуктов и всего чего угодно.
Если все сделано правильно, то с помощью всего лишь нескольких строк кода можно достичь следующих результатов:

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

Различные типы контента предъявляют различные требования к данным. Для обычных записей вы хотите, чтобы был указан автор, категория и дата. В то время как для записи с типом «книги», хотелось бы иметь возможность указать автора книги, количество страниц, жанр, издательство и другие конкретные данные. Этого легко добиться используя пользовательские (meta boxes) области для ввода данных.

Meta boxes — области для ввода дополнительных данных прямо на странице создания записи. Такие области упрощают работу с пользовательскими типами записей.


Meta boxes - область для ввода дополнительных данных

Работа с пользовательскими типами записей

Чтобы эффективно создавать и использовать пользовательские типы записей, Вы должны быть знакомы со следующими составляющими:

  • Создание пользовательских типов записей;
  • Создание пользовательской таксономии;
  • Создание пользовательских областей данных.

Создание пользовательских типов записей

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

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

Итак мы добавили несколько опций в массив $args:

  • labels — данный массив меток используется для описания создаваемого пользовательского типа записи в теме./li>
  • description — краткая информация создаваемого пользовательского типа записи, что он делает и почему мы его используем.
  • public — использовать ли пользовательский тип публично и показывать ли его в административной зоне. В данном случае установлено истина.
  • menu_position — позиция пункта меню нашего типа на основной панели администратора. Значение 5 значит пункт установиться сразу после пункта меню «Записи», если 10 значит после пункта «Медиафайлы» и тд.
  • supports — данная опция содержит массив, в котором описаны те поля которые мы можем редактировать на странице создания записи. То есть title — появится поле для ввода названия записи, editor — будет отображена текстовая область для ввода текста записи и тд. А также указана используемая пользовательская таксономия product_category.
  • has_archive — если установлено true, будет создано правило rewrite, позволяя получить список записей нашего типа по адресу http://mysite.com/product/


Созданный пользовательский тип записей

После установки этого кода в файл function.php, вы должны увидеть меню для пользовательского типа записей. Появилась возможность добавлять запись и просмотреть список записей.

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

Интерактивные оповещения

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

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


Интерактивное оповещение пользователей

Контекстные подсказки

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

Для того чтобы показать такую подсказку нам необходимо знать идентификатор экрана. Если при создании понадобится узнать ID экрана просто делаем так:


Контекстные подсказки

Пользовательская таксономия

На обычного блога для создания организационной структуры вполне хватает категорий и тегов. В то время как для пользовательских типов постов этого не всегда достаточно. Такую проблему может решить пользовательская таксономия. В нашем случае таксономия с названием «Категории продуктов», которая используется только для записей с пользовательским типов «Продукция».

Процесс создания пользовательской таксономии практически идентичен созданию пользовательских типов записей. Давайте посмотрим на нашем примере:

Как и при создании пользовательского типа мы сформировали массив label, и указали что для создаваемой таксономии актуальна иерархическую структуру (т.е. могут быть родительский и дочерний элементы) — это свойственно рубрикам в обычных записях. В противном случае если структура не иерархическая — созданы обычные теги. Более подробно о таксономии Вы можете почитать тут.


Пользовательская таксономия (Категории продуктов)

Дополнительные области данных

Дополнительные области или блоки для ввода данных (meta boxes) вы могли видеть на странице редактирования записи. Все знают стандартные meta boxes, такие как выбор рубрики или тегов. Также в некоторых темах встречаются meta boxes позволяющие прикрепить картинку к записи и тд.

Так как мы создаем пользовательский тип «Продукция», то нам явно понадобится цена продукта, давайте рассмотрим процесс создания пользовательских meta boxes.

Процесс создания можно разделить на 3 этапа:

  • Определение самого meta boxes блока;
  • Определение содержимого (какие поля присутствуют в блоке);
  • Описание алгоритмов обработки введенных данных.

Определение meta boxes

Приведенный выше код создает блок со следующими параметрами:

  • product_price_box — уникальный идентификатор для meta box (он не обязательно должен совпадать с названием функции);
  • Цена продукта — название meta box, которое видит админ на странице;
  • product_price_box_content — функция, которая будет отображать содержимое окна;
  • product — название пользовательского типа записи, к которому принадлежит meta boxes;
  • side — положение блока на странице (side, normal или advanced — по-умолчанию);
  • high — приоритет meta boxes (в данном случае «высокий», блок находится в самом верху сайдбара. Варианты: high, core, low или default — по-умолчанию).

Определение содержимого

Добавляем всего лишь одно поле, для ввода цены продукта. Заметьте название функции совпадает со значением третьего параметра при объявлении meta boxes (код выше).

Обработка введенных данных

Последний шаг — это сохранение введенной цены на продукт в базу данных.

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


Meta Boxes

Отображение записей созданного типа на блоге

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

Так как в процессе создании пользовательского типа мы указали истину для параметра has_archive то список записей типа product доступны по адресу http://mysite.com/product/.

Для отображения используется файл archive-[post_type].php (в нашем случае archive-product.php) если такой существует. Иначе, для отображения будет использован archive.php и если такой файл отсутствует в теме, то будет использовать index.php.

Еще один способ отображения записей пользовательского типа, это использование запроса класса WP_Query. В простой форме это выглядит примерно так:

Отображение цены

Введенные дополнительные данные, в нашем случае цена продукта, могут быть получены с помощью функции get_post_meta (). Так как мы используем дополнительно поле product_price, то чтобы получить значение цены:

Плагин для создания пользовательских типов записей

Если Вы не уверены в своих силах в области программирования, то всегда можно найти уже готовое решение (плагин) и воспользоваться им. Пользовательские типы не исключение. Плагин WCK Custom Post Type Creator позволяет вам легко создавать пользовательские типы записей для WordPress без знания программирования. СКАЧАТЬ.

xozblog.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.