Özel alanlar için bir arama formu oluşturma


12

Bir araba bayisi için bir tema oluşturdum. Her araba özel bir yazı tipidir ("araç") ve Marka, Model, Kilometre, Yakıt Tipi vb.Gibi şeylerle yaklaşık 12 özel alana sahiptir.

Temel olarak ana sayfada, Marka ve Model için açılır listelere sahip ve mevcut Marka veya Modelleri içeren bir arama formu istiyorum.

Ayrıca, Yıl için 2 seçeneğe sahip olmasını istiyorum, böylece son kullanıcı "2006" ve "2012" yi seçebilir ve arama sonuçları, bu iki sayı arasında yıl içeren tüm araçları içerir.

Orada bunu yapabilir bir eklenti var mı ??

Herhangi bir yardım için teşekkür ederim .. Bu beni saatlerce deli ediyor !!!!


Sanırım bunu daha iyi yardımcı olmak için kullanabilirsiniz, eklenti wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI

Teşekkürler .. Ama bu aslında arama formunun nasıl oluşturulacağını açıklamıyor. Yani formu HTML olarak programlayabilirim, ama aslında işlevini nasıl alabilirim ?!
13'te absdigital

Yanıtlar:


16

______UPDATE_______
Gerçi gittikçe daha fazla oy alıyorum ve çözüm işe yarıyor, ancak cybmeta'nın cevabı aslında güzel ve WordPress'in yolu. Kesinlikle denemelisin.

Aşama 1

Kullanıcının web sitesiyle etkileşime girmesini istediğiniz bir Gelişmiş Arama Formu oluşturarak başlayın ve bunu bir adla kaydedin (yani, advanced-searchform.php- olarak kaydettim - ancak kaydetmeyin searchform.php, WordPress'in varsayılan arama formunun yerini alacak ):

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

Ardından formu şablonunuzda aşağıdaki gibi arayın:

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

Artık arama formunuz hazırdır ve artık arama formunu kullanabilir ve kullanıcı girişini URL'ye alabilirsiniz.

Adım 2

Tek ihtiyacınız olan şey: veritabanını sorgulamak ve arama türüne göre posta türünü ve özel alanlarını sorgulamak . Arama sorgunuzun artık form gönderildikten sonra aldığınız URL olduğunu unutmayın. Şimdi WordPress'ten form gönderildiğinde özel arama sonucu sayfanızı yüklemesini isteyin. Aşağıdaki işlevi functions.php, varsayılan yerine özel arama şablonunuzu etkinleştirecek şekilde konumunuza yerleştirin 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');
?>

Kodu WPSE'den bir yere getirdim (kökü unuttum), ancak yukarıdaki kodu kullanarak tartışma var. Ama aslında işe yarıyor ( topal bahane elbette ).

@GM'nin önerdiği başka bir yolu kontrol edin .

Aşama 3

Yeni bir dosya oluşturun ve ile kaydedin advanced-search-result.php(çünkü bu adı kullandık functions.php) ve şimdi özgürsünüz - açıkçası. Konsept:

  • URL'deki verileri alın,
  • Basit kullanın WP_Query()(sorgunuz karmaşıksa $wpdbsorguyu kullanın),
  • Komutları sorgu içinde iletin, db'den veri alın ve
  • Sonucu göster [s]

Bir örnek olabilir:

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

İşte son şey. Ama yine de birçok zorluk var:

  • Alternatif Değerler - TÜM alanlar veya HERHANGİ bir alan ile gelişmiş bir arama yapılabilir , bu nedenle Sorgu'nun tüm sonuçları arama ve verilere göre aldığından emin olmanız gerekir. $wpdbKarmaşık arama sonucu için özel SQL sorgusu kullanabilirsiniz ve bu saf MySQL olacaktır - WordPress'in hiçbir şeyi yoktur.
  • Sterilizasyon ve Doğrulama - metin alanı ve metin alanı sitenizde kötü uygulamalara neden olabilecek kadar savunmasızdır. Ham verileri aktarmak güvensiz olacaktır, db sorgusuna geçmeden önce bunları Sanitize etmeniz ve Doğrulamanız gerekecektir. ( WordPress ile Veri Temizleme ve Doğrulama - TutsPlus )
  • Tasarım - page.php(veya search.php) şablonu seçebilir ve bu sayfayı buna dayanarak yapabilirsiniz.

Fikriniz var, şimdi yolu keşfetme ve keşfetme sırası sizde . Unutma, herkesin yolu farklı. Seninkini yap, böylece seni takip edebilirim. :)


Zaman ayırdığınız için teşekkür ederim, çok naziksiniz. Nasıl yapabileceğimi biliyor musunuz, böylece "Markalar" için açılır menü otomatik olarak araç direklerinden birine girilmiş markaları gösterecektir?
absdigital

Sizin için çalışıyorsa sevinirim. :)
Mayeenul Islam

Nasıl yapabileceğimi biliyor musunuz, böylece "Markalar" için açılır menü otomatik olarak araç direklerinden birine girilmiş markaları gösterecektir?
absdigital

Bir kullanmak WP_Query()göstermek için kullanan özel alan parametrelerini ve döngü sonucu <option>s.
Mayeenul Islam

Bu "gelişmiş arama" pre_get_postsikincil bir döngü değil kanca kullanılarak yapılan görmek istiyorum .
cybmeta

23

@ MayeenulIslam'ın cevabı işe yarayabilse de, gelişmiş bir arama yapmanın doğru yolunun pre_get_postseylem kancasını kullanmak olduğunu düşünüyorum .

1. Adım: Arama Formu

Bu adım, diğer yanıtında adımı 1'e eşit, adil değişti idait namealan ( <input type="text" ...>arama için kullanılan "s" arama alanı olarak doğrudan kullanılacak, böylece. Kaydet Bu kodu içinde advanced-searchform.phpTemanızın klasörü altında. Sonra, kullanım get_template_part( 'advanced', 'searchform' );için temanızda görünmesini istediğiniz yere yükleyin:

<?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. Adım: Arama sorgusuna filtre ekleyin

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

    }
}

Adım 3: Şablonlama (isteğe bağlı)

Bu yöntemle, WordPress'in varsayılan arama şablonu, ikincil bir sorguya gerek olmadan sonuçları filtrelemek için kullanılacaktır. Gelişmiş arama için farklı bir şablon kullanmak istiyorsanız template_includefiltreyi kullanabilirsiniz . Örneğin advanced-search-template.php, gelişmiş arama formundaki sonuçlar için dosyayı şablon olarak kullanmak istiyorsanız :

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'in yolu için çok teşekkür ederim. Sadece bununla çalıştı ve harika. :)
Mayeenul Islam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.