Russian (Pусский) translation by Ola Matona (you can also view the original English article)
WordPress подразумевает кастомизацию/настройку. Он был создан таким образом, чтобы можно было настроить абсолютно каждый раздел. В этом уроке мы рассмотрим пользовательские типы записей, одну из наиболее значительных и замечательных возможностей WordPress, с помощью которой WordPress смог достичь новых высот.
Что такое пользовательские типы записей?
Предположим, вы хотите чтобы в вашем блоге был отдельный раздел для кинообзоров. Используя пользовательские типы записей вы сможете создать новый тип, к примеру, Записи и Страницы, который будет содержать другой вид данных. У него будет свое меню администратора, специальные страницы для редактирования, свои таксономии и многие другие инструменты, которые нужны для полноценной работы с публикациями.
Пользовательские типы записей - это дополнительный набор настроек администратора, который существует наряду с настройками для таких типов записей по умолчанию, как записи, страницы, прикрепленные файлы, и т.д. Пользовательские типы записей могут хранить любой тип данных. У них есть отдельный редактор, загрузчик медиафайлов, и они используют уже существующую структуру таблиц WordPress, что упрощает управление данными. Основное преимущество пользовательских типов записей, созданных при помощи WordPress API, состоит в их совместимости с уже существующими темами и шаблонами. Также, благодаря использованию постоянных ссылок, пользовательские типы постов хорошо взаимодействуют и с поисковыми системами.

Зачем использовать пользовательские типы записей?
Пользовательские типы записей помогают хранить разные типы записей в разных местах. Это помогает отделить обычные посты от других. Вот и все.
Создаем плагин для пользовательского типа записи
Мы создадим плагин для пользовательского типа записи, который будет выводить лучшие кинообзоры. Начнем.
Шаг 1. Создайте папку для WordPress плагина
Откройте папку с WordPress плагинами и создайте новую папку Movie-Reviews.
Шаг 2: Создайте PHP файл
В созданной папке создайте PHP файл Movie-Reviews.php
Шаг 3: Добавьте шапку
Откройте созданный файл и вставьте код для шапки сверху.
<?php /* Plugin Name: Movie Reviews Plugin URI: http://wp.tutsplus.com/ Description: Declares a plugin that will create a custom post type displaying movie reviews. Version: 1.0 Author: Soumitra Chakraborty Author URI: http://wp.tutsplus.com/ License: GPLv2 */ ?>
Шаг 4: Зарегистрируйте пользовательскую функцию
Перед тегом закрытия PHP команды введите следующую строку кода create_movie_review
. При инициализации она будет запускать соответствующую пользовательскую функцию каждый раз при генерации страницы.
add_action( 'init', 'create_movie_review' );
Шаг 5: Выполнение функции
Код для выполнения функции create_movie_review
.
function create_movie_review() { register_post_type( 'movie_reviews', array( 'labels' => array( 'name' => 'Movie Reviews', 'singular_name' => 'Movie Review', 'add_new' => 'Add New', 'add_new_item' => 'Add New Movie Review', 'edit' => 'Edit', 'edit_item' => 'Edit Movie Review', 'new_item' => 'New Movie Review', 'view' => 'View', 'view_item' => 'View Movie Review', 'search_items' => 'Search Movie Reviews', 'not_found' => 'No Movie Reviews found', 'not_found_in_trash' => 'No Movie Reviews found in Trash', 'parent' => 'Parent Movie Review' ), 'public' => true, 'menu_position' => 15, 'supports' => array( 'title', 'editor', 'comments', 'thumbnail', 'custom-fields' ), 'taxonomies' => array( '' ), 'menu_icon' => plugins_url( 'images/image.png', __FILE__ ), 'has_archive' => true ) ); }
Функция register_post_type
сделает бОльшую часть работы в нашем случае. Сразу как она вызовется, она подготовит необходимую для нового пользовательского поста конфигурацию WordPress, включая дополнительные разделы для администратора. В функцию передается два типа аргументов: уникальное имя (name
) пользовательского типа поста и массив с его свойствами. Это другой массив с другими метками, которые указывают какие текстовые строки будут показываться в разных частях пользовательского типа записи, например: 'name
' выводит название пользовательского типа записи на панели управления, 'edit
' и 'view
' выводят кнопки Edit и View. Думаю, все остальные аргументы говорят сами за себя.
Так, в следующих аргументах:
-
'public' => true
задает видимость пользовательского типа записи как на панели управления администратора, так и в клиентской части. -
'menu_position' => 15
задает, где в меню, будет находиться пользовательский тип записи. -
'supports' => array( 'title', 'editor', 'comments', 'thumbnail', 'custom-fields' )
задает те атрибуты пользовательского типа записи, которые будут отображаться. -
'taxonomies' => array( '' )
создает пользовательские таксономии. В данном случае они не определены. -
'menu_icon' => plugins_url( 'images/image.png', __FILE__ )
показывает иконку в меню администратора. -
'has_archive' => true
разрешает архивирование пользовательских типов записей.
Вы можете узнать больше о других аргументах, используемых в пользовательских типах записей на странице WordPress Codex register_post_type
.
Шаг 6: Иконка для пользовательского типа записей
Сохраните иконку размером 16x16 пикселей в вашей папке с плагином. Это нужно для того, чтобы на панели управления у пользовательского типа записи была иконка.
Шаг 7: Активируйте плагин
Активируйте плагин, и вуаля, у вас есть пользовательский тип записи с возможностью редактировать текст, настройками для публикации, изображений, комментариев, а также редактор пользовательских полей.

