Создание формы поиска для пользовательских полей

11

Я построил тему для автосалона. Каждый автомобиль имеет пользовательский тип сообщения («транспортное средство») и имеет около 12 пользовательских полей с такими вещами, как Марка, Модель, Пробег, Тип топлива и т. Д. И т. Д.

Так что в основном на главной странице я хочу форму поиска, которая имеет выпадающие списки для марки и модели и содержит любые доступные модели или модели.

Я также хочу, чтобы у него было 2 варианта года, чтобы конечный пользователь мог выбрать «2006» и «2012», и результаты поиска содержат все транспортные средства с указанием года между этими двумя числами.

Есть ли плагин, который может сделать это ??

Спасибо за любую помощь .. это сводит меня с ума в течение многих часов !!!!

absdigital
источник
Я думаю, что вы можете использовать этот плагин, чтобы помочь вам лучше wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI
Спасибо .. Но это не объясняет, как на самом деле создать форму поиска. Я имею в виду, что могу запрограммировать форму в HTML, но как мне заставить ее работать ?!
Абдигитал

Ответы:

16

______ ОБНОВЛЕНИЕ _______
Хотя я получаю все больше и больше голосов, и решение работает, но ответ Cybmeta на самом деле является хорошим ответом WordPress. Вы обязательно должны попробовать это.

Шаг 1

Начните с создания расширенной формы поиска, с помощью которой вы хотите, чтобы ваш пользователь взаимодействовал с веб-сайтом, и сохраните ее под именем (т.е. я сохранил ее как advanced-searchform.php- но не сохраняйте ее, searchform.phpтогда она заменит поисковую форму WordPress по умолчанию). ):

<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="name" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="name" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 1', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

Затем вызовите форму в свой шаблон, как показано ниже:

<?php get_template_part( 'advanced', 'searchform' ); ?>

Теперь ваша поисковая форма готова, и теперь вы можете использовать поисковую форму и вводить пользовательский URL-адрес.

Шаг 2

То, что вам просто нужно: запросить базу данных и запрос типа записи и ее настраиваемых полей согласно поисковому запросу . Помните, что ваш поисковый запрос теперь является URL-адресом, который вы получили после отправки формы. Теперь попросите WordPress загрузить свою страницу результатов поиска при отправке формы. Поместите следующую функцию в свой, functions.phpчтобы он включил ваш пользовательский шаблон поиска вместо значения по умолчанию search.php:

<?php
function wpse_load_custom_search_template(){
    if( isset($_REQUEST['search']) == 'advanced' ) {
        require('advanced-search-result.php');
        die();
    }
}
add_action('init','wpse_load_custom_search_template');
?>

Я принес код где-то из WPSE (я забыл рут), но есть противоречие с использованием кода выше. Но это на самом деле работает ( извините, конечно ).

Проверьте другой способ, предложенный @GM.

Шаг 3

Создайте новый файл и сохраните его с advanced-search-result.php(потому что мы использовали это имя в functions.php), и теперь вы свободны - очевидно. Концепция это:

  • Получите данные с URL,
  • Используйте простой WP_Query()(если ваш запрос сложный, используйте $wpdbзапрос),
  • Передайте команды в запросе, получите данные из базы данных и
  • Показать результат [s]

Образец может быть:

<?php
// Get data from URL into variables
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';

// Start the Query
$v_args = array(
        'post_type'     =>  'vehicle', // your CPT
        's'             =>  $_name, // looks into everything with the keyword from your 'name field'
        'meta_query'    =>  array(
                                array(
                                    'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                    'value'   => $_model,
                                    'compare' => 'LIKE', // finds models that matches 'model' from the select field
                                ),
                            )
    );
$vehicleSearchQuery = new WP_Query( $v_args );

// Open this line to Debug what's query WP has just run
// var_dump($vehicleSearchQuery->request);

// Show the results
if( $vehicleSearchQuery->have_posts() ) :
    while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
        the_title(); // Assumed your cars' names are stored as a CPT post title
    endwhile;
else :
    _e( 'Sorry, nothing matched your search criteria', 'textdomain' );
