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

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

Поэтому в основном на домашней странице я хочу найти форму поиска, в которой есть выпадающие списки для Make & Model и содержит любые доступные Makes или Models.

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

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

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

Solutions Collecting From Web of "Создание формы поиска для настраиваемых полей"

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

Шаг 1

Начните с создания формы расширенного поиска, с которой вы хотите, чтобы ваш пользователь взаимодействовал с веб-сайтом, и сохраните его с именем (т. advanced-searchform.php Я сохранил его как 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> 
  • Подробнее о шаблоне формы WordPress по умолчанию

Затем вызовите форму в свой шаблон следующим образом:

 <?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 ),
  • Передавайте команды в запросе, извлекайте данные из db и
  • Показать результат [с]

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

 <?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(); ?> 
  • Ваш лучший друг при использовании WP_Query – Codex и пользовательских параметров поля

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

  • Альтернативные значения – расширенный поиск может выполняться со всеми полями или ЛЮБОЙ частью поля, поэтому вы должны убедиться, что запрос принимает все результаты в соответствии с поиском и данными. Вы можете использовать специальный запрос SQL $wpdb для сложного результата поиска, и это будет чистый MySQL. WordPress там ничего не существует.
  • Sanitization & Validation – поле текстов и текстовое поле настолько уязвимы, что могут привести к неправильной практике вашего сайта. Поэтому передача необработанных данных будет небезопасной, вам нужно будет Sanitize и Validate, прежде чем переходить в запрос db. ( Санитария данных и валидация с помощью WordPress – TutsPlus )
  • Проектирование – вы можете выбрать page.php (или search.php ) и сделать эту страницу на основе этого.

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

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

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

Этот шаг, равный шагу 1 в другом ответе, просто изменил идентификатор «имя», который был использован для поиска, «s», поэтому он будет использоваться непосредственно для поиска. Сохраните этот код в searchform-advanced.php под папкой темы. Затем используйте get_template_part( 'advanced', 'searchform' ); загрузить его, где вы хотите, чтобы он появился в вашей теме:

 <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; }