WordPress

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

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

Вступление

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

Мы также включим функцию редактора записей Custom Fields (пользовательские или произвольные поля) для каждого типа и отобразим поля в новых шаблонах.

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

Но прежде чем мы продолжим, давайте разберёмся с тем, что такое пользовательские записи.

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

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

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

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

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

В примере выше, если пользователь перейдёт в раздел базы данных фильмов (movie) на вашем сайте, публикации с отзывами (review) не будут включены. Если вы, к примеру, сделаете категории ‘Action’ и ‘Romance’, ваши пользователи смогут пойти в категорию фильмов Action и увидеть все отзывы и фильмы категории.

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

Вы можете изменить различные тексты названий (заданные с использованием массива $labels), такие как переименовать Add New Post в Add New Movie. Например, вы можете переименовать текст Featured Image (Изображение записи) в Add Poster (Добавить постер).

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

Продолжая пример с Movies и Movie Reviews, публикации Movie могут добавлять пользовательские/произвольные поля для таких параметров как год выпуска, режисёр, рейтинги многие другие с кратким обзором фильмы в виде содержимого записи.

Пример пользовательских полей записи WordPress

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

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

Когда вы создаёте значительные изменения в WordPress, одним из доступных вариантов реализации является создание плагина. Вы также можете создавать новые произвольные типы записей в файле functions.php. Для этого руководства мы создадим плагин и продолжим использовать пример с базой данных movie/reviews (фильмы/отзывы).

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

// The custom function MUST be hooked to the init action hook
add_action( 'init', 'lc_register_movie_post_type' );

// A custom function that calls register_post_type
function lc_register_movie_post_type() {

  // Set various pieces of text, $labels is used inside the $args array
  $labels = array(
     'name' => _x( 'Movies', 'post type general name' ),
     'singular_name' => _x( 'Movie', 'post type singular name' ),
     ...
  );

  // Set various pieces of information about the post type
  $args = array(
    'labels' => $labels,
    'description' => 'My custom post type',
    'public' => true,
    ...
  );

  // Register the movie post type with all the information contained in the $arguments array
  register_post_type( 'movie', $args );
}

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

Два параметра для функции register_post_type() это:

  1. Название типа записи, максимум 20 символов, и не должно содержать пробелов и заглавных букв
  2. Ассоциативный массив, под названием $args, который содержит информацию о типе записи в виде пар ключ значение ‘key’ => ‘value’

Массив $args

Наиболее часто используемые ключи для массива $args показаны ниже, все не являются обязательными:

  • labels – массив array, который задаёт разные фрагменты текста, например ‘Добавить новую запись’ может быть переименована в ‘Добавить новый фильм’. Ключи для массива labels с пояснениями описаны ниже;
  • description – короткое и ёмкое описание типа записи, оно может быть отображено в шаблонах типов, но больше нигде не используется;
  • public – видно ли тип записи для автором и посетителей, значение по умолчанию FALSE, что значит он не появляется даже в Админ консоли;
  • exclude_from_search – будут ли записи этого типа появляться в результатах обычного поиска, значение по умолчанию противоположное значению public;
  • publicly_queryable – можно ли получить запись этого типа с помощью URL-адреса, например, http://www.mywebsite.com/?post_type=movie, или в расширенном использовании через функцию query_posts(). Значение по умолчанию, это значение public;
  • show_ui – подключаются ли ссылки меню и редактор сообщений в панели управления администратора. Значение по умолчанию –public;
  • show_in_nav_menus – будут ли записи этого типа добавляться в меню навигации, созданные на странице Внешний вид ->Меню, значение по умолчанию – это значение public;
  • show_in_menu – отображается ли ссылка типа записи в навигации админ консоли. FALSE – скрывает ссылку. TRUE – добавляет ссылку как новую ссылку верхнего уровня. Ввод строки позволяет разместить ссылку внутри существующей ссылки верхнего уровня, то есть ввести параметры options-general.php располагает её под ссылкой Настройки.
  • show_in_admin_bar – появится ли этот тип записей выше Admin bar, под ссылкой + New
  • menu_position – позиция новой ссылки в меню навигации админ консоли, 5 располагает ниже Записей, 100 располагает ниже Настроек, весь список позиций можно найти в WordPress Codex
  • hierarchical – может ли запись быть назначена к родительской записи, если значение TRUE, то массив $supports должен содержать параметр ‘page-attributes’
  • supports – выборочно включает функции записи такие как: изображения, фрагменты текста, произвольные поля и др. Если установлено в FALSE, то вместо массива выключается редактор для этого типа поста – полезно, если вы хотите закрыть все записи этого типа от редактирования, но оставить видимыми (список значений массива ниэе)
  • taxonomies – массив таксономий, который может быть применён к публикациям этого типа, таксономии должны быть уже зарегистрированными – отсюда они не создаются!
  • has_archive – будут ли у записей этого типа архивные страницы, URL имеет структуру постоянной ссылки и описательная часть URL – это параметр 1 функции register_post_types(), то есть http://www.mywebsite.com/movie_reviews/ покажет все записи movie_review.
  • query_var  – TRUE или FALSE определяет, может ли запись быть показанной, вписывая в виде запроса в URL тип записи и имя записи, то есть ‘http://www.mywebsite.com/?movie=the-matrix‘. Если вы вводите строку текста, нужно располагать текст после символа ?, таким образом ‘film’ будет выглядеть в результате как ‘?film=the-matrix‘.

