カスタム投稿タイプのカスタム検索を作成する方法は?


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. 検索フォームの作成
    この検索フォームでは、値「products」が非表示になり、製品の投稿のみが検索されます

     <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')文字列ではなく)配列を返したため、直接比較できませんでした。一度に1つの投稿タイプのみを検索するため、単に$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と呼ばれるプラグインがありますwordpress.org/plugins/rewrite
ロナルド

search_templateフィルタは、より適切な選択肢であると考えられるtemplate_include
アレクセイKosov

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

当然、3つの場所すべてで、「book」をカスタム投稿タイプに置き換える必要があります。

これが誰かを助けることを願っています!


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

通常の検索とカスタム投稿タイプでの検索に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を返すことが原因)の両方の空でない文字列であるため、同じ結果を返します。
マイク

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.