Шаг 8: Добавляем новую запись
Выберите Добавить новую, чтобы открыть панель редактирования пользовательского типа записи. Добавьте название фильма, текст обзора, а также выберите миниатюру изображения.
Шаг 9: Публикуем
Опубликуйте запись и нажмите View Movie Review, чтобы увидеть созданный кинообзор.
Создание дополнительных полей для пользовательских типов записей
Механизм дополнительных полей (метабоксов) использует встроенную в WordPress систему дополнительных полей. Это помогает добавлять поля, предназначенные исключительно для пользовательских типов записей, не используя в редакторе пользовательских полей по умолчанию.
Шаг 1: Регистрируем пользовательскую функцию
Откройте файл Movie-Reviews.php и добавьте следующий код перед тегом закрытия. Этот код регистрирует функцию, которая будет вызываться при посещении панели администратора WordPress.
add_action( 'admin_init', 'my_admin' );
Шаг 2: Выполняем пользовательскую функцию
Добавьте выполнение функции my_admin
, которая регистрирует дополнительные поля и связывает их с пользовательским типом записи movie_reviews
.
function my_admin() { add_meta_box( 'movie_review_meta_box', 'Movie Review Details', 'display_movie_review_meta_box', 'movie_reviews', 'normal', 'high' ); }
В данном случае функция add_meta_box
используется для добавления дополнительных полей к пользовательскому типу записей. Об атрибутах:
-
movie_review_meta_box
необходимый атрибут для HTMLid
-
Movie Review Details
текст, которые будет виден в заголовке дополнительного поля -
display_movie_review_meta_box
функция обратного вызова которая отображает содержимое дополнительных полей -
movie_review
имя пользовательского типа записи, где будут отображаться дополнительные поля -
normal
определяет где на странице будет показан блок редактирования -
high
определяет приоритет отображаемых полей
Шаг 3: Выполняем функцию display_movie_review_meta_box
<?php function display_movie_review_meta_box( $movie_review ) { // Retrieve current name of the Director and Movie Rating based on review ID $movie_director = esc_html( get_post_meta( $movie_review->ID, 'movie_director', true ) ); $movie_rating = intval( get_post_meta( $movie_review->ID, 'movie_rating', true ) ); ?> <table> <tr> <td style="width: 100%">Movie Director</td> <td><input type="text" size="80" name="movie_review_director_name" value="<?php echo $movie_director; ?>" /></td> </tr> <tr> <td style="width: 150px">Movie Rating</td> <td> <select style="width: 100px" name="movie_review_rating"> <?php // Generate all items of drop-down list for ( $rating = 5; $rating >= 1; $rating -- ) { ?> <option value="<?php echo $rating; ?>" <?php echo selected( $rating, $movie_rating ); ?>> <?php echo $rating; ?> stars <?php } ?> </select> </td> </tr> </table> <?php } ?>
Этот код выводит содержимое дополнительных полей. Здесь используется объектная переменная, которая содержит информацию о каждом из показанных на панели редактирования кинообзоров. Используя этот объект мы получили ID записи и использовали его, чтобы сделать запрос в базу данных для получения имени режиссера и рейтинга, что в свою очередь выведется в полях на экране. При добавлении новой записи, функция get_post_meta
возвратит пустую строку, и в итоге дополнительные поля будут пустыми.
Шаг 4: Регистрируем функцию сохранения записи
add_action( 'save_post', 'add_movie_review_fields', 10, 2 );
Эта функция вызывается при сохранении записи в базе данных.
Шаг 5: Выполняем функцию add_movie_review_fields
function add_movie_review_fields( $movie_review_id, $movie_review ) { // Check post type for movie reviews if ( $movie_review->post_type == 'movie_reviews' ) { // Store data in post meta table if present in post data if ( isset( $_POST['movie_review_director_name'] ) && $_POST['movie_review_director_name'] != '' ) { update_post_meta( $movie_review_id, 'movie_director', $_POST['movie_review_director_name'] ); } if ( isset( $_POST['movie_review_rating'] ) && $_POST['movie_review_rating'] != '' ) { update_post_meta( $movie_review_id, 'movie_rating', $_POST['movie_review_rating'] ); } } }
Эта функция выполняется когда записи сохраняются или удаляются в панели администратора. В данном случае, тип получаемой записи проверяется, и, в том случае, если запись является пользовательской, вновь проводится проверка, есть ли у дополнительных полей какие-либо значения, и далее эти значения в этих полях сохраняются.
Шаг 6: Отключаем стандартные пользовательские поля
Создавая пользовательский тип записи, мы задали функцию create_movie_review
. Удалите элемент custom-fields
из массива supports
, поскольку он нам больше не понадобиться. Теперь, если вы сохраните файл и откроете панель редактирования Movie Reviews, вы увидите два поля в дополнительных полях: Movie Author и Movie Rating. Вы можете добавить другие элементы тем же способом.

Создание шаблона для пользовательского типа записи
Правильным будет для каждого типа пользовательских записей использовать свои шаблоны для отображения данных. В нашем случае мы создадим шаблон, которые выводит все кинообзоры, которые были добавлены с использованием пользовательского типа записи Movie Review.
Шаг 1: Регистрируем функцию запуска шаблона
Откройте файл Movie-Reviews.php и перед тегом закрытия добавьте следующий код. Этот код регистрирует функцию, которая будет вызываться при посещении панели администратора WordPress.
add_filter( 'template_include', 'include_template_function', 1 );
Шаг 2: Выполняем функцию
function include_template_function( $template_path ) { if ( get_post_type() == 'movie_reviews' ) { if ( is_single() ) { // checks if the file exists in the theme first, // otherwise serve the file from the plugin if ( $theme_file = locate_template( array ( 'single-movie_reviews.php' ) ) ) { $template_path = $theme_file; } else { $template_path = plugin_dir_path( __FILE__ ) . '/single-movie_reviews.php'; } } } return $template_path; }
Здесь проверяется, есть ли в текущей папке темы шаблон типа single-(post-type-name).php. Если его там нет, то проверяется наличие шаблона в папке с плагином, куда мы и поместим наш шаблон, как часть плагина. Событийный обработчик (хук) template_include
используется, чтобы изменить обычное выполнение программы и принудительно запустить специальный шаблон.
Шаг 3: Создаем файл шаблона Single Page
Сохранив ранее открытый файл с плагином, создайте другой файл с именем single-movie_reviews.php и вставьте в него следующий код.
<?php /*Template Name: New Template */ get_header(); ?> <div id="primary"> <div id="content" role="main"> <?php $mypost = array( 'post_type' => 'movie_reviews', ); $loop = new WP_Query( $mypost ); ?> <?php while ( $loop->have_posts() ) : $loop->the_post();?> <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <header class="entry-header"> <!-- Display featured image in right-aligned floating div --> <div style="float: right; margin: 10px"> <?php the_post_thumbnail( array( 100, 100 ) ); ?> </div> <!-- Display Title and Author Name --> <strong>Title: </strong><?php the_title(); ?><br /> <strong>Director: </strong> <?php echo esc_html( get_post_meta( get_the_ID(), 'movie_director', true ) ); ?> <br /> <!-- Display yellow stars based on rating --> <strong>Rating: </strong> <?php $nb_stars = intval( get_post_meta( get_the_ID(), 'movie_rating', true ) ); for ( $star_counter = 1; $star_counter <= 5; $star_counter++ ) { if ( $star_counter <= $nb_stars ) { echo '<img src="' . plugins_url( 'Movie-Reviews/images/icon.png' ) . '" />'; } else { echo '<img src="' . plugins_url( 'Movie-Reviews/images/grey.png' ). '" />'; } } ?> </header> <!-- Display movie review contents --> <div class="entry-content"><?php the_content(); ?></div> </article> <?php endwhile; ?> </div> </div> <?php wp_reset_query(); ?> <?php get_footer(); ?>
В данном случае мы создали базовый шаблон страницы с использованием цикла. Функция query_posts
получает элементы пользовательского типа записей и отображает их используя цикличность. Это конечно совсем простой цикл, вы можете менять его, как вам необходимо. Вы также можете использовать необходимые CSS стили, чтобы поменять внешнее оформление.
Шаг 4: Изображения
Сохраните два изображения с иконками для звездочек размером 32x32 пикселя в вашу папку с плагином. Назовите их соответственно icon.png и grey.png. Вот и все, теперь кинообзоры показываются на отдельной странице и отсортированы по дате.

В следующем уроке я опишу другие возможности пользовательских типов записей, такие как создание архивных страниц, собственных таксономий и колонок, и т.д. Не стесняйтесь поделиться своими предложениями.
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post