Введение в кастомные типы записей и метаполя WordPress
В WordPress помимо стандартных типов записей, таких как посты и страницы, можно создавать собственные — кастомные типы записей (Custom Post Types, CPT). Это позволяет структурировать контент под конкретные задачи: портфолио, отзывы, товары, события и многое другое. В сочетании с метаполями — дополнительными полями для хранения уникальных данных — CPT превращаются в мощный инструмент для создания сложных сайтов.
В этой статье мы расскажем, как программно зарегистрировать кастомный тип записи с поддержкой метаполей, рассмотрим примеры кода и разберём, как использовать плагины для упрощения работы.
Регистрация кастомного типа записи в WordPress
Для начала создадим кастомный тип записи «Курс» (например, для сайта wp-course.ru это актуально). Для регистрации используем функцию register_post_type. Рекомендуется добавлять этот код в файл functions.php темы или в свой плагин.
add_action('init', 'wp_course_register_post_type_course');
function wp_course_register_post_type_course() {
$labels = [
'name' => 'Курсы',
'singular_name' => 'Курс',
'menu_name' => 'Курсы',
'add_new' => 'Добавить курс',
'add_new_item' => 'Добавить новый курс',
'edit_item' => 'Редактировать курс',
'new_item' => 'Новый курс',
'view_item' => 'Просмотреть курс',
'search_items' => 'Поиск курсов',
'not_found' => 'Курсы не найдены',
'not_found_in_trash' => 'В корзине курсы не найдены',
];
$args = [
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => ['slug' => 'courses'],
'supports' => ['title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'],
'show_in_rest' => true // для поддержки Gutenberg и REST API
];
register_post_type('wp_course_course', $args);
}После добавления и обновления пермалинков в админке, появится новый раздел «Курсы».
Добавление метаполей: зачем и как
Метаполя позволяют добавить к курсу дополнительные данные: цену, длительность, ссылку на видео и пр. Рассмотрим два способа: вручную через код и с помощью плагина.
Добавление метаполей вручную через код
Для добавления метаполей в редактор используем хуки add_meta_boxes и сохраняем данные через save_post.
add_action('add_meta_boxes', 'wp_course_add_course_meta_box');
function wp_course_add_course_meta_box() {
add_meta_box(
'wp_course_meta',
'Дополнительные данные курса',
'wp_course_render_meta_box',
'wp_course_course',
'normal',
'default'
);
}
function wp_course_render_meta_box($post) {
wp_nonce_field('wp_course_save_meta_box', 'wp_course_meta_box_nonce');
$price = get_post_meta($post->ID, '_wp_course_price', true);
$duration = get_post_meta($post->ID, '_wp_course_duration', true);
echo '<label for="wp_course_price">Цена (руб.)</label><br>';
echo '<input type="number" id="wp_course_price" name="wp_course_price" value="' . esc_attr($price) . '" style="width:100%;"><br><br>';
echo '<label for="wp_course_duration">Длительность (часов)</label><br>';
echo '<input type="number" id="wp_course_duration" name="wp_course_duration" value="' . esc_attr($duration) . '" style="width:100%;">';
}
add_action('save_post', 'wp_course_save_meta_box_data');
function wp_course_save_meta_box_data($post_id) {
if (!isset($_POST['wp_course_meta_box_nonce'])) return;
if (!wp_verify_nonce($_POST['wp_course_meta_box_nonce'], 'wp_course_save_meta_box')) return;
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
if (isset($_POST['wp_course_price'])) {
update_post_meta($post_id, '_wp_course_price', sanitize_text_field($_POST['wp_course_price']));
}
if (isset($_POST['wp_course_duration'])) {
update_post_meta($post_id, '_wp_course_duration', sanitize_text_field($_POST['wp_course_duration']));
}
}Теперь при создании или редактировании курса можно указать цену и длительность.
Использование плагина Advanced Custom Fields для метаполей
Если хочется упростить работу и добавить метаполя без кода, отлично подойдёт плагин Advanced Custom Fields (ACF). Он позволяет создавать удобные группы полей в админке, поддерживает разные типы данных и вывод значений в шаблонах.
После установки плагина создайте группу полей, привяжите её к типу записи «Курсы», добавьте поля «Цена» и «Длительность».
Вывод кастомного типа записи и метаполей в шаблоне
Для отображения курсов на сайте нужно создать шаблон или использовать WP_Query. Пример вывода списка курсов с ценой и длительностью:
$args = [
'post_type' => 'wp_course_course',
'posts_per_page' => 10
];
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul class="wp-course-list">';
while ($query->have_posts()) {
$query->the_post();
$price = get_post_meta(get_the_ID(), '_wp_course_price', true);
$duration = get_post_meta(get_the_ID(), '_wp_course_duration', true);
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> - ';
echo 'Цена: ' . esc_html($price) . ' руб., ';
echo 'Длительность: ' . esc_html($duration) . ' часов</li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Курсы не найдены.</p>';
}Этот код можно вставить в шаблон темы или в файл page-courses.php, чтобы вывести страницу со всеми курсами.
Рекомендации по безопасности и производительности
При работе с кастомными типами записей и метаполями важно соблюдать меры безопасности:
- Используйте
wp_nonce_fieldи проверяйте nonce при сохранении данных. - Фильтруйте и санитизируйте пользовательский ввод с помощью функций
sanitize_text_field,esc_htmlи т.д. - Для вывода используйте
esc_htmlили другие функции экранирования.
Также следите за тем, чтобы метаполя не были чрезмерно загружены, особенно если их много — это может снизить производительность запросов.
Заключение
Создание кастомного типа записи с метаполями расширяет возможности WordPress и позволяет создавать специализированные сайты под любые задачи. Выбор между ручным кодом и плагинами зависит от ваших навыков и требований к проекту.
Для ускорения разработки рекомендуем обратить внимание на Clearfy Pro — плагин для оптимизации и управления функционалом WordPress, который также упрощает работу с кастомными типами записей и метаполями.