______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. :)