Sau khi đùa với theme wordpress, giờ chúng ta cùng chuyển qua… nghịch với tính năng search của WordPress. Bài viết này sẽ cung cấp cho bạn một số tùy biến cho tính năng này.
Phụ mục
Loại trừ các category khỏi kết quả tìm kiếm
Có thể do một yêu cầu cá nhân nào đó, bạn muốn loại bỏ các bài viết thuộc một category nào đó ra khỏi kết quả tìm kiếm. Mục đích là nhằm làm các category này không được tìm thấy trong danh sách bài viết. Để làm được việc này bạn cần thêm hàm sau trong file functions.php của theme:
[code lang=”php”] function SearchFilter($query) {if ($query->is_search) {
$query->set(‘cat’,’0,1′);
}
return $query;
}
add_filter(‘pre_get_posts’,’SearchFilter’);
[/code]
Thay Category có ID 0, 1 ở đoạn code trên bằng category của bạn.
Tìm kiếm trong danh mục
Mặc định khung tìm kiếm của các theme sẽ là tìm tất cả các bài viết chứa keyword được nhập. Chúng ta có thể tùy biến nó bằng cách thêm vào một danh sách các category giúp cho việc tìm kiếm được cụ thể hóa hơn.
Codex có hỗ trợ hàm wp_dropdown_categories để bạn có thể làm việc này. Cách sử dụng hàm này như sau:
[code lang=”php”]<?php wp_dropdown_categories( ‘show_option_all=All Categories’ ); ?><!– Dữ liệu output sẽ có dạng như sau –>
<select name=’cat’ id=’cat’ class=’postform’ >
<option value=’0′ selected=’selected’>All Categories</option>
<option class="level-0" value="1">Uncategorized</option>
<option class="level-0" value="3">HTML & CSS</option>
<option class="level-0" value="4">Java</option>
<option class="level-0" value="5">Links</option>
<option class="level-0" value="6">Linux</option>
<option class="level-0" value="9">Javascript</option>
<option class="level-0" value="32">XML</option>
</select>
[/code]
Tìm trong file searchform.php của theme, bạn sẽ tìm thấy đoạn code làm công việc hiển thị hộp tìm kiếm tương tự như đoạn code dưới đây:
[code] <form role="search" method="get" id="searchform" action="<?php bloginfo(‘siteurl’); ?>"><div>
<label class="screen-reader-text" for="s">Search for:</label>
<input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>
[/code] Giờ tôi thêm hàm wp_dropdown_categories() đã nói ở trên vào để tạo nên hộp tìm kiếm theo chuyên mục:
[code] <form role="search" method="get" id="searchform" action="<?php bloginfo(‘siteurl’); ?>">
<div>
<label class="screen-reader-text" for="s">Search for:</label>
<input type="text" value="" name="s" id="s" />
in <?php wp_dropdown_categories( ‘show_option_all=All Categories’ ); ?>
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>
[/code]
Vậy là xong rồi, nhưng để đẹp hơn chúng ta sẽ làm thêm 1 bước nữa, đó là hiển thị category mà người dùng đã tìm kiếm trong danh sách các kết quả trả về.
Bạn ở file functions.php của theme và thêm vào đoạn code sau:
[code lang=”php”] function getCatSearchFilter($pre,$post){ $category = "";
$catId = htmlspecialchars($_GET["cat"]);
if ($catId != null && $catId != ” && $catId != ‘0’){
$category = $pre.get_cat_name($catId).$post;
}
return $category;
}
[/code]
Đoạn code này có nhiệm vụ trả về tên của category mà người dùng đã chọn tìm. Nếu người dùng không lựa chọn một category, kết quả trả về sẽ là rỗng (null).
Bước cuối cùng là hiển thị ở trang kết quả. Bạn hãy mở file search.php và thêm vào đoạn sau:
[code lang=”php”] <h1>Search Results for <?php echo(get_search_query());?><?php echo(getCatSearchFilter(‘ in category ‘,”));?></h1>[/code]
Tìm kiếm theo loại bài viết
Có nhiều yếu tố khiến bạn lựa chọn kiểu tìm kiếm này. Ví dụ như bạn chỉ chọn một số loại bài nhất định để tìm kiếm như tìm kiếm bài viết bình thường hoặc tìm kiếm theo RSS mà thôi. Nếu mục đích của bạn đúng như những gì mô tả ở trên. Bạn hãy thêm đoạn code này vào functions.php của theme.
[code lang=”php”] function SearchFilter($query) {if ($query->is_search) {
// Insert the specific post type you want to search
$query->set(‘post_type’, ‘feeds’);
}
return $query;
}
// This filter will jump into the loop and arrange our results before they’re returned
add_filter(‘pre_get_posts’,’SearchFilter’);
[/code]
Thay type kiểu feeds thành kiểu dữ liệu của bạn.
Hiển thị số kết quả tìm kiếm được
Có bao nhiêu kết quả cho từ khóa được tìm thấy ? Để thấy được số lượng này, hãy mở file search.php trong theme và tìm đoạn sau:
[code lang=”php”]h2 class="pagetitle">Search Results</h2>[/code]Thay thế nó bằng đoạn code dưới đây:
[code lang=”php”] <h2 class="pagetitle">Search Result for <?php /* Search Count */ $allsearch = &new WP_Query("s=$s&showposts=-1"); $key = wp_specialchars($s, 1); $count = $allsearch->post_count; _e(”); _e(‘<span class="search-terms">’); echo $key; _e(‘</span>’); _e(‘ — ‘); echo $count . ‘ ‘; _e(‘articles’); wp_reset_query(); ?></h2>[/code]
Highlight keyword
Đoạn code dưới này làm cho kết quả của bạn rõ ràng hơn với những từ khóa được làm nổi bật.
Trước tiên thêm đoạn code sau vào file functions.php của theme
[code lang=”php”] function hls_set_query() {$query = attribute_escape(get_search_query());
if(strlen($query) > 0){
echo ‘
<script type="text/javascript">
var hls_query = "’.$query.’";
</script>
‘;
}
}
function hls_init_jquery() {
wp_enqueue_script(‘jquery’);
}
add_action(‘init’, ‘hls_init_jquery’);
add_action(‘wp_print_scripts’, ‘hls_set_query’);
[/code]
Thêm đoạn code này vào file header.php của theme, trên thẻ
[code]
<style type="text/css" media="screen">
.hls { background: #D3E18A; }
</style>
<script type="text/javascript">
jQuery.fn.extend({
highlight: function(search, insensitive, hls_class){
var regex = new RegExp("(<[^>]*>)|(\\b"+ search.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1") +")", insensitive ? "ig" : "g");
return this.html(this.html().replace(regex, function(a, b, c){
return (a.charAt(0) == "<") ? a : "<strong class=\""+ hls_class +"\">" + c + "</strong>";
}));
}
});
jQuery(document).ready(function($){
if(typeof(hls_query) != ‘undefined’){
$("#post-area").highlight(hls_query, 1, "hls");
}
});
</script>
[/code]
Bỏ chức năng tìm kiếm
Đôi lúc, tác giả blog không muốn sử dụng công cụ tìm kiếm trên blog. Cách đơn giản nhất là loại khung search ra khỏi giao diện. Tuy nhiên, người dùng sẽ có thể tìm kiếm được thông qua một số thủ thuật nhất định nào đó nếu họ am hiểu về cơ chế gửi dữ liệu.
Vậy, cách an toàn nhất là disable luôn chức năng search thì cho dù họ gửi gì lên cũng vậy mà thôi :D . Để làm được việc này bạn thêm đoạn code sau vào file functions.php của theme.
[code lang=”php”]
function fb_filter_query( $query, $error = true ) {
if ( is_search() ) {
$query->is_search = false;
$query->query_vars[s] = false;
$query->query[s] = false;
// to error
if ( $error == true )
$query->is_404 = true;
}
}
add_action( ‘parse_query’, ‘fb_filter_query’ );
add_filter( ‘get_search_form’, create_function( ‘$a’, "return null;" ) );
[/code]
Tìm không giới hạn
Thông thường, kết quả trả về của WordPress bị giới hạn bởi số lượng record của vòng lặp loop. Nếu bạn muốn vượt qua giới hạn này bằng cách hiển thị tất cả các kết quả. Bạn có thể thử sử dụng cách dưới đây:
Bạn mở file search.php của theme và tìm đoạn code dưới đây:
[code lang=”php”]
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
[/code]
Thêm vào bên trên nó đoạn code sau:
[code lang=”php”]
<?php $posts=query_posts($query_string . ‘&posts_per_page=-1’); ?>
[/code]
Đoạn code này sẽ có nhiệm vụ set lại số lượng kết quả trên một trang về unlimit.
Chúc bạn thành công.
Đinh Chí Thành says
Chào anh Nhân! Mình có một blog, nó ở đây http://dinhchithanh.com. Mình có nhiều bài viết dài, mình cần phân trang cho nó. Theme mà mình đang sử dụng có thể phân trang, cụ thể mình đã làm được, ví dụ http://dinhchithanh.com/thiet-ke-web-phien-ban-di-dong/
Tuy nhiên, mình có cài thêm plugin hiển thị bài viết có liên quan. Nay mình muốn phần Bài viết liên quan này phải nằm dưới mục Page: 1 2. Tức là bố cục của trang content sẽ là: Nội dung, Page List, Bài viết liên quan, những thứ khác.
Rất mong là anh Nhân hướng dẫn cho mình vài ý!
Nguyễn Duy Nhân says
Plugin bài viết liên quan của bạn tên gì vui lòng nói rõ nhé =))
Billnguyen says
Anh Nhân ơi anh cho em hỏi với. Em có làm 1 site nhưng đang cần phân trang phần kết quả search, em đã tìm hoài trên mạng nhưng đã test những không được ạ. Em cảm ơn anh ạ