В WordPress по умолчанию есть несколько типов записей: публикации, страницы, вложения и т.д. Но часто возникает необходимость создать собственный уникальный тип записи (Custom Post Type, CPT), который позволит структурировать контент более гибко и удобно. В этой статье мы подробно разберем, как правильно добавить уникальные типы записей в WordPress с помощью кода, без плагинов, а также рассмотрим практические примеры и полезные советы для разработчиков.
Что такое уникальные типы записей и зачем они нужны в WordPress?
Уникальные типы записей — это расширение стандартной модели контента WordPress. Они позволяют создавать отдельные категории контента, которые не смешиваются с обычными постами или страницами. Например, если у вас сайт с каталогом книг, вы можете создать тип записи "Книги", чтобы удобно управлять таким контентом.
Преимущества использования CPT:
- Четкая организация и разделение контента;
- Удобство для администраторов и редакторов;
- Возможность создавать отдельные шаблоны отображения для разных типов;
- Улучшение SEO за счет семантической структуры.
На wp-kit.ru мы часто рекомендуем использовать уникальные типы записей для сложных проектов, чтобы избежать путаницы и облегчить управление сайтом.
Регистрация уникального типа записи с помощью функции wp_kit_register_custom_post_type()
Для добавления собственного типа записи в WordPress используется функция register_post_type(). Мы создадим на базе её простой обертку wp_kit_register_custom_post_type(), чтобы упрощать повторное использование кода и стандартизировать регистрацию CPT.
function wp_kit_register_custom_post_type($slug, $singular_name, $plural_name, $args = array()) {
$labels = array(
'name' => $plural_name,
'singular_name' => $singular_name,
'menu_name' => $plural_name,
'name_admin_bar' => $singular_name,
'add_new' => 'Добавить новый',
'add_new_item' => 'Добавить новый ' . $singular_name,
'new_item' => 'Новый ' . $singular_name,
'edit_item' => 'Редактировать ' . $singular_name,
'view_item' => 'Просмотреть ' . $singular_name,
'all_items' => 'Все ' . $plural_name,
'search_items' => 'Поиск ' . $plural_name,
'parent_item_colon' => 'Родительский ' . $plural_name,
'not_found' => 'Не найдено',
'not_found_in_trash' => 'Не найдено в корзине',
);
$default_args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => $slug),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 20,
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
);
$args = array_merge($default_args, $args);
register_post_type($slug, $args);
}
add_action('init', function() {
wp_kit_register_custom_post_type('book', 'Книга', 'Книги');
});
В этом примере мы создали тип записи "Книга" с базовыми параметрами. Функция позволяет легко добавлять новые CPT, переопределяя или дополняя аргументы.
Пояснения по аргументам регистрации
Обратите внимание на ключевые параметры:
public— определяет, доступен ли тип на фронтенде;rewrite— настраивает ЧПУ для типа записи;supports— какие возможности редактора поддерживаются (заголовок, редактор, миниатюры и т.п.);has_archive— включить ли архивную страницу для типа записи.
Настройка этих параметров позволяет максимально подстроить CPT под ваши задачи.
Добавление мета-полей к уникальным типам записей
Для расширенной структуры данных часто требуется добавить собственные мета-поля к CPT. Рассмотрим пример добавления мета-поля "Год издания" для типа "Книга".
function wp_kit_add_book_year_meta_box() {
add_meta_box(
'wp_kit_book_year',
'Год издания',
'wp_kit_book_year_meta_box_callback',
'book',
'side'
);
}
function wp_kit_book_year_meta_box_callback($post) {
wp_nonce_field('wp_kit_save_book_year', 'wp_kit_book_year_nonce');
$value = get_post_meta($post->ID, '_wp_kit_book_year', true);
echo '<label for="wp_kit_book_year_field">Введите год издания:</label> ';
echo '<input type="number" id="wp_kit_book_year_field" name="wp_kit_book_year_field" value="' . esc_attr($value) . '" min="1500" max="2100" style="width:100%;" />';
}
function wp_kit_save_book_year_meta_box_data($post_id) {
if (!isset($_POST['wp_kit_book_year_nonce'])) {
return;
}
if (!wp_verify_nonce($_POST['wp_kit_book_year_nonce'], 'wp_kit_save_book_year')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (!isset($_POST['wp_kit_book_year_field'])) {
return;
}
$year = intval($_POST['wp_kit_book_year_field']);
if ($year < 1500 || $year > 2100) {
// Некорректный год, игнорируем
return;
}
update_post_meta($post_id, '_wp_kit_book_year', $year);
}
add_action('add_meta_boxes', 'wp_kit_add_book_year_meta_box');
add_action('save_post', 'wp_kit_save_book_year_meta_box_data');
Этот код добавляет удобное поле в админке для ввода года издания книги, сохраняет данные корректно и защищает их от подделок с помощью nonce.
Вывод уникальных типов записей на фронтенде с кастомным шаблоном
После создания CPT и добавления мета-полей важно правильно вывести контент на сайте. Рассмотрим пример вывода списка книг с их годом издания.
$args = array(
'post_type' => 'book',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC'
);
$books = new WP_Query($args);
if ($books->have_posts()) :
echo '<ul class="wp-kit-book-list">';
while ($books->have_posts()) : $books->the_post();
$year = get_post_meta(get_the_ID(), '_wp_kit_book_year', true);
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a>';
if ($year) {
echo ' (' . esc_html($year) . ')';
}
echo '</li>';
endwhile;
echo '</ul>';
wp_reset_postdata();
else :
echo '<p>Книги не найдены.</p>';
endif;
Такой код можно вставить в шаблон темы или в кастомный плагин. Он выведет список с названием книги и годом издания, если он указан.
Полезные плагины для работы с уникальными типами записей
Хотя регистрация CPT кодом дает максимальный контроль, иногда удобнее использовать плагины для визуального создания и управления. Вот несколько проверенных вариантов:
- Custom Post Type UI — популярный плагин для создания и управления CPT и таксономиями без кода;
- Advanced Custom Fields (ACF) — мощный инструмент для добавления мета-полей и удобного управления ими;
- Clearfy Pro — комплексный плагин оптимизации и настройки, поддерживает работу с CPT.
Используйте эти плагины, если хотите ускорить разработку или добавить расширенный функционал без глубокого программирования.
Подводные камни и рекомендации при работе с CPT
Несколько важных моментов, которые стоит учитывать:
- Всегда используйте уникальные префиксы в названиях функций и мета-полей, чтобы избежать конфликтов. В нашем примере это префикс
wp_kit_. - После регистрации CPT проверьте работу ЧПУ — иногда необходимо обновить настройки постоянных ссылок (
Настройки > Постоянные ссылки) для корректной работы URL. - Для сложных проектов продумывайте архитектуру CPT и таксономий заранее, чтобы избежать дублирования и избыточности.
- Если планируете создавать много кастомных типов, рассмотрите использование классов и более структурированного подхода к коду.
Таким образом, уникальные типы записей — мощный инструмент для расширения функционала WordPress. Они позволяют создавать удобные, структурированные и масштабируемые решения для любого сайта.