Створення форми пошуку для спеціальних полів


11

Я створив тему для автосалону. Кожен автомобіль - це спеціальний тип пошти ("транспортний засіб") і містить близько 12 спеціальних полів із такими речами, як "Зробити", "Модель", "Пробіг", "Тип палива" тощо.

Отже, на головній сторінці я хочу отримати форму пошуку, яка містить випадаючі списки для Make & Model і містить будь-які доступні марки або моделі.

Я також хочу, щоб у нього було два варіанти року, щоб кінцевий користувач міг вибрати "2006" та "2012", а результати пошуку містять усі транспортні засоби з роком між цими двома номерами.

Чи є там плагін, який може це зробити ??

Дякую за будь-яку допомогу .. Це мене зводить з розуму годинами !!!!


Я думаю, ви можете використовувати цей плагін, щоб допомогти вам краще wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI

Дякую .. Але це не пояснює, як насправді створити форму пошуку. Я маю на увазі, що я можу запрограмувати форму на HTML, але як я насправді змушую її функціонувати ?!
абсдигітал

Відповіді:


16

______UPDATE_______
Хоча я набираю все більше голосів, і рішення працює, але відповідь 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запит),
  • Передайте команди в межах запиту, отримуйте дані з db та
  • Показати результат [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 нічого немає.
  • Саніталізація та перевірка - текстове поле та текстові області настільки вразливі, що можуть спричинити неправильну практику вашого сайту Тому передача необроблених даних була б небезпечною, вам потрібно буде Sanitize та перевірити їх, перш ніж переходити в db-запит. ( Санітація та перевірка даних за допомогою WordPress - TutsPlus )
  • Дизайн - ви можете вибрати page.php(або search.php) шаблон і зробити цю сторінку на основі цього.

Отже, у вас виникла ідея, тепер ваша черга вивчити і відкрити шлях . Пам'ятайте, у кожного шлях різний. Зробіть своє, щоб я міг слідувати за вами. :)


Дякую за те, що знайшли час, дуже добрий з вас. Чи знаєте ви, як я можу це мати, щоб випадаюче меню "Зробити" автоматично відобразило будь-які знаки, які були введені в одному з постів автомобіля?
абсдигітал

Буде радий, якщо це працює для вас. :)
Mayeenul Islam

Чи знаєте ви, як я можу це мати, щоб випадаюче меню "Зробити" автоматично відобразило будь-які знаки, які були введені в одному з постів автомобіля?
абсдигітал

використовуйте WP_Query()користувальницькі параметри поля та цикліть результат, щоб показати <option>s.
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;
}

3
Дуже дякую за шлях WordPress. Просто працював з цим, і це приголомшливо. :)
Mayeenul Islam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.