맞춤 게시물 유형에 대한 맞춤 검색을 만드는 방법은 무엇입니까?


44

블로그 게시물에 대한 검색 필드가 있지만 사용자 정의 게시물 유형에 대한 다른 검색 필드가 필요합니다. 다른 검색 결과 레이아웃 으로이 사용자 정의 검색 양식 을 작성하려면 어떻게 해야합니까?

답변:


61

다음은 3 단계로 해결책을 찾았습니다. 맞춤 게시물 유형이 ' 제품 ' 이라고 가정 해 보겠습니다.

1 . 여기에 기능 코드를 추가 하십시오. 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. 사용자 정의 게시물 유형에 대한 검색 결과 템플릿 작성 (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. 검색 양식 작성
    이 검색 양식에서 "제품"값은 숨겨져 있으며 제품 게시물 만 검색합니다 .

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

더 많은 것을 위해, 나는 당신을 여기에 링크하고 싶습니다
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/


팁 : 게시물 유형을 등록 할 때 publicly_queryable 인수를 true 로 설정해야 합니다 . 그렇지 않은 경우 get_query_var ( 'post_type')은 url 인수에 지정된 post_type 값을 반환하지 않습니다. codex.wordpress.org/Function_Reference/…
구스타보

또 다른 팁 / 제안 편집 : get_query_var('post_type')문자열 대신 배열을 반환했기 때문에 직접 비교할 수 없었습니다. 한 번에 하나의 게시물 유형 만 검색하므로 $post_typevar를로 변경 했습니다 $post_type[0].
indextwo

에서 URL을 다시 작성하는 방법이 http://localhost:3000/?s=cloud%27&post_type=producthttp://localhost:3000/search/cloud/product
YarGnawh

@YarGnawh 늦은 응답으로 죄송합니다 . wordpress.stackexchange.com/questions/15418/…를 확인하십시오 . rewrite too라는 플러그인도 있습니다 wordpress.org/plugins/rewrite
Ronald

search_template필터에 더 적절한 대안이 될 것으로 보인다template_include
알렉세이 코 소프

6

여기 나를 위해 일하는 것이 있습니다. 깨끗하지는 않지만 이러한 다른 답변을 얻을 수 없었습니다.

맞춤 게시물 유형에 대한 검색 양식 :

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

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

search.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; ?>

세 곳 모두에서 "책"을 사용자 정의 게시물 유형으로 바꿔야합니다.

이것이 누군가를 돕기를 바랍니다!


2

더 현실화 된 짧은 코드

 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

일반 검색과 맞춤 게시물 유형에 대한 검색에 두 가지 다른 양식을 사용하려고했습니다.

내 맞춤 게시물 유형은 일반 페이지와 다른 헤더를 사용합니다. 일반 페이지에서 내 검색 양식에 대한 호출은 다음과 같습니다.

<?php get_search_form(true); ?>

그리고 맞춤 게시물 유형 헤더에서 검색 양식을 호출하면 다음과 같습니다.

<?php get_template_part('search','library'); ?>

추가 필드가 있습니다.

<input type="hidden" name="post_type" value="library" /> //Where "library" is my custom post type.

함수 파일에는 다음과 같은 코드가 있습니다.

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

검색 양식이 사용자 정의 필드 내에서 검색을 수행하는지 여부를 감지하여 사용자 정의 템플리트에 검색을 표시합니다. 그렇지 않으면 일반 템플리트를 사용하십시오.

편집 : get_search_form () 함수 호출이 무엇이든 상관없이 true를 반환하도록 수정했습니다.


1
주목할 가치가 있지만 get_search_form('true')이어야합니다 get_search_form(true). get_search_form부울 입력을 찾고 있으므로 true또는 false. 따옴표로 묶으면 부울 매개 변수가 아닌 문자열을 제공합니다. 기능이 설정되어, 모두하는 방식 'true''false'그들이 (함수가 두 경우에 true를 돌려됩니다) 모두 비어 있지 않은 문자열이기 때문에, 동일한 결과를 반환합니다.
Mike

1

빈 입력 검색 문제를 해결하기 위해 함수 코드를 다음과 같이 대체 할 수 있습니다.

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
코드 작동 방식을 설명하고 코드 소스를
밝히면
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.