JQuery Автозаполнение (devbridge) Ajax Serveride serviceURL Поиск файла - PullRequest
0 голосов
/ 26 сентября 2019

Я использую плагин DevBridge jQuery Autocomplete с опцией ajax (вместо этого используется serviceURL, а НЕ lookup).У меня есть php-файл, который запрашивает БД (WordPress FYI) и получает все результаты просто отлично.Поэтому, когда пользователи вводят в мое поле автозаполнения, он показывает ВСЕ результаты с выделенным запросом.Очевидно, мой серверный скрипт должен обрабатывать поиск и возвращать ТОЛЬКО отфильтрованные результаты, основанные на вводимых пользователем данных на лету.Я просто не знаю, как это сделать.

Я нашел тонну постов в Интернете, в которых говорится, что это должно работать, но не могу найти никаких рабочих примеров файла serviceURL, который возвращает отфильтрованные результаты, основанные на том, что печатает пользователь.

Вот код, который у меня есть ...

Мой jQuery ...

$('#product_sku_autocomplete').autocomplete({
      serviceUrl: '/blah/blah/ajax-product-sku.php', 
      minChars: 1,
      onSelect: function (suggestion) {
          alert('You selected: ' + suggestion.value + ', ' + suggestion.data);
      }
  });

содержимое моего файла ajax-product-sku.php.Это получает все различные мета-значения для настраиваемого поля (sku) для всех «продуктов»

  if ( ! defined('ABSPATH') ) {
    require_once( '../../../../wp-load.php' );
  }

  global $wpdb;

  $term = $_GET['query'];

  $query = $wpdb->get_col( $wpdb->prepare( "
        SELECT pm.meta_value FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = %s 
        AND p.post_status = %s 
        AND p.post_type = %s
    ", 'sku', 'publish', 'products' ) );

    $reply = array();
    $reply['query'] = $term;
    $reply['suggestions'] = array();

    foreach ($query as $sku) {
      $reply['suggestions'][] = array(
          "value" => $sku,
          "data" => $sku
      );
    }

    echo json_encode($reply);

Результаты, если я получаю прямой доступ к ajax-product-sku.php ...

{"query":null,"suggestions":[{"value":"52N242","data":"52N242"},{"value":"52F230","data":"52F230"},{"value":"52F235","data":"52F235"}]}

Итак, я получаю полный список результатов (насколько мне известно, правильно отформатированный), и поле автозаполнения извлекает НО, когда вы вводите в поле автозаполнения, оно показывает ВСЕ результаты, а не только те, которые соответствуютПользователь набрал.

Я подозреваю, что мне нужно добавить $ term var где-нибудь в моем запросе db $ query, но не уверен, как.Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 26 сентября 2019

Я думаю, что понял.Довольно простое решение, но мне явно не хватает моих sql отбивных.Необходимо добавить условие LIKE в оператор SQL.Вот пересмотренное содержимое файла ajax-product-sku.php.

Если у кого-то есть более эффективный способ справиться с этим с точки зрения кодирования или производительности, я бы приветствовал знание ...

ajax-product-sku.php

  if ( ! defined('ABSPATH') ) {
    require_once( '../../../../wp-load.php' );
  }

  global $wpdb;

  $term = $_GET['query']; // this is the var that autocomplete sends as users type.
  //$term = '1';

  $query = $wpdb->get_col( $wpdb->prepare( "
        SELECT pm.meta_value FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = %s
        AND p.post_status = %s
        AND p.post_type = %s
        AND pm.meta_value LIKE '%{$term}%'
    ", 'sku', 'publish', 'products' ) );

    $reply = array();
    $reply['query'] = $term;
    $reply['suggestions'] = array();

    foreach ($query as $sku) {
      $reply['suggestions'][] = array(
          "value" => $sku,
          "data" => $sku
      );
    }

    echo json_encode($reply);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...