WordPress, как сделать заполнение поля по данным из базы?

Ссылка скопирована
1 ответ

Добрый день!
проект на wordpress
Тип поста - записи
Поле ввода - текст на кастомном поле
Как к 1му этому полюподключить возможность автодобавления данных из предложенных.
логика: человек вводит несколько символов, система выдает результат из базы.
полей всего 30, но должно работать только с 1 полем.
Кто может знает готовые решения по этому вопросу?

Дополнительно:

Ответы:

datalist - элемент html
при необходимости к нему можно приделать аякс

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Артём Dev Ответ

Если нужно автодополнение только для одного кастомного поля, есть два нормальных варианта. Первый — простой datalist, если список значений небольшой. Второй — Ajax-поиск по базе, если значений много и их нельзя грузить все сразу.

Для маленького списка можно вывести поле так:

<input type="text" name="my_custom_field" list="field-suggestions">
<datalist id="field-suggestions">
  <option value="Москва">
  <option value="Санкт-Петербург">
  <option value="Казань">
</datalist>

<input type="text" name="my_custom_field" list="field-suggestions"> <datalist id="field-suggestions"> <option value="Москва"> <option value="Санкт-Петербург"> <option value="Казань"> </datalist>

Но если значения берутся из базы и их много, лучше сделать Ajax. В WordPress добавляете обработчик:

add_action('wp_ajax_my_field_suggest', 'my_field_suggest');
add_action('wp_ajax_nopriv_my_field_suggest', 'my_field_suggest');
 
function my_field_suggest() {
    global $wpdb;
 
    $term = sanitize_text_field($_GET['term'] ?? '');
    if (mb_strlen($term) < 2) {
        wp_send_json([]);
    }
 
    $rows = $wpdb->get_col($wpdb->prepare(
        "SELECT DISTINCT meta_value
         FROM {$wpdb->postmeta}
         WHERE meta_key = %s AND meta_value LIKE %s
         LIMIT 20",
        'my_custom_field',
        '%' . $wpdb->esc_like($term) . '%'
    ));
 
    wp_send_json($rows);
}

add_action('wp_ajax_my_field_suggest', 'my_field_suggest'); add_action('wp_ajax_nopriv_my_field_suggest', 'my_field_suggest'); function my_field_suggest() { global $wpdb; $term = sanitize_text_field($_GET['term'] ?? ''); if (mb_strlen($term) < 2) { wp_send_json([]); } $rows = $wpdb->get_col($wpdb->prepare( "SELECT DISTINCT meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value LIKE %s LIMIT 20", 'my_custom_field', '%' . $wpdb->esc_like($term) . '%' )); wp_send_json($rows); }

На фронте подключаете JS только для нужного поля. Можно использовать jQuery UI Autocomplete, Select2 или свой небольшой fetch-запрос. Главное — не делать автодополнение для всех 30 полей, если оно нужно только одному: назначьте этому полю отдельный CSS-класс или ID.

Если поле находится в админке, обработчик тот же, но скрипт подключайте через admin_enqueue_scripts. Если на фронте — через wp_enqueue_scripts. И обязательно ограничьте запросы: минимум 2-3 символа до поиска, LIMIT в SQL и очистка входных данных. Тогда автодобавление будет работать быстро и не будет грузить базу.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно