Автоматический поиск/Автозаполнение с помощью Мета-ключей


В настоящее время я застрял в поиске недвижимости.

То, что я пытаюсь сделать, звучит довольно просто: У меня есть одно поле в форме поиска. Я хочу, чтобы это поле могло генерировать автоматические предложения/ автозаполнение /автоматическое предсказание при вводе, например:

Человек ищет хороший лофт в Берлине Шарлоттенбург, поэтому он выбирает свои варианты, а затем вводит "Символ". На входе будут показаны варианты, которые включают это имя, например "Шарлоттенбург" (часть) или "Шарлоттенбург-Вильмерсдорф" (округ).

Я нашел несколько способов создания прогноза в wordpress, но в настоящее время я просматриваю все сообщения данного пользовательского типа и просто выделяю один, включая ввод ЗАГОЛОВКА.

Я хочу, чтобы предсказание искало мета-значение трех мета-ключей и просто показывало значение мета-значений, которые включают поисковый запрос.


Tl;др: Текущее состояние:

Ввод: Символ Название предсказания: Чистый лофт в Берлине, Очень милый уютный дом, Дом в центре города

Разыскиваемое государство:

Ввод: Символ МЕТА_ЗНАЧЕНИЕ прогноза: СимволЛоттенбург, Символлоттенбург-Вильмерсдорф

--

Вот мой текущий код:

Functions.php :

<?php
/**
 * Enqueue scripts and styles.
 *
 * @since 1.0.0
 */
function ja_global_enqueues() {
    wp_enqueue_style(
        'jquery-auto-complete',
        'https://cdnjs.cloudflare.com/ajax/libs/jquery-autocomplete/1.0.7/jquery.auto-complete.css',
        array(),
        '1.0.7'
    );
    wp_enqueue_script(
        'jquery-auto-complete',
        'https://cdnjs.cloudflare.com/ajax/libs/jquery-autocomplete/1.0.7/jquery.auto-complete.min.js',
        array( 'jquery' ),
        '1.0.7',
        true
    );
    wp_enqueue_script(
        'global',
        get_template_directory_uri() . '/js/prediction.js',
        array( 'jquery' ),
        '1.0.0',
        true
    );
    wp_localize_script(
        'global',
        'global',
        array(
            'ajax' => admin_url( 'admin-ajax.php' ),
        )
    );
}
add_action( 'wp_enqueue_scripts', 'ja_global_enqueues' );
/**
 * Live autocomplete search feature.
 *
 * @since 1.0.0
 */
function ja_ajax_search() {
    $results = new WP_Query( array(
        'post_type'     => array( 'immomakler_object' ),
        'nopaging'      => true,
        'posts_per_page'=> 100,
    'meta_query'    => array (
      'relation'    => 'AND',
      array(
        'relation' => 'AND',
        array(
          'key'         => 'verkaufstatus',
          'value'       => 'VERKAUFT',
          'compare' => '!='
        )
      )
    )
    ) );
    $items = array();
    if ( !empty( $results->posts ) ) {
        foreach ( $results->posts as $result ) {
            $items[] = $result->post_title;
        }
    }
    wp_send_json_success( $items );
}
add_action( 'wp_ajax_search_site',        'ja_ajax_search' );
add_action( 'wp_ajax_nopriv_search_site', 'ja_ajax_search' );

?>

.js

jQuery(function($){
    var searchRequest;
    $('.prediction').autoComplete({
        minChars: 3,
        source: function(term, suggest){
            try { searchRequest.abort(); } catch(e){}
            searchRequest = $.post(global.ajax, { search: term, action: 'search_site' }, function(res) {
                suggest(res.data);
            });
        }
    });
});

Мой пользовательский тип записи: immomakler_object Мои пользовательские метаключи, по которым я хочу, чтобы значения для поиска были следующими: PLZ, орт, регионал_зузац

Author: marvinpoo, 2018-07-31

1 answers

Если вы хотите отобразить пользовательские значения полей, вы не можете использовать WP_Query для выбора записей.
Мне кажется, что единственный доступный способ - написать sql-запрос и выполнить его в $wpdb.

global $wpdb;

if ( isset($_POST['search']) == false || empty($_POST['search']) ) 
   wp_send_json_success( $array() ); 
$s = $_POST['search'];

$meta_keys = ['PLZ', 'ort', 'regionaler_zusatz'];
$limit = 100;
$sql = "SELECT meta_value FROM $wpdb->postmeta pm "
      . " WHERE pm.meta_key IN ('PLZ', 'ort', 'regionaler_zusatz') "
      . "    AND pm.meta_value LIKE %s LIMIT 0, %d ";
$args = ['%'.$s.'%', $limit];
$sql = $wpdb->prepare($sql, $args);
$res = $wpdb->get_results($sql, ARRAY_A);

$data = [];
if ( is_array($res) && !empty($res) ) {
   foreach( $res as $row )
       $data[] = $row['meta_value'];
   // -- or --
   //$data = array_reduce($res, function($carry, $item) {
   //    $carry[] = $item['meta_value'];
   //    return $carry;
   //}, []);
}
wp_send_json_success( $data );

Если вы не сохраняете данные в пользовательских полях (PLZ, ort, regionaler_zusatz) одно значение, возможно, вам потребуется выбрать соответствующий элемент из массива.

 2
Author: nmr, 2018-08-01 10:35:51