add files inc

This commit is contained in:
Profile Profile
2026-03-09 20:51:08 +03:00
parent 83ca6c638a
commit ed4d79b706
23 changed files with 3728 additions and 4 deletions

196
inc/journal_issue.php Normal file
View File

@@ -0,0 +1,196 @@
<?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');