Полный список можно посмотреть на странице WordPress Codex page for register_post_type().

Массивы labels

Первый ключ в массиве $args называется labels (ярлыки) и должен быть массивом. Он задаёт различные фрагменты текста, относящиеся к типу записи. Так как здесь может быть много данных, лучше всего создать массив с названием $labels для их хранения. Приведенный выше код немного проясняет, что это значит.

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

  • name – общее названия для типа сообщений, например, movies (фильмы)
  • singular_name – название для одной записи этого типа, например, movie (фильм)
  • add_new – замена текста ‘Add New’ (Добавить новую) на указанный текст, например, ‘Add Movie’ (Добавить фильм)
  • add_new_item – замена для ‘Add New Post’ (Добавить новую запись), например, на ‘Add New Movie’ (Добавить новый фильм)
  • edit_item – замена для ‘Edit Post’ (Редактировать запись), например, на ‘Edit Movie’ (Редактировать Фильм)
  • featured_image – замена для ‘Featured Image’ (Изображение записи) в редакторе записи, например, на ‘Movie Poster’
  • set_featured_image –  замена ‘Set Featured Image’, к примеру, на такой вариант ‘Add Movie Poster’
  • menu_name – изменение текста ссылки на верхнем уровне, текст для ссылки по умолчанию имя ключа

Полный список можно посмотреть на странице  WordPress Codex page for register_post_type().

Массив supports

// Enable specific features in the post editor for my post type
$supports = array ( 'title', 'editor', 'author', 'thumbnail' );

// Disable ALL features of the post editor for my post type
$supports = FALSE;

Один из ключей в массиве $args называется supports. Это простой массив, где вы записываете список функций редактора записи, которые вы хотите включить для своего типа записи. По умолчанию только название (title) и редактор (editor) включены.

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

Вот перечень функций, которые вы можете включить в массиве $supports:

  • title (название)
  • editor (редактор)
  • author – ПРИМЕЧАНИЕ: это позволяет вам изменять автора публикации
  • thumbnail (иконка)
  • excerpt (фрагмент текста)
  • trackbacks (трекбек)
  • custom-fields (произвольное поле)
  • comments (комментарии)
  • revisions (версии)
  • page-attributes (атрибуты страницы)
  • post-formats (форматы записи)

Создание произвольного типа записи WordPress через плагин

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

<?php
/*
Plugin Name: My Custom Post Types
Description: Add post types for movies and movie reviews
Author: Liam Carberry
*/
 
// Hook <strong>lc_custom_post_movie()</strong> to the init action hook
add_action( 'init', 'lc_custom_post_movie' );
 
