Files
profile/inc/journal_issue.php
Profile Profile ed4d79b706 add files inc
2026-03-09 20:51:08 +03:00

196 lines
8.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// Создаем Custom Post Type для номеров изданий
function create_journal_issue_cpt() {
$labels = array(
'name' => 'Номера изданий',
'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 '<select name="journal_issue_selected" style="width:100%;">';
echo '<option value="">— Не выбран —</option>';
foreach ($journal_issues as $issue) {
$selected = selected($selected_name, $issue->post_title, false);
echo '<option value="' . esc_attr($issue->post_title) . '" ' . $selected . '>' . esc_html($issue->post_title) . '</option>';
}
echo '</select>';
echo '<p class="description" style="margin-top:5px;">Выберите один номер издания</p>';
echo '<p class="description"><small><a href="' . admin_url('edit.php?post_type=journal_issue') . '">Управление номерами изданий</a></small></p>';
}
// Обрабатываем сохранение выбранного номера
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 '<span style="background:#f0f0f0; padding:2px 6px; border-radius:3px; font-size:12px;">' . $term->name . '</span>';
}
} else {
echo '<span style="color:#ccc;">—</span>';
}
}
}, 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');