196 lines
8.1 KiB
PHP
196 lines
8.1 KiB
PHP
<?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'); |