Pull to refresh

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

Reading time8 min
Views14K
ПортфолиоВ 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" id="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. }


Заключение


В следующий раз я напишу о том, как в теме стилизировать вывод подобного контента.
Tags:
Hubs:
+20
Comments15

Articles