Membuat formulir pencarian untuk bidang khusus

11

Saya telah membangun tema untuk dealer mobil. Setiap mobil adalah jenis pos kustom ("kendaraan"), dan memiliki sekitar 12 bidang khusus dengan hal-hal seperti Merek, Model, Jarak Tempuh, Jenis Bahan Bakar, dll. Dll.

Jadi pada dasarnya di halaman rumah saya ingin formulir pencarian yang memiliki daftar drop-down untuk Make & Model dan berisi Makes atau Model yang tersedia.

Saya juga ingin memiliki 2 opsi untuk Tahun, sehingga pengguna akhir dapat memilih "2006" dan "2012" dan hasil pencarian berisi semua kendaraan dengan tahun antara dua angka tersebut.

Apakah ada plugin di luar sana yang bisa melakukan ini ??

Terima kasih atas bantuannya .. ini telah membuatku gila selama berjam-jam !!!!

absdigital
sumber
Saya pikir Anda dapat menggunakan ini, plug-in untuk membantu Anda lebih baik wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI
Terima kasih .. Tapi itu tidak menjelaskan bagaimana cara membuat form pencarian. Maksud saya, saya bisa memprogram formulir dalam HTML, tetapi bagaimana saya benar-benar membuatnya berfungsi ?!
absdigital

Jawaban:

16

______UPDATE_______
Meskipun saya mendapatkan lebih banyak suara, dan solusinya berhasil, tetapi jawaban cybmeta sebenarnya adalah jawaban yang baik dan cara WordPress. Anda pasti harus mencobanya.

Langkah 1

Mulailah dengan membuat Formulir Pencarian Lanjutan yang Anda inginkan pengguna Anda akan berinteraksi dengan situs web, dan menyimpannya dengan nama (yaitu saya menyimpannya sebagai advanced-searchform.php- tetapi jangan menyimpannya dengan searchform.phpitu maka itu akan menggantikan formulir pencarian default 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>

Kemudian panggil formulir ke templat Anda seperti berikut:

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

Sekarang formulir pencarian Anda sudah siap, dan sekarang Anda dapat menggunakan formulir pencarian dan dapat mengambil input pengguna ke dalam URL.

Langkah 2

Yang Anda butuhkan adalah: query database dan query tipe posting dan bidang kustom sesuai permintaan pencarian . Ingat permintaan pencarian Anda sekarang adalah URL yang Anda dapatkan setelah pengiriman formulir. Sekarang minta WordPress untuk memuat halaman hasil pencarian kustom Anda ketika formulir dikirimkan. Tempatkan fungsi berikut ke dalam Anda functions.phpsehingga akan mengaktifkan templat pencarian khusus Anda alih-alih default 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');
?>

Saya membawa kode dari WPSE (saya lupa root), tetapi ada kontroversi menggunakan kode di atas. Tapi itu benar-benar berfungsi ( tentu saja alasan yang lemah ).

Periksa cara lain yang disarankan @GM.

Langkah 3

Buat file baru dan simpan dengan advanced-search-result.php(karena kami menggunakan nama ini functions.php) dan sekarang Anda bebas - jelas. Konsepnya adalah:

  • Raih data dari URL,
  • Gunakan sederhana WP_Query()(jika permintaan Anda kompleks maka gunakan $wpdbpermintaan),
  • Lewati perintah dalam kueri, ambil data dari db, dan
  • Tunjukkan hasilnya [s]

Sampel dapat berupa:

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

Jadi, inilah hal terakhir Anda. Namun masih ada banyak tantangan:

  • Nilai Alternatif - pencarian lanjutan dapat dilakukan dengan SEMUA bidang atau SETIAP bidang, sehingga Anda harus memastikan Kueri mengambil semua hasil sesuai pencarian dan data. Anda dapat menggunakan $wpdbkueri SQL khusus untuk hasil pencarian yang kompleks dan itu akan menjadi MySQL murni - WordPress tidak ada di sana.
  • Sanitasi & Validasi - bidang teks dan textarea sangat rentan yang dapat menyebabkan praktik pada situs Anda. Jadi mengirimkan data mentah akan tidak aman, Anda perlu Sanitasi dan Validasi sebelum meneruskan ke permintaan db. ( Sanitasi Data dan Validasi dengan WordPress - TutsPlus )
  • Merancang - Anda dapat memilih page.php(atau search.php) templat dan membuat halaman ini berdasarkan itu.

Jadi, Anda punya ide, sekarang giliran Anda untuk menjelajahi dan menemukan jalannya . Ingat, cara setiap orang berbeda. Buat milikmu, supaya aku bisa mengikutimu. :)

Mayeenul Islam
sumber
Terima kasih telah meluangkan waktu, terima kasih banyak. Apakah Anda tahu bagaimana saya dapat memilikinya sehingga menu drop down untuk "Makes" akan secara otomatis menampilkan semua merek yang telah dimasukkan di salah satu pos kendaraan?
absdigital
Senang jika itu bekerja untuk Anda. :)
Mayeenul Islam
Apakah Anda tahu bagaimana saya dapat memilikinya sehingga menu drop down untuk "Makes" akan secara otomatis menampilkan semua merek yang telah dimasukkan di salah satu pos kendaraan?
absdigital
menggunakan WP_Query()parameter bidang khusus menggunakan dan loop hasil untuk menunjukkan <option>s.
Mayeenul Islam
Saya ingin melihat "pencarian lanjutan" ini dilakukan menggunakan pre_get_postshook dan bukan loop sekunder.
cybmeta
23

Meskipun jawaban @ MayeenulIslam dapat bekerja, saya pikir cara yang benar untuk melakukan pencarian lanjutan adalah dengan menggunakan pre_get_postskait tindakan.

Langkah 1: Formulir Pencarian

Langkah ini sama dengan langkah 1 dalam jawaban lain, hanya mengubah iddari namelapangan ( <input type="text" ...>yang digunakan untuk pencarian untuk "s" , sehingga akan digunakan langsung untuk sebagai kolom pencarian. Simpan kode ini di advanced-searchform.phpbawah folder tema Anda. Kemudian, gunakan get_template_part( 'advanced', 'searchform' );untuk muat di tempat yang Anda inginkan muncul di tema Anda:

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

Langkah 2: Tambahkan filter ke permintaan pencarian

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

    }
}

Langkah 3: Templating (opsional)

Dengan metode ini, templat pencarian default WordPress akan digunakan untuk memfilter hasil tanpa perlu kueri sekunder. Jika Anda ingin menggunakan templat yang berbeda untuk pencarian lanjutan, Anda dapat menggunakan template_includefilter. Misalnya, jika Anda ingin menggunakan advanced-search-template.phpfile sebagai templat untuk hasil dari formulir pencarian lanjutan:

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
sumber
3
Terima kasih banyak untuk cara WordPress. Hanya bekerja dengan yang satu ini dan itu luar biasa. :)
Mayeenul Islam