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

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

Что такое Custom Post Types и зачем они нужны для управления проектами

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

Создавая CPT «Проекты», вы отделяете проекты от обычных записей, что упрощает и улучшает администрирование, а также облегчает создание шаблонов вывода.

В нашем случае CPT «Проекты» позволит хранить информацию о названии, описании, статусе, сроках и других параметрах отдельно от блога или страниц сайта.

Создание Custom Post Type «Проекты» вручную через functions.php

Для начала создадим CPT с помощью функции register_post_type. Рекомендуется использовать префикс в названиях функций, чтобы избежать конфликтов. Используем префикс wpabout_.

function wpabout_register_projects_cpt() {
    $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' => 'Поиск проектов',
        'not_found' => 'Проекты не найдены',
        'not_found_in_trash' => 'В корзине проекты не найдены',
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'projects'),
        'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
        'show_in_rest' => true,
        'menu_position' => 5,
        'menu_icon' => 'dashicons-portfolio',
    );

    register_post_type('wpabout_project', $args);
}
add_action('init', 'wpabout_register_projects_cpt');

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

Обратите внимание на параметр 'show_in_rest' => true, который включает поддержку REST API и позволяет использовать редактор Gutenberg.

Добавление пользовательских мета-полей для управления проектами

Чтобы хранить дополнительную информацию о проекте (например, статус, срок выполнения, заказчик), необходимо добавить мета-поля. Рассмотрим простой пример добавления мета-бокса для статуса проекта.

Добавим мета-бокс в админку:

function wpabout_add_project_meta_boxes() {
    add_meta_box(
        'wpabout_project_status',
        'Статус проекта',
        'wpabout_project_status_meta_box_callback',
        'wpabout_project',
        'side'
    );
}
add_action('add_meta_boxes', 'wpabout_add_project_meta_boxes');

function wpabout_project_status_meta_box_callback($post) {
    $value = get_post_meta($post->ID, '_wpabout_project_status', true);
    ?>
    <label for="wpabout_project_status_field">Выберите статус проекта:</label>
    <select name="wpabout_project_status_field" id="wpabout_project_status_field">
        <option value="planned" <?php selected($value, 'planned'); ?>>Запланирован</option>
        <option value="in-progress" <?php selected($value, 'in-progress'); ?>>В работе</option>
        <option value="completed" <?php selected($value, 'completed'); ?>>Завершён</option>
    </select>
    <?php
}

function wpabout_save_project_meta_box_data($post_id) {
    if (array_key_exists('wpabout_project_status_field', $_POST)) {
        update_post_meta(
            $post_id,
            '_wpabout_project_status',
            sanitize_text_field($_POST['wpabout_project_status_field'])
        );
    }
}
add_action('save_post', 'wpabout_save_project_meta_box_data');

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

Использование плагинов для создания и управления Custom Post Types

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

  • Custom Post Type UI — удобный интерфейс для создания CPT и таксономий без кода.
  • Advanced Custom Fields (ACF) — мощный плагин для создания и управления мета-полями с удобным интерфейсом и множеством типов полей.

Пример: используя CPT UI создайте CPT «Проекты», а с помощью ACF добавьте поля «Статус проекта», «Дата начала» и «Дата окончания». Это позволит гибко настраивать и расширять структуру данных без программирования.

Вывод проектов на сайте с фильтрацией по статусу

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

Пример вывода проектов со статусом «В работе»:

$args = array(
    'post_type' => 'wpabout_project',
    'meta_query' => array(
        array(
            'key' => '_wpabout_project_status',
            'value' => 'in-progress',
            'compare' => '=',
        ),
    ),
);
$query = new WP_Query($args);

if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        echo '<h3>' . get_the_title() . '</h3>';
        the_content();
    }
} else {
    echo '<p>Проекты не найдены.</p>';
}
wp_reset_postdata();

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

Автоматизация и улучшения: таксономии и статусные уведомления

Для более удобного управления проектами стоит добавить собственные таксономии, например «Клиенты», «Типы проектов». Это позволит структурировать данные и создавать более точные выборки.

Пример регистрации таксономии «Клиенты»:

function wpabout_register_clients_taxonomy() {
    $labels = array(
        'name' => 'Клиенты',
        'singular_name' => 'Клиент',
        'search_items' => 'Поиск клиентов',
        'all_items' => 'Все клиенты',
        'edit_item' => 'Редактировать клиента',
        'add_new_item' => 'Добавить нового клиента',
        'menu_name' => 'Клиенты',
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'hierarchical' => true,
        'show_in_rest' => true,
        'rewrite' => array('slug' => 'clients'),
    );

    register_taxonomy('wpabout_client', 'wpabout_project', $args);
}
add_action('init', 'wpabout_register_clients_taxonomy');

Также можно настроить уведомления по email при смене статуса проекта, используя хуки save_post и функции отправки почты WordPress.

Пример отправки уведомления при смене статуса

function wpabout_notify_status_change($post_id) {
    if (get_post_type($post_id) != 'wpabout_project') return;

    $old_status = get_post_meta($post_id, '_wpabout_old_status', true);
    $new_status = get_post_meta($post_id, '_wpabout_project_status', true);

    if ($old_status !== $new_status) {
        $post = get_post($post_id);
        $to = 'manager@example.com';
        $subject = 'Статус проекта изменён';
        $message = 'Проект "' . $post->post_title . '" изменил статус с ' . $old_status . ' на ' . $new_status . '.';
        wp_mail($to, $subject, $message);
        update_post_meta($post_id, '_wpabout_old_status', $new_status);
    }
}
add_action('save_post_wpabout_project', 'wpabout_notify_status_change');

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

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

Использование CPT для управления проектами в WordPress позволяет создать гибкую и расширяемую систему, адаптированную под конкретные нужды. Ручная регистрация CPT и мета-полей дает полный контроль над функционалом, в то время как плагины упрощают процесс для новичков.

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

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

WooCommerce: автоматическое изменение стоимости товара при изменении атрибутов
06.09.2026
Как изменить метаданные, отображаемые в сниппетах WordPress
15.09.2026
Удаление неиспользуемых таксономий в WordPress: практическое руководство
23.09.2026
WooCommerce: как добавить пользовательское поле в форму оформления заказа
02.09.2026
Как использовать WPRemark для автоматического удаления спама в комментариях WordPress
15.09.2026