// The custom function to register a movie post type
function lc_custom_post_movie() {
 
  // Set the labels, this variable is used in the $args array
  $labels = array(
    'name'               => __( 'Movies' ),
    'singular_name'      => __( 'Movie' ),
    'add_new'            => __( 'Add New Movie' ),
    'add_new_item'       => __( 'Add New Movie' ),
    'edit_item'          => __( 'Edit Movie' ),
    'new_item'           => __( 'New Movie' ),
    'all_items'          => __( 'All Movies' ),
    'view_item'          => __( 'View Movie' ),
    'search_items'       => __( 'Search Movies' ),
    'featured_image'     => 'Poster',
    'set_featured_image' => 'Add Poster'
  );
 
  // The arguments for our post type, to be entered as parameter 2 of register_post_type()
  $args = array(
    'labels'            => $labels,
    'description'       => 'Holds our movies and movie specific data',
    'public'            => true,
    'menu_position'     => 5,
    'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
    'has_archive'       => true,
    'show_in_admin_bar' => true,
    'show_in_nav_menus' => true,
    'has_archive'       => true,
    'query_var'         => 'film'
  );
 
  // Call the actual WordPress function
  // Parameter 1 is a name for the post type
  // Parameter 2 is the $args array
  register_post_type( 'movie', $args);
}
 
// Hook <strong>lc_custom_post_movie_reviews()</strong> to the init action hook
add_action( 'init', 'lc_custom_post_movie_reviews' );
 
// The custom function to register a movie review post type
function lc_custom_post_movie_reviews() {
 
  // Set the labels, this variable is used in the $args array
  $labels = array(
    'name'               => __( 'Movie Reviews' ),
    'singular_name'      => __( 'Movie Review' ),
    'add_new'            => __( 'Add New Movie Review' ),
    'add_new_item'       => __( 'Add New Movie Review' ),
    'edit_item'          => __( 'Edit Movie Review' ),
    'new_item'           => __( 'New Movie Review' ),
    'all_items'          => __( 'All Movie Reviews' ),
    'view_item'          => __( 'View Movie Reviews' ),
    'search_items'       => __( 'Search Movie Reviews' )
  );
 
  // The arguments for our post type, to be entered as parameter 2 of register_post_type()
  $args = array(
    'labels'            => $labels,
    'description'       => 'Holds our movie reviews',
    'public'            => true,
    'menu_position'     => 6,
    'supports'          => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
    'has_archive'       => true,
    'show_in_admin_bar' => true,
    'show_in_nav_menus' => true,
    'has_archive'       => true
  );
 
  // Call the actual WordPress function
  // Parameter 1 is a name for the post type
  // $args array goes in parameter 2.
  register_post_type( 'review', $args);
}

Ели вы включите этот плагин, то увидите новую ссылку в панели навигации админ консоли, сразу после ссылки Записи.

При наведении мыши будет показаны пункты меню ‘View All’ (Показать все) и ‘Add New’ (Добавить новую), текст будет соответствовать тому, который был задан в массиве $labels. Посмотрите в редакторе, где изменились ссылки.

Ограничение произвольных полей для заданных записей

При добавлении своих полей в запись поля сохраняются и вы можете быстро добавить любое к новой записи. Произвольные поля, которые вы добавили будут появляться в выпадающем списке каждой записи. Это может затруднить поиск нужного поля в определённых типах записей. Если вы хотите ограничить произвольные поля, чтобы они были доступны только для отдельных типов записей, то самый простой способ – через плагин.

Плагин advanced custom fields (расширенный плагин для произвольных полей) добавляет простой редактор WordPress, который позволяет создавать произвольные поля и задавать их появление только в ваших типах постов.

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

Вид Плагина для WordPress Advanced Custom Fields

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

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

Оформление новых типов записей

Для создания шаблонов темы для вашего нового типа записей вам нужно всего лишь создать файлы с правильными названиями в главном каталоге вашей темы. Если вы не создадите шаблоны, то WordPress будет использовать single.php и archive.php вместо этого, оставляя все ваши публикации и архив одинаковыми.

  • Шаблон для отдельной публикации – single-{post-type}.php
  • Шаблон для архивных страниц – archive-{post-type}.php.

Часть {post-type} имени файла должна быть названа из параметра 1 функции register_post_type().

  • Для наших типов записей фильмы (movie), имя файла будет single-movie.php и archive-movie.php.
  • Для наших типов записей отзывов о фильмах (movie reviews), имена файлов будут single-review.php и archive-review.php.

Лучший способ начать – это сделать копию single.php или archive.php и переименовать их, как показано выше. Это значит, что общая структура будет такой же для остальной части темы и все необходимые тэги шаблона уже будут на местах.

Отображение произвольных полей в записи

Для отображения произвольных полей, созданных в стандартном редакторе WordPress вы можете использовать две функции.

