Как создать динамический выбор сообщений в админке WordPress

В админке WordPress часто возникает потребность создать выпадающий список сообщений (постов), который динамически обновляется в зависимости от определённых условий. Это полезно для расширений метабоксов, настроек плагинов или кастомных форм. В этой статье мы подробно рассмотрим, как программно создать такой динамический выбор с примерами кода и разбором тонкостей.

Зачем нужен динамический выбор сообщений в админке WordPress

Стандартный select с фиксированным набором опций — это просто, но не всегда удобно. Например, если у вас есть плагин, который позволяет выбрать связанный пост, или метабокс с выбором родительского элемента, то статический список не учитывает изменения контента. Динамический выбор сообщений позволяет:

  • Отображать только актуальные записи, удовлетворяющие критериям (по типу, категории, статусу и др.)
  • Автоматически обновлять список при добавлении новых постов
  • Интегрироваться с AJAX для подгрузки данных без перезагрузки страницы
  • Снижать нагрузку, подгружая только часть списка при большом объёме данных

Давайте рассмотрим несколько техник реализации.

Создание базового динамического выпадающего списка постов

Самый простой способ — получить нужные посты через WP_Query и вывести их в select. Например, создадим функцию wpsystem_get_posts_dropdown(), которая вернёт HTML-код списка сообщений определённого типа.

function wpsystem_get_posts_dropdown( $post_type = 'post', $selected = 0 ) {
    $args = [
        'post_type' => $post_type,
        'posts_per_page' => -1,
        'post_status' => 'publish',
        'orderby' => 'title',
        'order' => 'ASC',
    ];
    $posts = get_posts( $args );
    $html = '<select name="wpsystem_post_select" id="wpsystem_post_select">';
    $html .= '<option value="">Выберите запись</option>';
    foreach ( $posts as $post ) {
        $selected_attr = ( $post->ID == $selected ) ? ' selected' : '';
        $html .= '<option value="' . esc_attr( $post->ID ) . '"' . $selected_attr . '>' . esc_html( $post->post_title ) . '</option>';
    }
    $html .= '</select>';
    return $html;
}

Вы можете вызвать эту функцию в метабоксе или настройках:

echo wpsystem_get_posts_dropdown( 'page', 123 ); — отобразит список страниц с выбранной по ID 123.

Фильтрация и сортировка списка сообщений

Часто нужно получить посты по дополнительным условиям: по таксономии, дате, автору и т.д. В WP_Query можно передавать сложные параметры.

Добавим фильтр по категории (taxonomy "category"):

$args = [
    'post_type' => 'post',
    'posts_per_page' => -1,
    'tax_query' => [
        [
            'taxonomy' => 'category',
            'field' => 'slug',
            'terms' => 'novosti',
        ],
    ],
    'orderby' => 'date',
    'order' => 'DESC',
];

Таким образом динамический список будет показывать только посты из категории "новости".

Использование AJAX для подгрузки постов в динамический селект

Когда постов слишком много, стоит подгружать их по мере ввода поискового запроса — это улучшает UX и снижает нагрузку.

Для реализации AJAX-поиска можно использовать jQuery UI Autocomplete или Select2, а на серверной стороне — написать обработчик WP AJAX.

Пример AJAX-обработчика в WordPress

add_action( 'wp_ajax_wpsystem_search_posts', 'wpsystem_ajax_search_posts' );
add_action( 'wp_ajax_nopriv_wpsystem_search_posts', 'wpsystem_ajax_search_posts' );

function wpsystem_ajax_search_posts() {
    $search = sanitize_text_field( $_GET['q'] ?? '' );
    if ( empty( $search ) ) {
        wp_send_json( [] );
    }
    $args = [
        'post_type' => 'post',
        'posts_per_page' => 10,
        's' => $search,
        'post_status' => 'publish',
    ];
    $query = new WP_Query( $args );
    $results = [];
    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            $results[] = [
                'id' => get_the_ID(),
                'text' => get_the_title(),
            ];
        }
        wp_reset_postdata();
    }
    wp_send_json( $results );
}

Подключение Select2 и инициализация поля

Подключите библиотеку Select2 в админке (ее можно взять из CDN или через enqueue), а затем инициализируйте поле:

jQuery(document).ready(function($) {
    $('#wpsystem_post_select').select2({
        ajax: {
            url: ajaxurl,
            dataType: 'json',
            delay: 250,
            data: function(params) {
                return {
                    action: 'wpsystem_search_posts',
                    q: params.term,
                };
            },
            processResults: function(data) {
                return {
                    results: data
                };
            },
            cache: true
        },
        minimumInputLength: 2,
        placeholder: 'Начните вводить название поста',
    });
});

Обновление и сохранение выбранного значения

Если вы используете метабокс, то после выбора поста нужно сохранить значение в метаполе.

Пример сохранения значения в метабоксе:

function wpsystem_save_post_select_meta( $post_id ) {
    if ( ! isset( $_POST['wpsystem_post_select'] ) ) {
        return;
    }
    $selected_post = intval( $_POST['wpsystem_post_select'] );
    update_post_meta( $post_id, '_wpsystem_related_post', $selected_post );
}
add_action( 'save_post', 'wpsystem_save_post_select_meta' );

Для вывода сохранённого значения в селекте передайте ID выбранного поста в параметр $selected функции генерации списка.

Готовые плагины для расширенного выбора постов

Если хотите ускорить разработку, можно использовать готовые решения:

  • Clearfy Pro — содержит расширенные настройки оптимизации, в том числе по работе с метаполями и выбором контента;
  • WPRemark — плагин для отзывов, умеет работать с кастомными постами и может пригодиться для примеров;
  • Используйте ACF (Advanced Custom Fields) с полем "Post Object", который умеет динамически подгружать посты с AJAX.

Заключение по теме динамического выбора сообщений

Динамический выбор сообщений в админке WordPress — мощный инструмент для улучшения интерфейса и повышения удобства работы с контентом. Вы можете реализовать его простым выводом списка, добавлять фильтры, использовать AJAX для больших наборов данных и интегрировать с сохранением метаполей. Такой подход особенно полезен при разработке сложных плагинов и кастомных решений.

Как создать динамический фильтр по мета-полям в WordPress с примером кода
28.01.2026
Оценка эффективности плагинов WordPress: как выбрать и проверить
05.02.2026
Как настроить временный редирект в WordPress с помощью кода
07.01.2026
Как добавить автоматический режим работы для плагина WordPress
25.01.2026
Автоматическое отключение неиспользуемых активных плагинов WordPress: практическое решение
11.03.2026