Как использовать свой тип контента. Пользовательский тип записей wordpress


Как добавить категории в кастомный тип постов в Wordpress вручную и с плагином?

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 );

smarticle.ru

Произвольные типы записей в Wordpress

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

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

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

Примеры из наших работ

Примеры других сайтов

Вы можете привести свои примеры использования произвольных типов постов в комментариях.

Добавление произвольного типа поста

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

Для примера я буду создавать произвольный тип записи — продуктов. Для интернет магазина к примеру публикация продуктов. Создаем тип с минимальными настройками.

Начиная с версии WordPerss 2.9 была представлена функция register_post_type (), однако полную свою мощь и функциональность она получили лишь в версии WordPress 3.0

Прежде чем начать, потребуется указать имя тип поста, две метки(название ссылкой в админ панели) и можно ли этот пост публиковать.

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

123

add_action( 'init', 'create_my_post_types' );function create_my_post_types() {register_post_type('product', array('labels' => array( 'name' => __( 'Продукты' ),'singular_name' => __( 'Продукт' ) ),'public' => true, ) );}

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

Этикетки (labels) Указание параметров в labels передает значения в название действий в в админ панели. Это полезно для локализации плагинов и дополнений. По умолчанию все действия будут приписаны для post (new post, add post, search posts и т.п.) Теперь давайте рассмотрим список всех аргументов labels. Под постом подразумевается ваш тип

1234567891011121314

'labels' => array('name' => __( 'Продукты' ),'singular_name' => __( 'Продукт' ),'add_new' => __( 'Добавить' ),'add_new_item' => __( 'Новый продукт' ),'edit' => __( 'Редактировать' ),'edit_item' => __( 'Редактировать продукт' ),'new_item' => __( 'Новый продукт' ),'view' => __( 'Посмотреть' ),'view_item' => __( 'Посмотреть продукт' ),'search_items' => __( 'Поиск продуктов' ),'not_found' => __( 'Продуктов не найдено' ),'not_found_in_trash' => __( 'В корзине нет продуктов' ),'parent' => __( 'Родительский продукт' ), ),

Описание \ description

description — аргумент принимающий описание вашего плагина. На данный момент я не встречал вывода этого параметра в админ панели и указание этого аргумента особой роли не играет.

1

'description' => 'Описание нашего типа поста в рамках рассмотрения произвольных типов постов.'

Доступность \ public

public — аргумент принимающий значения true или false для управления возможностью публикации постов, указание параметра автоматически решает на другие значения параметров.

1234

'public' => true,'show_ui' => true,'publicly_queryable' => true,'exclude_from_search' => false,

Позиция в меню \ menu_position

По умолчанию новый тип постов добавляет после комментариев. Элементы в WordPress расставляются раздельно с помощью нумерацией интегралов от 5. К примеру чтобы поставить наш пункт меню после пункта «Страницы» добавим следующий код

Иконка меню \ menu_icon

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

1

'menu_icon' => get_stylesheet_directory_uri() . '/images/product.png',

Иерархия \ hierarchical

hierarchical — аргумент позволяет выбрать, хотите ли вы чтобы ваши посты были иерархическими. По умолчанию стоит false. Если вы установите true, ваши посты будут вести себя, как страницы в WordPress.

Переменная запроса \ query_var

query_var — аргумент позволяет управлять доступностью переменной для запроса, используется для получения постов этого типа. Например, можно использовать в query_posts() функции или WP_Query классе. Название переменной при запросе по умолчанию является названием вашего типа постов.

 Возможности \ capability_type

capability_type всеобъемлющий аргумент на несколько более конкретных аргументов, умолчанию post. Позволяет определить пользовательский набор возможностей, чтобы редактировать, создавать и читать ваш пользовательский тип постов.Если вы просто хотите сохранить те же разрешения что и у блога, оставьте значения по умолчанию. В противном случае, вы можете установить capability_type и определить полномочеия в виде аргументов в массиве.

Для большинства людей, которые нуждаются в контроле над этими вещами, проще просто изменить capability_type что-то вроде моего примера product. WordPress автоматически переключится. Например, edit_post способность станет edit_product .

12

/* Глобальный контроль продуктов. */'capability_type' => 'product', 

Поддержка \ supports

supports — Также мы можем указать какие поля доступны для редактирования нашего поста на странице добавления поста. По умолчания это title и editor. Вот доступные варианты

