В WordPress стандартно предусмотрены несколько типов записей: записи (posts), страницы (pages), вложения и некоторые другие. Однако зачастую для организации контента требуется создавать собственные типы записей — custom post types (CPT). Они позволяют расширить функциональность сайта, структурировать данные и сделать админку удобнее для пользователя.
Что такое custom post types и зачем они нужны в WordPress
Пользовательские типы записей — это способ добавить в WordPress новые сущности, которые ведут себя как стандартные записи, но имеют собственные свойства и логику. Например, если у вас сайт с каталогом товаров, событиями, отзывами или портфолио, лучше создать для каждого из них отдельный тип записи. Это упрощает управление контентом и позволяет создавать уникальные шаблоны отображения.
Основные преимущества CPT:
- Разделение контента по типам.
- Возможность задать уникальные поля и таксономии.
- Улучшение UX в админке — свои меню и фильтры.
- Гибкость для тем и плагинов.
Давайте разберемся, как создать собственный тип записи на примере сайта с заказами — например, "Заказы" для сайта wporders.ru.
Регистрация custom post type: базовый пример кода
Для регистрации собственного типа записей используется функция register_post_type(). Лучше это делать через хук init, чтобы регистрация происходила при инициализации WordPress.
Вот пример функции, которую можно добавить в файл functions.php вашей темы или в плагин:
function wporders_register_post_type_orders() {
$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' => false, // делаем тип приватным, не отображается на сайте
'publicly_queryable' => false,
'show_ui' => true, // показывать в админке
'show_in_menu' => true, // показывать в меню админки
'query_var' => true,
'rewrite' => array('slug' => 'orders'),
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => false,
'menu_position' => 5,
'menu_icon' => 'dashicons-cart',
'supports' => array('title', 'editor', 'custom-fields')
);
register_post_type('wporders_order', $args);
}
add_action('init', 'wporders_register_post_type_orders');Этот код создаст в админке WordPress раздел "Заказы" с возможностью добавлять новые записи этого типа. Обратите внимание, что мы задаём public = false, так как заказы обычно не должны быть видны на публичной части сайта.
Добавление мета-полей для custom post type
Чтобы хранить дополнительные данные заказа, например, номер клиента, сумму, статус, нужно добавить мета-поля. Для этого можно использовать стандартный интерфейс WordPress — мета боксы (meta boxes) или плагины, например Advanced Custom Fields (ACF). Но для полноты примера рассмотрим, как добавить метабокс программно.
Пример добавления метабокса:
function wporders_add_meta_boxes() {
add_meta_box(
'wporders_order_details',
'Детали заказа',
'wporders_order_details_callback',
'wporders_order',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'wporders_add_meta_boxes');
function wporders_order_details_callback($post) {
wp_nonce_field('wporders_save_order_details', 'wporders_order_nonce');
$customer_name = get_post_meta($post->ID, '_wporders_customer_name', true);
$order_amount = get_post_meta($post->ID, '_wporders_order_amount', true);
?>
<p><label for="wporders_customer_name">Имя клиента:</label><br />
<input type="text" id="wporders_customer_name" name="wporders_customer_name" value="<?php echo esc_attr($customer_name); ?>" size="25" /></p>
<p><label for="wporders_order_amount">Сумма заказа:</label><br />
<input type="number" id="wporders_order_amount" name="wporders_order_amount" value="<?php echo esc_attr($order_amount); ?>" step="0.01" /></p>
<?php
}
function wporders_save_order_details($post_id) {
if (!isset($_POST['wporders_order_nonce']) || !wp_verify_nonce($_POST['wporders_order_nonce'], 'wporders_save_order_details')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wporders_customer_name'])) {
update_post_meta($post_id, '_wporders_customer_name', sanitize_text_field($_POST['wporders_customer_name']));
}
if (isset($_POST['wporders_order_amount'])) {
update_post_meta($post_id, '_wporders_order_amount', floatval($_POST['wporders_order_amount']));
}
}
add_action('save_post', 'wporders_save_order_details');Этот код добавит в редактор заказа два поля: имя клиента и сумму заказа. Данные сохраняются в мета-полях при сохранении записи.
Фильтрация и вывод custom post type на сайте
Хотя тип заказа мы сделали приватным, иногда нужно вывести список заказов в админке или даже на публичной части сайта (например, для пользователя). Для выборки по типу записи можно использовать WP_Query:
$args = array(
'post_type' => 'wporders_order',
'posts_per_page' => 10,
'meta_query' => array(
array(
'key' => '_wporders_customer_name',
'value' => 'Иван',
'compare' => 'LIKE'
)
)
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<h3>' . get_the_title() . '</h3>';
echo '<p>Сумма: ' . get_post_meta(get_the_ID(), '_wporders_order_amount', true) . '</p>';
}
wp_reset_postdata();
} else {
echo '<p>Заказы не найдены.</p>';
}
Таким образом вы можете выводить заказы, фильтруя их по нужным параметрам.
Полезные плагины для работы с custom post types
Если вы не хотите писать код вручную, можно использовать плагины:
- Custom Post Type UI — удобный интерфейс для создания CPT и таксономий без кода.
- Advanced Custom Fields (ACF) — добавление и настройка мета-полей с визуальным редактором.
- Pods — расширенный менеджер кастомных типов и полей с возможностью создания связей.
Для сайта wporders.ru можно комбинировать ручной код и плагины, чтобы получить гибкую и удобную систему управления заказами.
Советы и лучшие практики при работе с custom post types
Работая с CPT в WordPress, учитывайте следующие моменты:
- Используйте уникальные префиксы для названий функций и мета-ключей, чтобы избежать конфликтов (например,
wporders_). - Если тип записи не предназначен для публичного просмотра, ставьте
public = falseи отключайте архивы. - Добавляйте поддержку нужных функций через параметр
supports— например, 'title', 'editor', 'custom-fields'. - При добавлении мета-полей обязательно используйте nonce для защиты данных.
- Для сложных проектов лучше использовать кастомные таксономии для категоризации CPT.
Следуя этим рекомендациям, вы создадите надежный и удобный функционал для работы с любым контентом в WordPress.