Làm thế nào để tạo một tìm kiếm tùy chỉnh cho loại bài tùy chỉnh?


44

Tôi có một trường tìm kiếm cho các bài đăng trên blog, nhưng tôi cần một loại khác cho loại bài đăng tùy chỉnh. Làm cách nào tôi có thể tạo biểu mẫu tìm kiếm tùy chỉnh này với bố cục kết quả tìm kiếm khác ?

Câu trả lời:


61

Đâ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(); ?>
  1. 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/


Mẹo: khi đăng ký các loại bưu điện, các publicly_queryable luận phải được đặt đúng . Nếu không, get_query_var ('post_type') sẽ không bao giờ trả về giá trị post_type được đưa ra trong đối số url. codex.wordpress.org/Function_Reference/ Kẻ
Gustavo

Một mẹo / chỉnh sửa được đề xuất khác: 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_typevar của mình thành $post_type[0].
indextwo

có cách nào để viết lại url từ http://localhost:3000/?s=cloud%27&post_type=productđếnhttp://localhost:3000/search/cloud/product
YarGnawh

@YarGnawh Xin lỗi vì phản hồi muộn, hãy xem wordpress.stackexchange.com/questions/15418/ . Có một plugin được gọi là viết lại quá wordpress.org/plugins/rewrite
Ronald

các search_templatebộ lọc có vẻ là một lựa chọn thích hợp hơn đểtemplate_include
Alexey Kosov

6

Đâ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 đó!


2

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'); 

2

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ì.


1
Đáng lưu ý, nhưng 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 truehoặ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''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).
Mike

1

Để 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');

3
Sẽ thật tuyệt nếu bạn giải thích cách mã của bạn hoạt động, tiết lộ nguồn mã của bạn
Pieter Goosen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.