Câu trả lời:
Đây là những gì tôi đã thử và có một giải pháp với 3 bước. Giả sử loại bài đăng tùy chỉnh của bạn là " sản phẩm "
1. Thêm mã chức năng ở đây bạn có thể chỉ định archive-search.php
function template_chooser($template)
{
global $wp_query;
$post_type = get_query_var('post_type');
if( $wp_query->is_search && $post_type == 'products' )
{
return locate_template('archive-search.php'); // redirect to archive-search.php
}
return $template;
}
add_filter('template_include', 'template_chooser');
2. Tạo mẫu kết quả tìm kiếm cho loại bài đăng tùy chỉnh (archive-search.php)
<?php
/* Template Name: Custom Search */
get_header(); ?>
<div class="contentarea">
<div id="content" class="content_right">
<h3>Search Result for : <?php echo "$s"; ?> </h3>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div id="post-<?php the_ID(); ?>" class="posts">
<article>
<h4><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h4>
<p><?php the_exerpt(); ?></p>
<p align="right"><a href="<?php the_permalink(); ?>">Read More</a></p>
<span class="post-meta"> Post By <?php the_author(); ?>
| Date : <?php echo date('j F Y'); ?></span>
</article><!-- #post -->
</div>
<?php endwhile; ?>
<?php endif; ?>
</div><!-- content -->
</div><!-- contentarea -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Xây dựng biểu mẫu tìm kiếm
Trong Biểu mẫu tìm kiếm này, giá trị "sản phẩm" bị ẩn và nó sẽ chỉ tìm kiếm các bài đăng sản phẩm .
<div>
<h3>Search Products</h3>
<form role="search" action="<?php echo site_url('/'); ?>" method="get" id="searchform">
<input type="text" name="s" placeholder="Search Products"/>
<input type="hidden" name="post_type" value="products" /> <!-- // hidden 'products' value -->
<input type="submit" alt="Search" value="Search" />
</form>
</div>
để biết thêm, tôi muốn liên kết bạn đến đây
http://www.wpbeginner.com/wp-tutorials/how-to-create-advified-search-form-in-wordpress-for-custom-post-types/
get_query_var('post_type')
trả về một mảng (chứ không phải là một chuỗi) để không thể so sánh trực tiếp. Vì tôi chỉ tìm kiếm một loại bài đăng một lần, tôi chỉ cần thay đổi $post_type
var của mình thành $post_type[0]
.
http://localhost:3000/?s=cloud%27&post_type=product
đếnhttp://localhost:3000/search/cloud/product
search_template
bộ lọc có vẻ là một lựa chọn thích hợp hơn đểtemplate_include
Đây là những gì làm việc cho tôi. Không sạch sẽ nhưng tôi không thể có bất kỳ câu trả lời nào khác để làm việc.
Mẫu tìm kiếm cho Loại bài tùy chỉnh:
<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
<label>
<span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
<input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
<input type="hidden" name="post_type" value="book" />
</label>
<input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>
Trong hàm.php:
function searchfilter($query) {
if ($query->is_search && !is_admin() ) {
if(isset($_GET['post_type'])) {
$type = $_GET['post_type'];
if($type == 'book') {
$query->set('post_type',array('book'));
}
}
}
return $query;
}
add_filter('pre_get_posts','searchfilter');
Trong tìm kiếm.php:
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<?php if(isset($_GET['post_type'])) {
$type = $_GET['post_type'];
if($type == 'book') {?>
/* Format for "book" custom post type */
<?php } else { ?>
/* Format for custom post types that are not "book,"
or you can use elseif to specify a second post type the
same way as above. Copy the default format here if you
only have one custom post type. */
<?php } ?>
<?php } else { ?>
/* Format to display when the post_type parameter
is not set (i.e. default format) */
<?php } ?>
<?php endwhile; else: ?>
/* What to display if there are no results. */
<?php endif; ?>
Đương nhiên ở cả ba nơi bạn sẽ cần thay thế "cuốn sách" bằng loại bài đăng tùy chỉnh của mình.
Hy vọng điều này sẽ giúp được ai đó!
Một mã ngắn thực tế hơn
function template_chooser($template)
{
global $wp_query;
$post_type = $wp_query->query_vars["pagename"];
if( isset($_GET['s']) && $post_type == 'products' )
{
return locate_template('archive-search.php'); // redirect to archive-search.php
}
return $template;
}
add_filter('template_include', 'template_chooser');
Tôi đang tìm cách sử dụng hai hình thức khác nhau cho các tìm kiếm thông thường và các tìm kiếm của tôi trên một loại bài đăng tùy chỉnh.
Loại bài đăng tùy chỉnh của tôi sử dụng một tiêu đề khác với các trang bình thường, trên trang bình thường của tôi, cuộc gọi đến mẫu tìm kiếm của tôi là:
<?php get_search_form(true); ?>
Và cuộc gọi đến mẫu tìm kiếm của tôi trong tiêu đề loại bài đăng tùy chỉnh là:
<?php get_template_part('search','library'); ?>
Có một trường bổ sung:
<input type="hidden" name="post_type" value="library" /> //Where "library" is my custom post type.
Trong tệp chức năng tôi có mã sau đây mà bạn đã cung cấp.
/** Custom Search for Library */
function search_library($template)
{
global $wp_query;
$post_type = get_query_var('post_type');
if( $wp_query->is_search && $post_type == 'library' )
{
return locate_template('search-library.php'); // redirect to archive-search.php
}
return $template;
}
add_filter('template_include', 'search_library');
Cái nào phát hiện nếu mẫu tìm kiếm đang thực hiện tìm kiếm trong các trường tùy chỉnh, do đó hiển thị tìm kiếm trong một mẫu tùy chỉnh, nếu không thì sử dụng mẫu bình thường.
Chỉnh sửa: đã sửa lỗi lệnh gọi hàm get_search_form () sẽ trả về true bất kể là gì.
get_search_form('true')
nên được get_search_form(true)
. get_search_form
đang tìm kiếm một đầu vào boolean, vì vậy true
hoặc false
. Bằng cách gói nó trong dấu ngoặc kép, bạn đang cho nó một chuỗi, không phải là tham số boolean. Cách thức chức năng được thiết lập, cả hai 'true'
và 'false'
sẽ trả về cùng một kết quả, bởi vì cả hai đều là các chuỗi không trống (khiến cho hàm trả về true trong cả hai trường hợp).
Để khắc phục sự cố tìm kiếm đầu vào trống, bạn có thể thay thế mã chức năng bằng cách này:
function template_chooser($template)
{
global $wp_query;
$post_type = get_query_var('post_type');
if( isset($_GET['s']) && $post_type == 'products' )
{
return locate_template('archive-search.php'); // redirect to archive-search.php
}
return $template;
}
add_filter('template_include', 'template_chooser');