______UPDATE_____
Mặc dù tôi ngày càng nhận được nhiều phiếu bầu và giải pháp hoạt động, nhưng câu trả lời của cybmeta thực sự là câu trả lời hay và theo cách của WordPress. Bạn chắc chắn nên thử điều đó.
Bước 1
Bắt đầu bằng cách tạo Biểu mẫu tìm kiếm nâng cao mà bạn muốn người dùng của mình sẽ tương tác với trang web và lưu nó với một tên (nghĩa là tôi đã lưu nó dưới dạng advanced-searchform.php
- nhưng đừng lưu nó với searchform.php
biểu mẫu tìm kiếm mặc định của 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>
Sau đó gọi biểu mẫu vào mẫu của bạn như sau:
<?php get_template_part( 'advanced', 'searchform' ); ?>
Bây giờ biểu mẫu tìm kiếm của bạn đã sẵn sàng và bây giờ bạn có thể sử dụng biểu mẫu tìm kiếm và có thể đưa người dùng nhập vào URL.
Bước 2
Những gì bạn chỉ cần là: truy vấn cơ sở dữ liệu và truy vấn loại bài đăng và các trường tùy chỉnh của nó theo truy vấn tìm kiếm . Hãy nhớ truy vấn tìm kiếm của bạn bây giờ là URL bạn nhận được sau khi gửi biểu mẫu. Bây giờ yêu cầu WordPress tải trang kết quả tìm kiếm tùy chỉnh của bạn khi biểu mẫu được gửi. Đặt chức năng sau vào của bạn functions.php
để nó sẽ kích hoạt mẫu tìm kiếm tùy chỉnh của bạn thay vì mặc định 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');
?>
Tôi đã mang mã ở đâu đó từ WPSE (tôi quên gốc), nhưng có tranh cãi khi sử dụng mã ở trên. Nhưng nó thực sự hoạt động ( tất nhiên là xin lỗi ).
Kiểm tra một cách khác @GM đề xuất.
Bước 3
Tạo một tệp mới và lưu nó với advanced-search-result.php
(vì chúng tôi đã sử dụng tên này trong functions.php
) và bây giờ bạn đang rảnh - rõ ràng. Khái niệm là:
- Lấy dữ liệu từ URL,
- Sử dụng một đơn giản
WP_Query()
(nếu truy vấn của bạn phức tạp thì sử dụng $wpdb
truy vấn),
- Truyền các lệnh trong truy vấn, tìm nạp dữ liệu từ db và
- Hiển thị kết quả [s]
Một mẫu có thể là:
<?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();
?>
Vì vậy, đây là điều cuối cùng của bạn. Nhưng vẫn còn nhiều thách thức:
- Giá trị thay thế - một tìm kiếm nâng cao có thể được thực hiện với TẤT CẢ các trường hoặc BẤT K of trường nào, vì vậy bạn phải đảm bảo Truy vấn lấy tất cả các kết quả theo tìm kiếm và dữ liệu. Bạn có thể sử dụng
$wpdb
truy vấn SQL tùy chỉnh cho kết quả tìm kiếm phức tạp và đó sẽ là MySQL thuần túy - WordPress không có gì ở đó.
- Khử trùng & Xác nhận - trường văn bản và textarea rất dễ bị tổn thương có thể gây ra hành vi mal cho trang web của bạn. Vì vậy, truyền dữ liệu thô sẽ không an toàn, bạn sẽ cần Vệ sinh và Xác thực chúng trước khi chuyển vào truy vấn db. ( Xác thực và xác thực dữ liệu với WordPress - TutsPlus )
- Thiết kế - bạn có thể chọn mẫu
page.php
(hoặc search.php
) và tạo trang này trên cơ sở đó.
Vì vậy, bạn đã có ý tưởng, bây giờ đến lượt bạn khám phá và khám phá con đường . Hãy nhớ rằng, cách của mọi người là khác nhau. Làm cho bạn, để tôi có thể theo bạn. :)