// Generates all custom fields attached to the post in a <ul> list
the_meta();

// Get a specific piece of information
echo get_post_meta( $post->ID, 'Budget', TRUE );

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

the_meta()

Отображение всех произвольных полей, прикреплённых к записи в списке <ul>. В результате тэг <ul> выглядит так:

<ul class='post-meta'>
  <li>
    <span class='post-meta-key'>{your_key}</span> {your_value}
  </li>
</ul>

Это работает где угодно в шаблоне для отдельной записи, но, если вы отображаете где-то ещё, он должен быть внутри цикла WordPress loop.

get_post_meta()

  • принимает 3 параметра и возвращает результат
  • первый параметр – ID записи, вы можете использовать здесь $post->ID для получения ID текущей отображаемой записи
  • второй параметр – имя произвольного поля записи, чувствительное к регистру
  • третий параметр имеет тип boolean, называется $single и может быть TRUE (возвращает результат в виде строки) или FALSE (возвращает массив).

ПРИМЕЧАНИЕ: Вы можете создать несколько настраиваемых полей с тем же именем и разными значениями. Если существует несколько полей с одинаковым именем, установка FALSE вернёт их массив.

<?php
  $movie_box_art = get_post_meta( $post->ID, 'Box Art', TRUE );

if (!empty($movie_box_art)) { ?>
  <div class="movie-poster-box">
    <img src="<?php echo $movie_poster ?>" alt="<?php single_post_title(); ?> ">
  </div>
<? } ?>

Поскольку функция get_post_meta() возвращает значение, вы можете использовать значение в условном выражении для соответствующего изменения внешнего вида.

В примере выше мы проверяем, содержит ли фильм (movie) box art, назначенный ему в виде произвольного поля. Если $movie_box_art не пустое, вывести div и image.

Отображение Advanced Custom Fields

// Display field value
the_field( 'FIELD NAME' );

// Return field value
get_field( 'FIELD NAME' );

Плагин Advanced Custom Fields предлагает свои собственные функции и шорткоды для отображения полей.

Имена полей плагина Advanced Custom Fields

the_field(  ‘ FIELD NAME’  );

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

get_field( ‘FIELD NAME’ );

Возвращает значение указанного поля, удобно для условных выражений.

Это те функции, которые вам, скорее всего, понадобятся. Есть много дополнительных функций, и вы можете найти их в официальной документации.

Шорткоды

[acf field="FIELD NAME"]

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

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

// Hook our custom function to the pre_get_posts action hook
add_action( 'pre_get_posts', 'add_reviews_to_frontpage' );
 
// Alter the main query
function add_reviews_to_frontpage( $query ) {
    if ( is_home() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post', 'movie', 'review' ) );
    }
    return $query;
}

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

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

$query->set() принимает два параметра:

  • первый параметр – приоритет, который вы хотите изменить, в нашем случае мы изменяем приоритет post_type
  • второй параметр – массив, который вы хотите передать как значение признака post_type

В примере кода выше массив начинается с ‘post’ – вот почему каждая запись WordPress имеет тип ‘post’ и мы всё ещё хотим включить её на главной странице.

Если на главной странице вы хотите использовать только пользовательские записи заданного типа, вы можете удалить‘posts’ и использовать свой собственный тип сообщений.

Мы добавили ‘movie’ и ‘review’ в массив, теперь на главной странице выводятся все записи, все записи типа movie и все записи review.

Значение, которое вы вводите должно соответствовать параметру 1 функции register_post_type().

Заключение

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

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

Elena B.

Елена имеет профессиональное техническое образование в области информационных технологий и опыт программирования на разных языках под разные платформы и системы. Более 10 лет посвятила сфере веб, работая с разными CMS, такими как: Drupal, Joomla, Magento и конечно же наиболее популярной в наши дни системой управления контентом – WordPress. Её статьи всегда технически выверены и точны, будь то обзор для WordPress или инструкции по настройке вашего VPS сервера.

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

Нажмите здесь, чтобы оставить комментарий

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

Присоединяйтесь к тысячам других подписчиков по всему миру

и получайте самые свежие руководства на вашу электронную почту

Пожалуйста, подождите...

Спасибо за подписку!

Начните экономить сейчас!

Хостинг и доменное имя от

руб.95
00