Tworzenie formularza wyszukiwania dla pól niestandardowych

11

Zbudowałem temat dla salonu samochodowego. Każdy samochód jest niestandardowym typem postu („pojazd”) i ma około 12 niestandardowych pól z takimi elementami, jak marka, model, przebieg, rodzaj paliwa itp.

Zasadniczo na stronie głównej chcę formularz wyszukiwania, który ma rozwijane listy marek i modeli i zawiera wszelkie dostępne marki lub modele.

Chcę też, aby zawierały 2 opcje na rok, aby użytkownik końcowy mógł wybrać „2006” i „2012”, a wyniki wyszukiwania zawierają wszystkie pojazdy z rokiem pomiędzy tymi dwiema liczbami.

Czy istnieje wtyczka, która może to zrobić?

Dziękuję za wszelką pomoc .. doprowadza mnie to do szaleństwa od wielu godzin !!!!

absdigital
źródło
Myślę, że możesz użyć tej wtyczki, aby pomóc Ci lepiej wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI
Dzięki .. Ale to nie wyjaśnia, jak faktycznie utworzyć formularz wyszukiwania. Mam na myśli to, że mogę zaprogramować formularz w HTML, ale jak mogę go właściwie uruchomić ?!
absdigital

Odpowiedzi:

16

______UPDATE_______
Chociaż otrzymuję coraz więcej głosów, a rozwiązanie działa, ale odpowiedź cybmeta jest w rzeczywistości odpowiedzią, która jest przyjemna i zgodna z WordPress. Zdecydowanie powinieneś tego spróbować.

Krok 1

Zacznij od utworzenia formularza wyszukiwania zaawansowanego, w którym chcesz, aby użytkownik wchodził w interakcję ze stroną internetową i zapisz go z nazwą (tj. Zapisałem go jako advanced-searchform.php- ale nie zapisuj go, a searchform.phpwtedy zastąpi domyślny formularz wyszukiwania WordPressa ):

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

Następnie wywołaj formularz w szablonie w następujący sposób:

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

Teraz twój formularz wyszukiwania jest gotowy i możesz teraz użyć formularza wyszukiwania i wprowadzić dane użytkownika do adresu URL.

Krok 2

Potrzebne jest tylko: zapytanie do bazy danych i zapytanie o typ postu i jego pola niestandardowe zgodnie z zapytaniem wyszukiwania . Pamiętaj, że zapytanie jest teraz adresem URL otrzymanym po przesłaniu formularza. Teraz poproś WordPress o załadowanie niestandardowej strony wyników wyszukiwania po przesłaniu formularza. Umieść następującą funkcję w swojej, functions.phpaby włączyć niestandardowy szablon wyszukiwania zamiast domyślnego 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');
?>

Przyniosłem kod gdzieś z WPSE (zapomniałem roota), ale użycie powyższego kodu budzi kontrowersje. Ale tak naprawdę działa ( kiepska wymówka oczywiście ).

Sprawdź inny sposób sugerowany przez @GM.

Krok 3

Utwórz nowy plik i zapisz go za pomocą advanced-search-result.php(ponieważ używaliśmy tej nazwy w functions.php), a teraz jesteś wolny - oczywiście. Koncepcja to:

  • Chwyć dane z adresu URL,
  • Użyj prostego WP_Query()(jeśli twoje zapytanie jest złożone, użyj $wpdbzapytania),
  • Przekaż polecenia w zapytaniu, pobierz dane z bazy danych i
  • Pokaż wynik [s]

Próbka może być:

<?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();
?>

Oto twoja ostatnia rzecz. Ale wciąż istnieje wiele wyzwań:

  • Alternatywne wartości - wyszukiwanie zaawansowane można wykonać dla WSZYSTKICH pól lub DOWOLNEGO pola, więc musisz upewnić się, że zapytanie przyjmuje wszystkie wyniki zgodnie z wyszukiwaniem i danymi. Możesz użyć $wpdbniestandardowego zapytania SQL dla złożonego wyniku wyszukiwania, który będzie czystym MySQL - WordPress nie ma tam nic.
  • Sanitization & Validation - pole tekstowe i obszar tekstowy są tak wrażliwe, że mogą powodować niewłaściwe działanie witryny. Tak więc przekazywanie surowych danych byłoby niebezpieczne, musisz je zdezynfekować i zweryfikować przed przekazaniem do zapytania db. ( Czyszczenie i sprawdzanie poprawności danych za pomocą WordPress - TutsPlus )
  • Projektowanie - możesz wybrać szablon page.php(lub search.php) i na tej podstawie utworzyć tę stronę.

Masz pomysł, teraz twoja kolej na odkrycie i odkrycie drogi . Pamiętajcie, że każdy jest inny. Stwórz swój, abym mógł pójść za tobą. :)

Mayeenul Islam
źródło
Dziękuję za poświęcenie czasu, bardzo miło z twojej strony. Czy wiesz, jak mogę to zrobić, aby menu rozwijane „Sprawia” automatycznie pokazywało wszystkie marki, które zostały wprowadzone na jednym z postów pojazdu?
absdigital
Będzie mi miło, jeśli to zadziała. :)
Mayeenul Islam
Czy wiesz, jak mogę to zrobić, aby menu rozwijane „Sprawia” automatycznie pokazywało wszystkie marki, które zostały wprowadzone na jednym z postów pojazdu?
absdigital
użyj WP_Query()niestandardowych parametrów pola i zapętl wynik, aby wyświetlić <option>s.
Mayeenul Islam
Chciałbym, aby to „wyszukiwanie zaawansowane” odbywało się przy użyciu pre_get_postshaka, a nie dodatkowej pętli.
cybmeta
23

Chociaż odpowiedź @ MayeenulIslam może działać, myślę, że poprawnym sposobem wyszukiwania zaawansowanego jest użycie pre_get_postshaka akcji.

Krok 1: Formularz wyszukiwania

Ten krok równać do kroku 1 w drugiej odpowiedzi, po prostu zmienił idw namepolu ( <input type="text" ...>używany wyszukiwania do na „S” , więc będzie on używany bezpośrednio jako pola wyszukiwania. Zapisz ten kod w advanced-searchform.phpramach katalogu tematycznego. Następnie zastosowanie get_template_part( 'advanced', 'searchform' );do załaduj go tam, gdzie ma się pojawiać w motywie:

<?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>

Krok 2: Dodaj filtry do wyszukiwanego zapytania

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

    }
}

Krok 3: Szablon (opcjonalnie)

Dzięki tej metodzie domyślny szablon wyszukiwania WordPress będzie używany do filtrowania wyników bez potrzeby dodatkowego zapytania. Jeśli chcesz użyć innego szablonu do wyszukiwania zaawansowanego, możesz użyć template_includefiltra. Na przykład jeśli chcesz użyć advanced-search-template.phppliku jako szablonu wyników z formularza wyszukiwania zaawansowanego:

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
źródło
3
Dziękuję bardzo za sposób WordPressa. Właśnie z tym pracowałam i jest niesamowity. :)
Mayeenul Islam