В админке 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 для больших наборов данных и интегрировать с сохранением метаполей. Такой подход особенно полезен при разработке сложных плагинов и кастомных решений.