web-dev-qa-db-ja.com

同じページ内に検索結果を表示する

問題

私は自分のサイトにそのページ内で追加の検索を行う必要があるページを持っています。私はメインヘッダの検索に<?php get_search_form(); ?>を使ったWordPress検索のデフォルトの方法を使っています。

私は自分のページに別のHTMLフォームを作成しました。デフォルトのPHPメソッドを使用しないでください。

<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
    <div>
        <label for="s" class="screen-reader-text">Search for:</label>
        <input type="text" id="s" name="s" value="" />
        <input type="hidden" name="post_type" value="photo_group" /> 
        <input type="submit" value="Search" id="searchsubmit" />
    </div>
</form>

検索したいカスタム投稿タイプを取得するためにtype=hiddenを使用します。

<input type="hidden" name="post_type" value="photo_group" />

これにより、次のようなリンクが表示されます。

http://mywebsite.com/?s=search&post_type=photo_group

質問

ページ上に作成された新しい検索フォームを使用すると、デフォルトのsearch.phpを使用して結果が表示されます。カスタム投稿タイプの検索の検索結果を表示するにはどうすればよいですか。同じページのdivに入力しますか。

結果を表示できない新しいページテンプレートを作成しようとしましたが、これが正しい方法である可能性がありますが、間違ったことをしただけですか。

* 編集 *

私はsanchothefatの解決を試みています。これは正しいですか?これは私の検索結果と検索クエリのための私の全体のdivです。

<div id="photo-search">
    <h2>Search Photos:</h2>
    <form action="<?php the_permalink(); ?>" id="searchform" method="get">
        <div>
            <label for="s" class="screen-reader-text">Search for:</label>
            <input type="text" id="search" name="search" value="" />
            <input type="hidden" name="post_type" value="photo_group" /> 
            <input type="submit" value="Search" id="searchsubmit" />
        </div>
    </form>

    <?php if( isset( $_REQUEST['search'] ) ) {
        query_posts( array(
        's' => $_REQUEST['search'],
        'post_type' => $_REQUEST['photo_group'],
        'paged' => $paged
        ));

        if( have_posts() ) : while ( have_posts() ) :
            the_title();
            the_content();                      
        endwhile; endif;

        wp_reset_query(); 
        }
    ?>
</div>

検索を実行すると404エラーページが見つかりません。

7
Romes

ページコンテキスト内で検索結果を表示したい場合は、最も簡単な方法としてカスタムループを実行する必要があります。そうしないと、ページ情報にアクセスできなくなります。

sという名前の入力をsearchqのような何か他のものに変更して、wordpressがそれを通常の検索で行うのを防ぐようにします。

次にform actionパラメータを現在のページのURLに変更します。そのためには<?php get_permalink(); ?>を使うことができます。

あなたがする必要があるループは以下の通りです:

<?php
    if ( isset( $_REQUEST[ 'search' ] ) ) {
          // run search query
          query_posts( array(
             's' => $_REQUEST[ 'search' ],
             'post_type' => $_REQUEST[ 'post_type' ],
             'paged' => $paged
             )
          );

        // loop
        if ( have_posts() ) : while ( have_posts() ) :
            // loop through results here
        endwhile; endif;

        // return to original query
        wp_reset_query();
    }
?>
4
sanchothefat

クエリを処理する前に変更することができます。

add_action('parse_query', function($query){

  // not the search request
  if(!$query->is_search)
    return;

  // validate post type here (you should provide a white-list)
  $post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : false;

  // adjust the query
  if($post_type && post_type_exists($post_type))
    $query->set('post_type', $post_type);

});

これにより、リクエストされた投稿タイプに一致する投稿が表示されます。

複数の投稿タイプをクエリしたい場合は、代わりに配列を渡してください:array('post', 'page', $post_type)。タイプに基づいて投稿をグループ化するには、ループ内でタイプを確認し、CPTを一時配列に格納します。一時配列は通常の投稿が表示された後に繰り返します。

2
onetrickpony