endif;
wp_reset_postdata();
?>

Итак, вот ваша последняя вещь. Но все же есть много проблем:

  • Альтернативные значения - расширенный поиск может быть выполнен с ВСЕМИ полями или ЛЮБЫМ из поля, поэтому вы должны убедиться, что Запрос принимает все результаты в соответствии с поиском и данными. Вы можете использовать $wpdbпользовательский запрос SQL для сложного результата поиска, и это будет чистый MySQL - в WordPress ничего нет.
  • Санитарная обработка и проверка - текстовое поле и текстовое поле настолько уязвимы, что могут привести к неправильной работе вашего сайта. Таким образом, передача необработанных данных будет небезопасной, вам нужно будет выполнить их дезинфекцию и проверку, прежде чем переходить к запросу db. ( Санация и проверка данных с помощью WordPress - TutsPlus )
  • Проектирование - вы можете выбрать page.php(или search.php) шаблон и сделать эту страницу на основе этого.

Итак, у вас есть идея, теперь ваша очередь исследовать и открывать путь . Помните, у каждого свой путь. Сделай свой, чтобы я мог следовать за тобой. :)

Mayeenul Ислам
источник
Спасибо, что нашли время, очень любезно с вашей стороны. Знаете ли вы, как я могу это сделать, чтобы в раскрывающемся меню «Производит» автоматически отображались марки, которые были введены в одну из сообщений транспортного средства?
Абдигитал
Буду рад, если это работает для вас. :)
Mayeenul Islam
Знаете ли вы, как я могу это сделать, чтобы в раскрывающемся меню «Производит» автоматически отображались марки, которые были введены в одну из сообщений транспортного средства?
Абдигитал
использовать с WP_Query()использованием параметров пользовательских полей и петли в результате , чтобы показать <option>с.
Mayeenul Islam
Я хотел бы, чтобы этот «расширенный поиск» выполнялся с использованием pre_get_postsхука, а не вторичного цикла.
Cybmeta
23

Хотя ответ @ MayeenulIslam может сработать, я думаю, что правильный путь для расширенного поиска - использование pre_get_postsловушки действий.

Шаг 1: Форма поиска

Этот шаг равен к шагу 1 в другом ответе, просто изменил idна nameполе ( <input type="text" ...>используется для поиска на «S» , поэтому он будет использоваться непосредственно в качестве области поиска. Сохранить этот код в advanced-searchform.phpсоответствии с вашей папкой темы. Затем используйте get_template_part( 'advanced', 'searchform' );для загрузите его там, где хотите, чтобы он отображался в вашей теме:

<?php /**`advanced-searchform.php`*/ ?>
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="s" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="s" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

Шаг 2. Добавьте фильтры в поисковый запрос.

add_action( 'pre_get_posts', 'advanced_search_query' );
function advanced_search_query( $query ) {

    if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && ! is_admin() && $query->is_search && $query->is_main_query() ) {

        $query->set( 'post_type', 'vehicle' );

        $_model = $_GET['model'] != '' ? $_GET['model'] : '';

        $meta_query = array(
                            array(
                                'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                'value'   => $_model,
                                'compare' => 'LIKE', // finds models that matches 'model' from the select field
                            )
                        )
        );
        $query->set( 'meta_query', $meta_query );

    }
}

Шаг 3: Шаблонирование (необязательно)

При использовании этого метода будет использоваться шаблон поиска WordPress по умолчанию, который фильтрует результаты без необходимости повторного запроса. Если вы хотите использовать другой шаблон для расширенного поиска, вы можете использовать template_includeфильтр. Например, если вы хотите использовать advanced-search-template.phpфайл в качестве шаблона для результатов из формы расширенного поиска:

add_action('template_include', 'advanced_search_template');
function advanced_search_template( $template ) {
  if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && is_search() ) {
     $t = locate_template('advanced-search-template.php');
     if ( ! empty($t) ) {
         $template = $t;
     }
  }
  return $template;
}
cybmeta
источник
3
Большое спасибо за способ WordPress. Просто работал с этим, и это круто. :)
Mayeenul Islam