Как создать уникальный тип записи в WordPress с поддержкой метаданных

В WordPress создание собственных типов записей (Custom Post Types, CPT) позволяет расширять возможности сайта и структурировать контент по своим потребностям. В этой статье мы подробно разберём, как создать уникальный тип записи с поддержкой метаданных (кастомных полей), чтобы хранить дополнительную информацию и удобно работать с ней в админ-панели.

Что такое тип записи и зачем создавать собственный

Тип записи — это категория контента в WordPress. По умолчанию есть несколько типов, например, post (записи блога), page (страницы), attachment (медиафайлы). Но часто на проектах нужны свои типы, например, портфолио, отзывы, события и т.д.

Создание собственного типа записи упрощает работу с контентом, позволяет задать удобные метаданные, шаблоны отображения и фильтры. Это гораздо лучше, чем использовать стандартные записи и пытаться различать их вручную.

Регистрация уникального типа записи в WordPress

Для регистрации CPT в WordPress существует функция register_post_type(). Рассмотрим пример создания типа записи project для портфолио.

function wpdesk_register_post_type_project() {
    $labels = array(
        'name' => 'Проекты',
        'singular_name' => 'Проект',
        'add_new' => 'Добавить проект',
        'add_new_item' => 'Добавить новый проект',
        'edit_item' => 'Редактировать проект',
        'new_item' => 'Новый проект',
        'view_item' => 'Просмотреть проект',
        'search_items' => 'Искать проекты',
        'not_found' => 'Проекты не найдены',
        'not_found_in_trash' => 'В корзине проекты не найдены',
        'menu_name' => 'Проекты'
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'menu_position' => 5,
        'menu_icon' => 'dashicons-portfolio',
        'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
        'show_in_rest' => true // Для поддержки Gutenberg
    );

    register_post_type('project', $args);
}
add_action('init', 'wpdesk_register_post_type_project');

Этот код регистрирует новый тип записи 'project' с поддержкой заголовка, контента, миниатюры и выдержки.

Добавление метаданных к типу записи

Метаданные позволяют хранить дополнительную информацию, например, дату завершения проекта, ссылку на репозиторий, описание технологии и т.д. Для этого нужно создать мета-боксы в админке и сохранять данные.

Создание мета-бокса

Используем хук add_meta_boxes для добавления своего поля.

function wpdesk_add_meta_boxes_project() {
    add_meta_box(
        'wpdesk_project_info',
        'Информация о проекте',
        'wpdesk_render_meta_box_project_info',
        'project',
        'normal',
        'default'
    );
}
add_action('add_meta_boxes', 'wpdesk_add_meta_boxes_project');

function wpdesk_render_meta_box_project_info($post) {
    // Безопасность
    wp_nonce_field('wpdesk_save_project_info', 'wpdesk_project_nonce');

    // Получаем сохранённые значения
    $project_date = get_post_meta($post->ID, '_wpdesk_project_date', true);
    $project_github = get_post_meta($post->ID, '_wpdesk_project_github', true);

    echo '<p><label for="wpdesk_project_date">Дата завершения проекта:</label><br>';
    echo '<input type="date" id="wpdesk_project_date" name="wpdesk_project_date" value="' . esc_attr($project_date) . '" /></p>';

    echo '<p><label for="wpdesk_project_github">Ссылка на GitHub:</label><br>';
    echo '<input type="url" id="wpdesk_project_github" name="wpdesk_project_github" value="' . esc_attr($project_github) . '" size="50" /></p>';
}

Сохранение метаданных

Для сохранения используем хук save_post. Важно проверять nonce и права пользователя.

function wpdesk_save_project_info($post_id) {
    if (!isset($_POST['wpdesk_project_nonce']) || !wp_verify_nonce($_POST['wpdesk_project_nonce'], 'wpdesk_save_project_info')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    if (isset($_POST['wpdesk_project_date'])) {
        update_post_meta($post_id, '_wpdesk_project_date', sanitize_text_field($_POST['wpdesk_project_date']));
    }
    if (isset($_POST['wpdesk_project_github'])) {
        update_post_meta($post_id, '_wpdesk_project_github', esc_url_raw($_POST['wpdesk_project_github']));
    }
}
add_action('save_post', 'wpdesk_save_project_info');

Вывод метаданных на фронтенде

Для отображения информации о проекте на сайте используйте стандартные шаблонные теги и функции.

<?php
$project_date = get_post_meta(get_the_ID(), '_wpdesk_project_date', true);
$project_github = get_post_meta(get_the_ID(), '_wpdesk_project_github', true);
?>

<div class="project-info">
    <p><strong>Дата завершения:</strong> <?php echo esc_html($project_date); ?></p>
    <p><strong>GitHub:</strong> <a href="<?php echo esc_url($project_github); ?>" target="_blank" rel="nofollow">Ссылка на репозиторий</a></p>
</div>

Полезные плагины для работы с типами записей и метаданными

Если хочется упростить создание CPT и метаполей, можно использовать плагины:

  • Clearfy Pro — плагин с функциями оптимизации и расширения WordPress, включая удобные инструменты для CPT и мета.
  • WPRemark — расширенный редактор и менеджер метаданных для типов записей.

Использование этих плагинов поможет сэкономить время и избежать ошибок при создании сложных структур данных.

Особенности и рекомендации при работе с CPT и метаданными

Создавая собственные типы записей, помните:

  • Всегда регистрируйте CPT на хуке init, чтобы быть уверенным, что все функции WordPress загружены.
  • Используйте префиксы в названиях функций и метаполей, например, wpdesk_, чтобы избежать конфликтов с другими плагинами.
  • Обязательно проверяйте права пользователя и nonce при сохранении метаданных для безопасности.
  • Для удобства работы с Gutenberg добавляйте параметр show_in_rest = true.
  • При необходимости создавайте отдельные шаблоны для отображения CPT, например, single-project.php.

Выводы

Создание уникального типа записи с метаданными — мощный инструмент для кастомизации сайта на WordPress. Такой подход поможет структурировать сложный контент, улучшить работу редакторов и создать удобный интерфейс для пользователей. Код в статье — базовый шаблон, который вы можете адаптировать под свои задачи.

⭐⭐⭐⭐⭐