wpcodes.ru wordpress WP Codеs

Как создать автозаполняемое поле в WordPress

Автозаполняемые поля — важный элемент удобства пользовательского интерфейса на сайтах. Они позволяют экономить время и минимизировать ошибки, предлагая пользователю варианты ввода на лету. В WordPress создание такого поля требует интеграции клиентской части с сервером, чаще всего через AJAX или REST API.

Что такое автозаполняемое поле и где его использовать в WordPress

Автозаполнение — это функционал, при котором поле ввода предлагает варианты значений в зависимости от уже введённого текста. В WordPress такие поля полезны в формах поиска, при выборе категорий, тегов, пользователей, товаров и других данных.

Например, если вы создаёте форму для записи или фильтрации по меткам, автозаполнение значительно улучшит UX. Также это удобно в административной панели для быстрого выбора нужных элементов.

Технически, автозаполняемое поле — это input с привязкой к серверной части, которая возвращает массив подходящих вариантов по введённой строке.

Пример плагинов для автозаполнения в WordPress

Перед тем как писать свой код, полезно взглянуть на готовые решения:

  • SearchWP Live Ajax Search — расширяет стандартный поиск WordPress с живыми подсказками;
  • ACF: Autocomplete Field — расширение для популярного плагина Advanced Custom Fields, добавляющее автозаполнение;
  • WP User Frontend — поддерживает автозаполнение для полей с пользователями;
  • FacetWP — мощный инструмент для фильтрации с подсказками и автозаполнением.

Но если нужен кастомный функционал или лучшее понимание процесса, стоит написать собственное решение.

Как реализовать автозаполняемое поле в WordPress с помощью AJAX

Подготовка HTML и JavaScript

Начнём с простого HTML-поля с id wpcodes-autocomplete. К нему привяжем обработчик событий, который будет отправлять AJAX-запрос на сервер при вводе текста.

<input type="text" id="wpcodes-autocomplete" placeholder="Начните вводить..." autocomplete="off"/>
<div id="wpcodes-suggestions" style="border:1px solid #ccc; max-width:300px; display:none; position:absolute; background:#fff; z-index:9999;"></div>

JavaScript, использующий jQuery (для простоты):

jQuery(document).ready(function($) {
  $('#wpcodes-autocomplete').on('input', function() {
    var query = $(this).val();
    if(query.length < 2) {
      $('#wpcodes-suggestions').hide();
      return;
    }
    $.ajax({
      url: wpcodes_ajax_object.ajax_url,
      method: 'POST',
      data: {
        action: 'wpcodes_autocomplete_search',
        nonce: wpcodes_ajax_object.nonce,
        term: query
      },
      success: function(response) {
        if(response.success) {
          var suggestions = response.data;
          var html = '';
          if(suggestions.length) {
            suggestions.forEach(function(item) {
              html += '<div class="wpcodes-suggestion-item" style="padding:5px; cursor:pointer;">' + item + '</div>';
            });
            $('#wpcodes-suggestions').html(html).show();
          } else {
            $('#wpcodes-suggestions').hide();
          }
        }
      }
    });
  });

  // При клике на вариант подставляем его в поле
  $(document).on('click', '.wpcodes-suggestion-item', function() {
    $('#wpcodes-autocomplete').val($(this).text());
    $('#wpcodes-suggestions').hide();
  });

  // Скрываем подсказки при клике вне
  $(document).click(function(e) {
    if(!$(e.target).closest('#wpcodes-autocomplete, #wpcodes-suggestions').length) {
      $('#wpcodes-suggestions').hide();
    }
  });
});

Регистрация скриптов и локализация AJAX URL в functions.php

Для работы AJAX нужно подключить скрипт и передать в него URL обработчика и nonce для безопасности.

function wpcodes_enqueue_scripts() {
  wp_enqueue_script('wpcodes-autocomplete-js', get_template_directory_uri() . '/js/wpcodes-autocomplete.js', array('jquery'), '1.0', true);
  wp_localize_script('wpcodes-autocomplete-js', 'wpcodes_ajax_object', array(
    'ajax_url' => admin_url('admin-ajax.php'),
    'nonce' => wp_create_nonce('wpcodes_autocomplete_nonce')
  ));
}
add_action('wp_enqueue_scripts', 'wpcodes_enqueue_scripts');

Обработка AJAX-запроса в PHP

Создадим функцию-обработчик, которая будет принимать поисковый термин, искать совпадения и возвращать результат.

function wpcodes_autocomplete_search_callback() {
  check_ajax_referer('wpcodes_autocomplete_nonce', 'nonce');

  $term = isset($_POST['term']) ? sanitize_text_field($_POST['term']) : '';
  if(empty($term)) {
    wp_send_json_success(array());
  }

  global $wpdb;
  // Пример: поиск по названиям постов типа 'post'
  $like = '%' . $wpdb->esc_like($term) . '%';
  $results = $wpdb->get_col($wpdb->prepare(
    "SELECT post_title FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' AND post_title LIKE %s ORDER BY post_title LIMIT 10",
    $like
  ));

  wp_send_json_success($results);
}
add_action('wp_ajax_wpcodes_autocomplete_search', 'wpcodes_autocomplete_search_callback');
add_action('wp_ajax_nopriv_wpcodes_autocomplete_search', 'wpcodes_autocomplete_search_callback');

Использование REST API для автозаполнения в WordPress

Вместо admin-ajax.php можно использовать REST API, что более современно и удобно для фронтенд-разработки.

Создадим собственный endpoint, который будет принимать параметр term и возвращать список результатов.

function wpcodes_register_autocomplete_route() {
  register_rest_route('wpcodes/v1', '/autocomplete', array(
    'methods' => 'GET',
    'callback' => 'wpcodes_rest_autocomplete_callback',
    'permission_callback' => '__return_true',
  ));
}
add_action('rest_api_init', 'wpcodes_register_autocomplete_route');

function wpcodes_rest_autocomplete_callback(WP_REST_Request $request) {
  $term = sanitize_text_field($request->get_param('term'));
  if(empty($term)) {
    return new WP_REST_Response(array(), 200);
  }

  global $wpdb;
  $like = '%' . $wpdb->esc_like($term) . '%';
  $results = $wpdb->get_col($wpdb->prepare(
    "SELECT post_title FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' AND post_title LIKE %s ORDER BY post_title LIMIT 10",
    $like
  ));

  return new WP_REST_Response($results, 200);
}

Далее на стороне JavaScript меняем URL запроса на /wp-json/wpcodes/v1/autocomplete?term=... и используем fetch или axios.

Рекомендации по улучшению и безопасности

Автозаполняемые поля часто подвергаются нагрузке и атакам типа перебора. Чтобы минимизировать риски и улучшить производительность, придерживайтесь следующих рекомендаций:

  • Используйте nonce или другие методы проверки прав;
  • Ограничивайте длину и частоту запросов (дебаунсинг на клиенте);
  • Кешируйте результаты, если данные обновляются нечасто;
  • Оптимизируйте SQL-запросы, используйте индексы;
  • Если возможно, ограничивайте выдачу только необходимыми полями;
  • Обрабатывайте ошибки и выдавайте понятные сообщения пользователю.

Заключение

Создание автозаполняемого поля в WordPress — задача, которая требует взаимодействия фронтенда и бэкенда. Используя AJAX или REST API, можно сделать интерфейс удобным и отзывчивым. Предоставленный пример с кодом поможет быстро интегрировать такую функцию на ваш сайт, а рекомендации по безопасности и оптимизации — избежать проблем при масштабировании.

×

Создай идеальный сайт – теперь на 15% дешевле!

Подобрать тему →