Руководство по созданию пользовательских типов записей в WordPress

Это перевод статьи по адресу http://sixrevisions.com/wordpress/wordpress-custom-post-types-guide/. Изображения взяты из оригинальной статьи без каких-либо изменений — делайте на это скидку, некоторые надписи могут не соответствовать.

Одной из наиболее ожидаемых возможностей WordPress 3.0 была возможность создания собственных пользовательских типов записей в WordPress, которая позволяет отображать и категоризировать различные типы помимо 5 принятых в WordPress типов содержимого (например Запись, Страница, Файл и так делее). Добавление этой возможности — большой шаг вперед в превращении WordPresss в полноценную CMS, расширяющую ее применение за пределы обычного использования в качестве блог-платформы.

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

Что такое пользовательский тип записи?

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

Запись, как правило, используется для содержимого, которое часто обновляется (к примеру, записи в блоге), а станицы используются для статического содержимого (например страница «О нас»).

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

Мы собираемся создать пользовательский тип содержимого, который назовем «Событие». Этот тип содержимого позволит добавлять события вроде дней рождения, праздников, дат конференций и прочего.

Мы будем работать с темой по-умолчанию для WordPress 3.0 «TwentyTen», так что у нас будет одинаковый базис кода, но идея и техники применимы для любой темы.

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

К счастью, в WordPress очень легко создать новый пользовательский тип записи. Давайте сначала взлянем на код, а потом я объясню как он работает.

add_action( 'init', 'create_events' );
function create_events() {
  $labels = array(
    'name' => _x('Events', 'post type general name'),
    'singular_name' => _x('Event', 'post type singular name'),
    'add_new' => _x('Add New', 'Event'),
    'add_new_item' => __('Add New Event'),
    'edit_item' => __('Edit Event'),
    'new_item' => __('New Event'),
    'view_item' => __('View Event'),
    'search_items' => __('Search Events'),
    'not_found' =>  __('No Events found'),
    'not_found_in_trash' => __('No Events found in Trash'),
    'parent_item_colon' => ''
  );

  $supports = array('title', 'editor', 'custom-fields', 'revisions', 'excerpt');
  register_post_type( 'event',
    array(
      'labels' => $labels,
      'public' => true,
      'supports' => $supports
    )
  );
}

Код выше нужно добавить в файл functions.php вашей темы.

Пару замечаний об этом коде:

  • add_action сообщает WordPress, что ему нужно вызвать нашу функцию create_events() во время инициализации
  • Массив $labels сообщает WordPress какие сообщения нужно отображать о нашем пользовательском типе
  • Массив $supports сообщает WordPress, какие поля поддерживает наш тип записи (например может ли он иметь поле «цитата»)
  • Функция register_post_type непосредственно регистрирует наш новый тип содержимого в WordPress
  • Функция register_post_type очень гибко настраивается и имеет гораздо больше параметров чем мы сейчас используем; можете почитать о них в WordPress Codex.

После добавления этого кода в functions.php, мы увидем новый тип содержимого в панели администрирования WordPress.

Регистрация пользовательского типа содержимого

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

Форма админки для добавления нового типа записей

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

Теперь, когда мы опубликовали событие, мы можем посмотреть его как любую другую запись. На странице редактирования нажмите на кнопку «View Event» и вы увидите, что событие выводится как любая другаю запись.

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

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

И снова, WordPress предоставляет хороший механизм для настройки внешнего вида пользовательских записей. Если вы когда-либо ранее работали над темой WordPress, вы наверняка знаете, что отдельный вид записи отображается с помощью файла темы single.php. WordPress 3.0 позволяет вам добавить файл single-[имя вашего типа содержимого].php, чтобы переопредлеить внешний вид этого типа. Обратите внимание, что формат имени этого файла таков: «single-» и далее тот код, который вы назначили вашему типу записей.

Для нашего типа «событие» создайте файл single-event.php и скопируйте в него содержимое файла single.php. Для простоты, мы изменим одну строчку в этом файле, чтобы показать, что это действительно работает. Найдите строчку, которая выводит заголовок события в файле single-event.php, она выглядит примерно так:

<h1 class="entry-title"<<?php the_title(); ?></h1>

Давайте изменим ее следующим образом:

<h1 class="entry-title">Event: <?php the_title(); ?></h1>

Вернувшись на страницу нашего события, мы увидим, что она отражает наши изменения.

Измененный шаблон пользовательского типа содержимого

Любые другие изменения, которые вы сделаете в файле single-event.php будут видны при просмотре события.

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

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

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

В перую очередь скопируйте содержимое page.php в новый файл с именем page-events.php.

WordPress позволяет создавать множество шаблонов для отображения страниц в различных вариатах. Мы используем этот фунционал для создания шаблона отображения событий.

В page-events.php добавьте такую строчку, где-нибудь в комментарии в начале файла:

	Template Name: Events Template

Это строчка сообщит WordPress, что файл page-events.php является шаблоном страницы и что он называется «Events Template». Верхняя часть файла page-events.php должна теперь выглядеть примерно так:

<?php
/**
  * Template Name: Events Template
  * @package WordPress
  * @subpackage Twenty_Ten
  * @since Twenty Ten 1.0
  */
 get_header();
?>

Далее используйте следующий код прямо перед началом цикла WordPress:

<?php query_posts(array('post_type'=>'event')); ?>

Цикл WordPress это строка, которая выглядит примерно так:

<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>

Код выше заставляет WordPress извлечь все содержимое, которое имеет тип «событие» (event) и перемещаться по нему в цикле.

Теперь у нас есть пользовательский шаблон, который будет показывать наши события, нам надо создать непосредственно страницу «Events», которая будет их показывать. Для этого перейдите снова административную панель, создайте новую страницу с заголовком «События», и после этого выберите «Events Template» в качестве шаблона этой страницы.

Выбор шаблона страницы

Теперь, когда вы опубликовали страницу «События», используя шаблон «Events Template», вы можете вернуться на свой сайт и должны увидеть страницу «События». В завистимости от вашей темы, возможно, вам придется обновить навигацию, чтобы включить новую страницу. Если мы перейдем на страницу «События» мы увидем список наших событий!

Список записей нового типа

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

Резюме

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

Если редактирование файлов темы и программирование немного вас пугает, существует несколько плагинов для WordPress, которые позволяют достичь много из указанного выше (см. Custom Post Type UI и GD Custom Posts And Taxonomies Tools и прочие)

  • Pingback: Сервис «Вопрос-ответ или «Вопрос эксперту для Wordpress | «xander27b()

  • Marginal

    почему-то на новой странице не действует.

  • Prolab

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

    • Вместо 'event')); ?>  нужно вписать

       'event', 'peged'=>$page));

      ?>  

      • Олег

        чего-то фильтрануло часть кода

         

        Вместо 'event')); ?>   

        нужно вписать

          $page = (get_query_var('paged')) ? get_query_var('paged') : 1;query_posts(array('post_type'=>'event', 'peged'=>$page));?>

      • Аноним

        Здорово, спасибо. Поправил ваши комменты

    • Олег

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

      Код который нужно заменить следующий 'event')); ?>  

  • Влад

    +1 автору, разобрался с первого раза :)

  • pomahax

    Прощайте другие ЦМС

  • Картинки поломались :(

  • +1 автору, разобрался с первого раза

  • очень помог!