______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 $wpdb
sorguyu 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.
$wpdb
Karmaşı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. :)