1

'supports' => array( 'title', 'editor', 'excerpt', 'custom-fields', 'thumbnail' ),

Таксономии \ Taxonomies

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

12

//Подключаем теги и станартные категории к своему типу постов'taxonomies' => array( 'post_tag', 'category '),

Экспорт \ can_export

Устанавливает возможность экспорта постов через инструменты wordpress, по умолчанию true

Обратная функция \ register_meta_box_cb

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

1

'register_meta_box_cb' => 'your_callback_function_name',

Маска ссылки \ permalink_epmask

Маска постоянной ссылки на конечный просмотр типа поста. Врятли вам понадобится этот параметр, я оставляю его по умолчанию.

1

'permalink_epmask' => EP_PERMALINK,

webislife.ru

Как использовать свой тип контента / Хабр

ПортфолиоВ Wordpress есть два типа контента: Посты и Страницы. Эти типы содержат такие поля как название, описание, категории/тэги. Дополнительное описание можно создать с помощью Пользовательских Полей (Custom Fields).

В Wordpress 3.0 появилась возможность создавать свой тип контента.

Идея в том, чтоб создать новый тип контента, например Потфолио (название, описание, адрес сайта, дата релиза, имя заказчика, используемые технологии), который бы не выводился вместе с постами и имел бы другое представление.Wordpress

Регистрируем свой тип контента
Заходим в папку текущей темы и создаем файл «functions.php», если его ещё нет. Здесь мы можем написать перехватчики событий и добавить необходимые действия.
  1. // добавляем хук на инициализацию
  2. add_action('init', 'portfolio_init');
  3.  
  4. function portfolio_init() {
  5.  
  6.         // описываем наш тип контента
  7.         $args = array(
  8.                 'label' => __('Portfolio'),
  9.                 'labels' => array(
  10.                         'edit_item' => __('Edit Work'),
  11.                         'add_new_item' => __('Add New Work'),
  12.                         'view_item' => __('View Work'),
  13.                 ),
  14.                 'singular_label' => __('Work'),
  15.                 'public' => true,
  16.                 'show_ui' => true, // показывать в админке?
  17.                 '_builtin' => false, // это не встроенный тип данных
  18.                 '_edit_link' => 'post.php?post=%d',
  19.                 'capability_type' => 'post',
  20.                 'hierarchical' => false,
  21.                 'rewrite' => array("slug" => "medewerkers"), // формат ссылок
  22.                 'supports' => array('title', 'editor', 'thumbnail')
  23.         );
  24.  
  25.         // регистрируем новый тип
  26.         register_post_type( 'portfolio' , $args ); // первый параметр - это название нашего нового типа данных
  27.  
  28.         // подключаем таксономию (используемые технологии можно будет назначать как теги)
  29.         register_taxonomy(
  30.                 'mtype',
  31.                 'portfolio',
  32.                 array ('hierarchical' => false, 'label' => __('Technologies'),
  33.                         'singular_label' => __('Technology'),
  34.                         'query_var' => 'mtype')
  35.         );
  36. }
Изменяем интерфейс редактирования
  1. // добавляем хук на инициализацию админки
  2. add_action("admin_init", 'portfolio_admin_init');
  3.  
  4. function portfolio_admin_init() {
  5.         // добавляем дополнительный блок
  6.         add_meta_box("portfolio-meta", "Details", portfolio_options, 'portfolio', 'normal', 'low');
  7. }
  8.  
  9. // описываем блок
  10. function portfolio_options() {
  11.         global $post;
  12.  
  13.         // Используем скрытое поле для
  14.         echo '<input type="hidden" name="portfolio_noncename" value="' .
  15.         wp_create_nonce( 'portfolio' ) . '" />';
  16.  
  17.         // наши поля
  18.         $my_fields = array('web' => '', 'customer' => '', 'web' => '', 'date' => '');
  19.  
  20.         foreach ($my_fields as $key => $value) {
  21.                 $my_fields[$key] = get_post_meta($post->ID, 'portfolio-' . $key, true);
  22.         }      
  23.  
  24.         echo '<strong>Web site</strong><br/><br/><input name="portfolio-web" size="60" value="' . $my_fields['web'] . '" /><br/><br/>' . "\n";
  25.         echo '<strong>Customer</strong><br/><br/><input name="portfolio-customer" size="60" value="' . $my_fields['customer'] . '" /><br/><br/>' . "\n";
  26.         echo '<strong>Release date</strong><br/><br/><input name="portfolio-date" size="60" value="' . $my_fields['date'] . '" /><br/><br/>' . "\n";
  27. }
