Как использовать Custom Post Types в WordPress для создания нестираемых структур

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

Что такое Custom Post Types и зачем они нужны в WordPress

Custom Post Types — это пользовательские типы записей, которые расширяют стандартные возможности WordPress, добавляя новые сущности, отличающиеся от обычных записей или страниц. Например, если вы делаете сайт библиотеки, то книги можно оформить отдельным типом записи, а не смешивать с блоговыми статьями.

Преимущества использования CPT:

  • Чёткое разделение контента по типам
  • Возможность создавать свои метаполя и таксономии
  • Удобство в админке и на фронтенде
  • Оптимизация структуры данных и удобство масштабирования

Для нестираемых структур это важно, так как вы точно знаете, что каждый тип записи будет хранить строго определённый набор данных, что упрощает управление и предотвращает ошибки.

Как зарегистрировать Custom Post Type с помощью кода

Самый надёжный и гибкий способ создать CPT — использовать функцию register_post_type(). Ниже пример, как создать тип записи «Проекты» для сайта портфолио:

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

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'has_archive'        => true,
        'rewrite'            => array('slug' => 'projects'),
        'supports'           => array('title', 'editor', 'thumbnail', 'custom-fields'),
        'show_in_rest'       => true,
        'hierarchical'       => true // Важный параметр для вложенности
    );

    register_post_type('wpstuff_project', $args);
}
add_action('init', 'wpstuff_register_projects_cpt');

Обратите внимание на параметр hierarchical. Если установить его в true, CPT будет вести себя как страницы, позволяя создавать вложенные записи — то есть иерархию. Это полезно для нестираемых структур, где элементы могут иметь подэлементы.

Создание иерархии и нестираемых структур с помощью таксономий

Кроме иерархии записей, для организации данных удобно использовать кастомные таксономии (taxonomy). Они позволяют группировать записи по категориям и тегам, создавая дополнительные уровни структуры.

Пример регистрации таксономии «Категории проектов» для CPT «Проекты»:

function wpstuff_register_project_taxonomy() {
    $labels = array(
        'name'              => 'Категории проектов',
        'singular_name'     => 'Категория проекта',
        'search_items'      => 'Искать категории',
        'all_items'         => 'Все категории',
        'parent_item'       => 'Родительская категория',
        'parent_item_colon' => 'Родительская категория:',
        'edit_item'         => 'Редактировать категорию',
        'update_item'       => 'Обновить категорию',
        'add_new_item'      => 'Добавить новую категорию',
        'new_item_name'     => 'Название новой категории',
        'menu_name'         => 'Категории проектов'
    );

    $args = array(
        'hierarchical'      => true,
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array('slug' => 'project-category'),
        'show_in_rest'      => true
    );

    register_taxonomy('wpstuff_project_category', array('wpstuff_project'), $args);
}
add_action('init', 'wpstuff_register_project_taxonomy');

Так вы сможете создавать сложные древовидные структуры категорий и назначать проекты к нескольким категориям, что делает навигацию по сайту удобной и логичной.

Пример использования CPT и таксономий в шаблоне WordPress

Чтобы вывести проекты с их категориями на фронтенде, используйте WP Query для выборки данных:

$args = array(
    'post_type'      => 'wpstuff_project',
    'posts_per_page' => 10,
    'tax_query'      => array(
        array(
            'taxonomy' => 'wpstuff_project_category',
            'field'    => 'slug',
            'terms'    => 'design', // например, категория дизайн
        ),
    ),
);

$query = new WP_Query($args);

if ($query->have_posts()) {
    echo '<ul>';
    while ($query->have_posts()) {
        $query->the_post();
        echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo 'Проекты не найдены';
}

Этот код можно поместить в любой шаблон темы, например, в файл archive-wpstuff_project.php для кастомного архива.

Практические рекомендации и плагины для работы с CPT

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

  • Custom Post Type UI — удобный интерфейс для создания CPT и таксономий без кода;
  • Advanced Custom Fields Pro — для создания кастомных полей, которые расширят возможности ваших CPT;
  • Clearfy Pro — оптимизация и управление CPT и таксономиями.

Рекомендуется придерживаться строгой структуры именования и всегда использовать префиксы, например, wpstuff_, чтобы избежать конфликтов с другими плагинами или темами.

Как обеспечить нестираемость данных и защиту CPT от удаления

Для нестираемых структур важно, чтобы важный контент не был случайно удалён или потерян. Вот несколько рекомендаций:

  • Отключите удаление через админку, например, скрыв кнопку «Удалить» с помощью фильтров;
  • Используйте роли и права доступа, чтобы ограничить возможность удаления CPT только администраторам;
  • Настройте регулярное резервное копирование базы данных, например, с помощью плагина Backup;
  • Реализуйте программное ограничение удаления через хуки, например:
function wpstuff_disable_deleting_projects($maybe_delete, $post_id) {
    $post = get_post($post_id);
    if ($post->post_type === 'wpstuff_project') {
        // Запретить удаление
        return false;
    }
    return $maybe_delete;
}
add_filter('before_delete_post', 'wpstuff_disable_deleting_projects', 10, 2);

Этот код блокирует удаление записей типа «Проект» на уровне ядра WordPress, обеспечивая сохранность данных.

Выводы и советы по использованию Custom Post Types для нестираемых структур

Custom Post Types — мощный инструмент для организации контента в WordPress, особенно если нужно создавать сложные иерархии и устойчивые структуры данных. Правильная регистрация CPT и таксономий, грамотное использование метаполей и ограничение доступа к удалению помогут сделать ваш сайт более структурированным и надёжным.

Для удобства можно использовать плагины, но всегда полезно понимать, как работает код и как настроить всё вручную для максимальной гибкости.

Используйте приведённые примеры кода как шаблон для собственных проектов, адаптируя под свои задачи и требования.

Как удалить кэш плагинов в WordPress при проблемном очищении
17.12.2025
Как сделать автоматический откат обновлений WordPress при ошибках
06.03.2026
Как создать автоматический редирект в WordPress по условиям
14.02.2026
Как создать многоуровневую навигацию в WordPress с примерами кода
18.02.2026
Как добавить автоматическое удаление старых записей в WordPress по дате
01.03.2026