В WordPress есть множество возможностей для расширения базового функционала сайта. Одним из самых мощных инструментов является создание собственных типов записей (custom post types, CPT). Это позволяет организовать контент более структурированно, отделяя, например, статьи блога от портфолио, отзывов или товаров.
Что такое собственный тип постов и зачем он нужен
По умолчанию WordPress работает с типом постов post для обычных записей и page для страниц. Но часто этого недостаточно. Например, если вы ведёте сайт компании, вам может понадобиться отдельный раздел для отзывов клиентов, проектов, командных участников или событий.
Создавая собственный тип постов, вы можете:
- Упорядочить контент по категориям, отличным от стандартных;
- Настроить индивидуальные метаданные и поля для каждого типа;
- Упростить управление с помощью отдельного меню в админке;
- Оптимизировать вывод и фильтрацию на фронтенде сайта.
Такой подход улучшит юзабилити сайта и позволит создавать более сложные и функциональные решения.
Создание собственного типа постов: пример для wplike_custom_post_type
Для регистрации нового типа постов в WordPress используется функция register_post_type(). Ниже приведён пример кода, который добавляет тип постов portfolio. Мы добавим его через хук init, чтобы регистрация происходила при инициализации WordPress.
function wplike_register_custom_post_type() {
$labels = array(
'name' => 'Портфолио',
'singular_name' => 'Проект',
'menu_name' => 'Портфолио',
'name_admin_bar' => 'Проект',
'add_new' => 'Добавить новый',
'add_new_item' => 'Добавить новый проект',
'new_item' => 'Новый проект',
'edit_item' => 'Редактировать проект',
'view_item' => 'Просмотреть проект',
'all_items' => 'Все проекты',
'search_items' => 'Искать проекты',
'parent_item_colon' => 'Родительский проект:',
'not_found' => 'Проекты не найдены.',
'not_found_in_trash' => 'В корзине проектов не найдено.'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'portfolio'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'thumbnail')
);
register_post_type('portfolio', $args);
}
add_action('init', 'wplike_register_custom_post_type');Этот код добавит в админ-панель новый пункт меню «Портфолио» с возможностью создавать и редактировать записи типа «Проект». Поддерживаются заголовок, редактор и миниатюра.
Объяснение ключевых параметров
public— тип доступен на фронтенде;show_ui— отображение в административной панели;has_archive— включение архивной страницы с URLsite.ru/portfolio/;rewrite— настройки ЧПУ (человеко-понятных URL);supports— какие стандартные поля поддерживает тип записи.
Добавление кастомных полей для собственного типа постов
Часто одного стандартного редактора недостаточно — хочется добавить специфичные данные, например, ссылку на проект, дату завершения или стоимость. Для этого можно использовать метаполя. Самый простой способ — добавить их вручную через функцию add_meta_box().
function wplike_add_custom_meta_box() {
add_meta_box(
'wplike_project_details',
'Детали проекта',
'wplike_project_details_callback',
'portfolio',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'wplike_add_custom_meta_box');
function wplike_project_details_callback($post) {
wp_nonce_field('wplike_save_project_details', 'wplike_project_nonce');
$project_url = get_post_meta($post->ID, '_wplike_project_url', true);
echo '<label for="wplike_project_url">Ссылка на проект:</label>';
echo '<input type="url" id="wplike_project_url" name="wplike_project_url" value="' . esc_attr($project_url) . '" size="25" />';
}
function wplike_save_project_details($post_id) {
if (!isset($_POST['wplike_project_nonce']) || !wp_verify_nonce($_POST['wplike_project_nonce'], 'wplike_save_project_details')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wplike_project_url'])) {
update_post_meta($post_id, '_wplike_project_url', esc_url_raw($_POST['wplike_project_url']));
}
}
add_action('save_post', 'wplike_save_project_details');Этот код добавляет метабокс с полем ввода URL, который сохраняется в метаданных записи. В админке вы сможете вводить ссылку на проект и использовать её в шаблонах.
Вывод собственного типа постов на сайте
Чтобы вывести записи типа portfolio на фронтенде, можно создать отдельный шаблон archive-portfolio.php или использовать WP_Query.
$args = array(
'post_type' => 'portfolio',
'posts_per_page' => 10
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
$project_url = get_post_meta(get_the_ID(), '_wplike_project_url', true);
echo '<li><a href="' . esc_url($project_url) . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Проекты не найдены.</p>';
}Так вы сможете вывести список проектов с ссылками на внешний ресурс, если это необходимо.
Полезные плагины для работы с собственными типами постов
Если вы не хотите писать код вручную, можно использовать плагины:
- Custom Post Type UI — удобный интерфейс для создания и управления типами постов и таксономиями без кода;
- Advanced Custom Fields (ACF) — мощный инструмент для добавления и вывода кастомных полей;
- Pods — расширенный фреймворк для создания CPT, таксономий и полей;
- Toolset Types — комплексный набор для построения сайтов с произвольными типами контента.
Эти плагины значительно ускоряют разработку и подходят для пользователей с разным уровнем знаний.
Советы и лучшие практики при работе с CPT
Несколько рекомендаций, которые помогут избежать проблем:
- Используйте префиксы (например,
wplike_) для функций и метаполей, чтобы не было конфликтов с другими плагинами; - Зарегистрируйте тип постов на хук
init, чтобы быть уверенным, что WordPress готов к регистрации; - Обязательно добавляйте поддержку нужных функций через параметр
supports(например,thumbnail,excerpt); - Создавайте архивные страницы и настраивайте ЧПУ для удобства SEO и навигации;
- Проверяйте права доступа и безопасность при сохранении метаданных.