'Номера изданий', 'singular_name' => 'Номер издания', 'menu_name' => 'Номера изданий', 'all_items' => 'Все номера', 'add_new' => 'Добавить новый', 'add_new_item' => 'Добавить новый номер', 'edit_item' => 'Редактировать номер', 'new_item' => 'Новый номер', 'view_item' => 'Просмотреть номер', 'search_items' => 'Поиск номеров', ); $args = array( 'label' => 'journal_issue', 'labels' => $labels, 'description' => 'Архивы номеров журналов', 'public' => true, 'show_in_menu' => true, 'menu_icon' => 'dashicons-book-alt', 'supports' => array('title', 'thumbnail', 'editor'), 'has_archive' => false, ); register_post_type('journal_issue', $args); // Включаем поддержку миниатюр (на всякий случай) add_post_type_support('journal_issue', 'thumbnail'); } add_action('init', 'create_journal_issue_cpt'); // Создаем скрытую Таксономию только для связи (без пункта меню) add_action('init', function() { $labels = array( 'name' => 'Номера изданий', 'singular_name' => 'Номер издания', ); $args = array( 'labels' => $labels, 'hierarchical' => true, 'public' => false, 'show_ui' => false, // Полностью скрываем из админки 'show_admin_column' => true, 'show_in_rest' => false, 'capabilities' => array( 'manage_terms' => 'manage_options', 'edit_terms' => 'manage_options', 'delete_terms' => 'manage_options', 'assign_terms' => 'edit_posts', ), 'meta_box_cb' => false, ); register_taxonomy('article_journal_issue', array('profile_article'), $args); }); // Заменяем стандартный метабокс на выпадающий список add_action('admin_menu', function() { add_meta_box('journal_issue_dropdown', 'Номер издания', 'custom_journal_issue_dropdown', 'profile_article', 'side', 'default'); }); // Выпадающий список для выбора номера function custom_journal_issue_dropdown($post) { // Получаем номера изданий из CPT journal_issue $journal_issues = get_posts(array( 'post_type' => 'journal_issue', 'numberposts' => -1, 'orderby' => 'title', 'order' => 'DESC', 'post_status' => 'publish' )); // Получаем выбранный термин $selected_terms = wp_get_object_terms($post->ID, 'article_journal_issue', array('fields' => 'names')); $selected_name = !empty($selected_terms) ? $selected_terms[0] : ''; echo ''; echo '

Выберите один номер издания

'; echo '

Управление номерами изданий

'; } // Обрабатываем сохранение выбранного номера add_action('save_post_profile_article', function($post_id) { // Проверяем автосохранение if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; // Проверяем права пользователя if (!current_user_can('edit_post', $post_id)) return; // Обрабатываем выбор из выпадающего списка if (isset($_POST['journal_issue_selected'])) { $selected_title = sanitize_text_field($_POST['journal_issue_selected']); if (empty($selected_title)) { // Если выбран пустой вариант - удаляем все термины wp_set_object_terms($post_id, array(), 'article_journal_issue'); } else { // Создаем или получаем термин на основе выбранного номера $term = term_exists($selected_title, 'article_journal_issue'); if (!$term) { $term = wp_insert_term($selected_title, 'article_journal_issue'); } if (!is_wp_error($term)) { wp_set_object_terms($post_id, array($term['term_id']), 'article_journal_issue'); } } } }); // Добавляем быстрый выбор в таблице постов (колонка) add_filter('manage_profile_article_posts_columns', function($columns) { $columns['journal_issue'] = 'Номер издания'; return $columns; }); add_action('manage_profile_article_posts_custom_column', function($column, $post_id) { if ($column === 'journal_issue') { $terms = get_the_terms($post_id, 'article_journal_issue'); if ($terms && !is_wp_error($terms)) { foreach ($terms as $term) { echo '' . $term->name . ''; } } else { echo ''; } } }, 10, 2); // Функция для автоматической синхронизации терминов при создании/изменении номера function sync_journal_issue_term($post_id) { // Проверяем, что это номер издания if (get_post_type($post_id) !== 'journal_issue') return; // Пропускаем автосохранение if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; $issue = get_post($post_id); if ($issue && $issue->post_status === 'publish') { // Создаем или обновляем термин $term = term_exists($issue->post_title, 'article_journal_issue'); if (!$term) { wp_insert_term($issue->post_title, 'article_journal_issue'); } else { // Обновляем название термина, если изменилось название номера wp_update_term($term['term_id'], 'article_journal_issue', array( 'name' => $issue->post_title )); } } } // Синхронизируем при сохранении номера издания add_action('save_post_journal_issue', 'sync_journal_issue_term'); // Удаляем термин при удалении номера издания function delete_journal_issue_term($post_id) { if (get_post_type($post_id) !== 'journal_issue') return; $issue = get_post($post_id); if ($issue) { $term = term_exists($issue->post_title, 'article_journal_issue'); if ($term) { wp_delete_term($term['term_id'], 'article_journal_issue'); } } } add_action('before_delete_post', 'delete_journal_issue_term'); // Инициализация существующих номеров при активации function init_existing_journal_issues() { $journal_issues = get_posts(array( 'post_type' => 'journal_issue', 'numberposts' => -1, 'post_status' => 'publish' )); foreach ($journal_issues as $issue) { $term = term_exists($issue->post_title, 'article_journal_issue'); if (!$term) { wp_insert_term($issue->post_title, 'article_journal_issue'); } } } register_activation_hook(__FILE__, 'init_existing_journal_issues');