______UPDATE_______
แม้ว่าฉันจะได้รับคะแนนเสียงมากขึ้นเรื่อย ๆ และการแก้ปัญหาก็ใช้งานได้ แต่คำตอบของ cybmetaนั้นเป็นคำตอบที่ดีและเป็นวิธีของ WordPress คุณควรลองสิ่งนั้นอย่างแน่นอน
ขั้นตอนที่ 1
เริ่มต้นด้วยการสร้างแบบฟอร์มการค้นหาขั้นสูงที่คุณต้องการให้ผู้ใช้ของคุณจะโต้ตอบกับเว็บไซต์และบันทึกด้วยชื่อ (เช่นฉันบันทึกไว้เป็นadvanced-searchform.php
- แต่อย่าบันทึกไว้ด้วยsearchform.php
แล้วมันจะแทนที่แบบฟอร์มการค้นหาเริ่มต้นของ 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>
จากนั้นเรียกฟอร์มลงในเทมเพลตของคุณดังนี้:
<?php get_template_part( 'advanced', 'searchform' ); ?>
ตอนนี้แบบฟอร์มการค้นหาของคุณพร้อมแล้วและตอนนี้คุณสามารถใช้แบบฟอร์มการค้นหาและสามารถนำข้อมูลผู้ใช้ไปใส่ใน URL
ขั้นตอนที่ 2
สิ่งที่คุณเพียงแค่ต้องการคือการค้นหาฐานข้อมูลและแบบสอบถามประเภทโพสต์และสาขาที่กำหนดเองตามคำค้นหา โปรดจำไว้ว่าคำค้นหาของคุณคือ URL ที่คุณได้รับหลังจากส่งแบบฟอร์ม ตอนนี้ขอให้ WordPress โหลดหน้าผลการค้นหาที่คุณกำหนดเองเมื่อส่งแบบฟอร์ม วางฟังก์ชั่นต่อไปนี้ไว้ในของคุณfunctions.php
เพื่อที่จะเปิดใช้งานเทมเพลตการค้นหาที่กำหนดเองแทนค่าเริ่มต้น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');
?>
ฉันนำรหัสมาจาก WPSE (ฉันลืมราก) แต่มีข้อโต้แย้งในการใช้รหัสด้านบน แต่ใช้งานได้จริง ( แก้ตัวไม่ได้แน่นอน )
ตรวจสอบวิธีอื่นที่ @GM แนะนำ
ขั้นตอนที่ 3
สร้างไฟล์ใหม่และบันทึกด้วยadvanced-search-result.php
(เพราะเราใช้ชื่อนี้ในfunctions.php
) และตอนนี้คุณว่าง - เห็นได้ชัด แนวคิดคือ:
- หยิบข้อมูลจาก URL
- ใช้แบบง่าย
WP_Query()
(ถ้าแบบสอบถามของคุณซับซ้อนแล้วใช้$wpdb
แบบสอบถาม)
- ส่งคำสั่งภายในแบบสอบถามดึงข้อมูลจาก db และ
- แสดงผลลัพธ์ [s]
ตัวอย่างสามารถ:
<?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();
?>
ดังนั้นนี่คือสิ่งสุดท้ายของคุณ แต่ก็ยังมีความท้าทายมากมาย:
- ค่านิยมทางเลือก - การค้นหาขั้นสูงสามารถดำเนินการกับทั้งหมดของฟิลด์หรือใด ๆของสนามเพื่อให้คุณมีเพื่อให้แน่ใจว่าการแบบสอบถามคือการผลลัพธ์ทั้งหมดเป็นต่อการค้นหาและข้อมูล คุณสามารถใช้
$wpdb
แบบสอบถาม SQL ที่กำหนดเองสำหรับผลการค้นหาที่ซับซ้อนและนั่นจะบริสุทธิ์ MySQL - WordPress ไม่มีอะไรที่นั่น
- การฆ่าเชื้อและการตรวจสอบความถูกต้อง - ฟิลด์ข้อความและ textarea นั้นมีความเสี่ยงสูงที่อาจทำให้เกิดการปฏิบัติที่เลวร้ายต่อเว็บไซต์ของคุณ ดังนั้นการส่งข้อมูลดิบจะไม่ปลอดภัยคุณจะต้อง Sanitize และตรวจสอบความถูกต้องก่อนส่งผ่านแบบสอบถาม db ( การฆ่าเชื้อและการตรวจสอบข้อมูลด้วย WordPress - TutsPlus )
- การออกแบบ - คุณสามารถเลือกเทมเพลต
page.php
(หรือsearch.php
) และทำให้หน้านี้เป็นพื้นฐานของสิ่งนั้น
ดังนั้นคุณมีความคิดตอนนี้ก็ถึงตาของคุณไปสำรวจและค้นพบวิธี โปรดจำไว้ว่าวิธีของทุกคนแตกต่างกัน ทำให้เป็นของคุณเพื่อที่ฉันจะได้ตามคุณไป :)