В современных проектах на WordPress часто возникает необходимость организовать управление задачами прямо внутри админки сайта или на фронтенде. В этой статье я подробно расскажу, как создать персонализированный Task Manager (менеджер задач) в WordPress, который позволит добавлять, редактировать и отслеживать задачи, не прибегая к внешним сервисам.
Почему стоит создать собственный Task Manager в WordPress
Несмотря на наличие множества внешних сервисов для управления задачами, иногда удобнее иметь встроенный инструмент, который:
- Интегрирован с вашей CMS и доступен напрямую из админки.
- Позволяет кастомизировать поля и логику под специфические задачи проекта.
- Не требует дополнительной регистрации и интеграций.
В WordPress для создания таких решений можно использовать произвольные типы записей, пользовательские таксономии и мета-поля. Это позволит создать удобный, гибкий и расширяемый менеджер задач.
Создаем кастомный тип записи Task для задач
Первый шаг — зарегистрировать собственный тип записи, который будет хранить задачи. Для этого добавим следующий код в файл functions.php вашей темы или в отдельный плагин:
function wptasks_register_task_post_type() {
$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' => false,
'show_ui' => true,
'show_in_menu' => true,
'capability_type' => 'post',
'hierarchical' => false,
'supports' => array('title', 'editor'),
'menu_position' => 25,
'menu_icon' => 'dashicons-clipboard',
);
register_post_type('wptasks_task', $args);
}
add_action('init', 'wptasks_register_task_post_type');Этот код создает новый тип записи с названием «Задачи», который будет виден в админке WordPress в отдельном меню. Поддерживаются заголовок и редактор для описания задачи.
Добавляем пользовательские мета-поля для задач
Чтобы сделать менеджер более функциональным, добавим поля для статуса задачи, приоритета и срока выполнения. Для этого используем мета-боксы в админке.
Пример кода для добавления мета-боксов:
function wptasks_add_meta_boxes() {
add_meta_box('wptasks_task_details', 'Детали задачи', 'wptasks_task_details_callback', 'wptasks_task', 'side', 'default');
}
add_action('add_meta_boxes', 'wptasks_add_meta_boxes');
function wptasks_task_details_callback($post) {
wp_nonce_field('wptasks_save_task_meta', 'wptasks_task_meta_nonce');
$status = get_post_meta($post->ID, '_wptasks_status', true);
$priority = get_post_meta($post->ID, '_wptasks_priority', true);
$deadline = get_post_meta($post->ID, '_wptasks_deadline', true);
echo '<p><label for="wptasks_status">Статус задачи:</label><br>';
echo '<select name="wptasks_status" id="wptasks_status">';
$statuses = array('new' => 'Новая', 'in_progress' => 'В работе', 'completed' => 'Завершена');
foreach ($statuses as $key => $label) {
$selected = ($status === $key) ? 'selected' : '';
echo "<option value='$key' $selected>$label</option>";
}
echo '</select></p>';
echo '<p><label for="wptasks_priority">Приоритет:</label><br>';
echo '<select name="wptasks_priority" id="wptasks_priority">';
$priorities = array('low' => 'Низкий', 'medium' => 'Средний', 'high' => 'Высокий');
foreach ($priorities as $key => $label) {
$selected = ($priority === $key) ? 'selected' : '';
echo "<option value='$key' $selected>$label</option>";
}
echo '</select></p>';
echo '<p><label for="wptasks_deadline">Срок выполнения:</label><br>';
echo "<input type='date' id='wptasks_deadline' name='wptasks_deadline' value='$deadline' /></p>";
}
function wptasks_save_task_meta($post_id) {
if (!isset($_POST['wptasks_task_meta_nonce']) || !wp_verify_nonce($_POST['wptasks_task_meta_nonce'], 'wptasks_save_task_meta')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wptasks_status'])) {
update_post_meta($post_id, '_wptasks_status', sanitize_text_field($_POST['wptasks_status']));
}
if (isset($_POST['wptasks_priority'])) {
update_post_meta($post_id, '_wptasks_priority', sanitize_text_field($_POST['wptasks_priority']));
}
if (isset($_POST['wptasks_deadline'])) {
update_post_meta($post_id, '_wptasks_deadline', sanitize_text_field($_POST['wptasks_deadline']));
}
}
add_action('save_post', 'wptasks_save_task_meta');Этот код добавляет в админке блок с выпадающими списками для выбора статуса и приоритета, а также поле для выбора даты срока выполнения. При сохранении данные записываются в мета-поля.
Вывод списка задач с фильтрацией на фронтенде
Чтобы пользователи сайта могли видеть задачи, создадим шорткод, который выведет список задач с возможностью фильтровать по статусу и приоритету.
Пример реализации шорткода:
function wptasks_tasks_list_shortcode($atts) {
$atts = shortcode_atts(array(
'status' => '',
'priority' => '',
), $atts);
$meta_query = array('relation' => 'AND');
if (!empty($atts['status'])) {
$meta_query[] = array(
'key' => '_wptasks_status',
'value' => $atts['status'],
'compare' => '=',
);
}
if (!empty($atts['priority'])) {
$meta_query[] = array(
'key' => '_wptasks_priority',
'value' => $atts['priority'],
'compare' => '=',
);
}
$query = new WP_Query(array(
'post_type' => 'wptasks_task',
'posts_per_page' => -1,
'meta_query' => $meta_query,
'orderby' => 'meta_value',
'meta_key' => '_wptasks_deadline',
'order' => 'ASC',
));
if (!$query->have_posts()) {
return '<p>Задачи не найдены.</p>';
}
$output = '<ul class="wptasks-list">';
while ($query->have_posts()) {
$query->the_post();
$status = get_post_meta(get_the_ID(), '_wptasks_status', true);
$priority = get_post_meta(get_the_ID(), '_wptasks_priority', true);
$deadline = get_post_meta(get_the_ID(), '_wptasks_deadline', true);
$output .= '<li><strong>' . get_the_title() . '</strong> — Статус: ' . esc_html($status) . ', Приоритет: ' . esc_html($priority) . ', Срок: ' . esc_html($deadline) . '<br>' . get_the_content() . '</li>';
}
wp_reset_postdata();
$output .= '</ul>';
return $output;
}
add_shortcode('wptasks_list', 'wptasks_tasks_list_shortcode');Так вы сможете на любой странице или записи вывести список задач с помощью шорткода [wptasks_list status="in_progress" priority="high"]. Можно варьировать параметры для фильтрации.
Использование плагинов для расширения функционала Task Manager
Если вы хотите быстро добавить более сложный функционал, например, назначение задач пользователям, уведомления или интеграцию с календарем, рекомендуются следующие плагины:
- Advanced Custom Fields (ACF) — для удобного создания и управления мета-полями, включая даты и выбор пользователей.
- WP User Frontend — для создания форм добавления и редактирования задач на фронтенде.
- WP Project Manager — готовый плагин для управления проектами и задачами, если хотите готовое решение.
Для интеграции уведомлений о сроках и изменениях можно использовать хуки WordPress и отправлять электронные письма через wp_mail().
Пример отправки уведомления о приближении срока задачи
Добавим функцию, которая будет запускаться по крону и отправлять напоминания:
function wptasks_send_deadline_notifications() {
$today = date('Y-m-d');
$args = array(
'post_type' => 'wptasks_task',
'meta_query' => array(
array(
'key' => '_wptasks_deadline',
'value' => $today,
'compare' => '=',
),
),
);
$query = new WP_Query($args);
while ($query->have_posts()) {
$query->the_post();
$task_title = get_the_title();
$admin_email = get_option('admin_email');
$subject = 'Напоминание: срок выполнения задачи "' . $task_title . '" наступил';
$message = 'Пожалуйста, проверьте задачу "' . $task_title . '" в админке WordPress.';
wp_mail($admin_email, $subject, $message);
}
wp_reset_postdata();
}
if (!wp_next_scheduled('wptasks_daily_deadline_check')) {
wp_schedule_event(time(), 'daily', 'wptasks_daily_deadline_check');
}
add_action('wptasks_daily_deadline_check', 'wptasks_send_deadline_notifications');Этот код ежедневно проверяет задачи с сегодняшним сроком и отправляет уведомление на почту администратора.
Резюме по созданию персонального Task Manager в WordPress
Мы рассмотрели, как пошагово создать собственный менеджер задач: зарегистрировали тип записи, добавили мета-поля, реализовали вывод на сайте и даже реализовали простую систему уведомлений. Такой подход дает гибкость и полный контроль над функционалом. Кроме того, при необходимости можно расширять систему с помощью популярных плагинов и собственных доработок.