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 и мета-полей дает полный контроль над функционалом, в то время как плагины упрощают процесс для новичков.
Рекомендуется начать с ручного подхода для понимания работы, а затем, при необходимости, переходить к использованию плагинов и расширений.
Помните, что правильная организация данных и удобный интерфейс для редакторов существенно повышают эффективность работы с сайтом и качественное представление проектов для клиентов.