пример
Сохранение
  1. // добавляем хук на сохранение поста
  2. add_action( 'save_post', 'portfolio_save', 1, 2 );
  3.  
  4. function portfolio_save() {
  5.         global $post;
  6.  
  7.         $post_id = $post->ID;
  8.  
  9.         // определяем, что данные пришли с нашей формы и верной авторизацией
  10.         // потому что  save_post может быть вызван и в других случаях
  11.  
  12.         if ( !wp_verify_nonce( $_POST['portfolio_noncename'], 'portfolio')) return $post_id;
  13.  
  14.         // если это авто-сохранение, значит форма не сохранена и мы ничего не делаем
  15.         if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
  16.  
  17.         // флаг для определения пользовательского типа данных, он здесь особо не нужен, но не повредит
  18.         $post_flag = 'x';
  19.  
  20.         if ($post->post_type == "portfolio") {
  21.                 $my_fields = array('web' => '', 'customer' => '', 'web' => '', 'date' => '');
  22.                 $post_flag = 'portfolio';
  23.         }
  24.  
  25.         if ($post_flag != 'x') {
  26.                 // значит это наш тип контента
  27.  
  28.                 // проходим по всем полям
  29.                 foreach ($my_fields as $k=>$v)
  30.                 {
  31.                         $key = 'portfolio-' . $post_flag . '-' . $k;
  32.  
  33.                         $value = @$_POST[$key];
  34.                         if (empty($value))
  35.                         {
  36.                                 delete_post_meta($post_id, $key);
  37.                                 continue;
  38.                         }
  39.  
  40.                         // если значение является строкой, то оно должно быть уникальным
  41.                         if (!is_array($value))
  42.                         {
  43.                                 // обновляем мета-информацию
  44.                                 if (!update_post_meta($post_id, $key, $value))
  45.                                 {
  46.                                         // или добавляем
  47.                                         add_post_meta($post_id, $key, $value);
  48.                                 }
  49.                         }
  50.                         else
  51.                         {
  52.                                 // если мы оказались здесь - нам нужно удалить ключи
  53.                                 delete_post_meta($post_id, $key);
  54.  
  55.                                 // проходим по массиву и добавляем новые значения в мета-информацию как различные ячейки с одинаковым именем
  56.                                 foreach ($value as $entry)
  57.                                         add_post_meta($post_id, $key, $entry);
  58.                         }
  59.                 }
  60.  
  61.         }
  62. }
Изменяем сводную таблицу в админке
  1. add_action("manage_posts_custom_column", "portfolio_custom_columns");
  2. add_filter("manage_edit-portfolio_columns", "portfolio_columns");
  3.  
  4. // названия колонок
  5. function portfolio_columns($columns)
  6. {
  7.         $columns = array(
  8.                 "cb" => "<input type=\"checkbox\" />",
  9.                 "title" => "Name",
  10.                 "web" => "Web Site",
  11.                 "customer" => "Customer",
  12.                 "date" => "Release date"
  13.         );
  14.         return $columns;
  15. }
  16.  
  17. // содержимое колонок
  18. function portfolio_custom_columns($column)
  19. {
  20.         global $post;
  21.  
  22.         if ("ID" == $column) echo $post->ID;
  23.         elseif ("title" == $column) echo $post->post_title;
  24.         elseif ("web" == $column) {
  25.                 $ourl = get_post_meta($post->ID, 'portfolio-web', true);
  26.                 echo '<a href="' . $ourl . '" target="_blank">' . $ourl . '</a>';
  27.         }
  28.         elseif ("customer" == $column) {
  29.                 $ocustomer = get_post_meta($post->ID, 'portfolio-customer', true);
  30.                 echo $ocustomer . '</a>';
  31.         }
  32.         elseif ("date" == $column) {
  33.                 $odate = get_post_meta($post->ID, 'portfolio-date', true);
  34.                 echo $odate . '</a>';
  35.         }
  36. }
Заключение
В следующий раз я напишу о том, как в теме стилизировать вывод подобного контента.

habr.com


Смотрите также

Prostoy-Site | Все права защищены © 2018 | Карта сайта