web-dev-qa-db-ja.com

カスタム投稿タイプの検索結果をページ付けする方法は?

私は標準のTitle/Descriptionフィールドと共にいくつかのカスタムフィールドを格納する "cars"と呼ばれるカスタム投稿タイプを持っています。ユーザーの基準に一致するカスタムフィールドに基づいてCPTを検索できるようにする必要があります。私はその部分を考え出してそれはうまくいくが、問題はページネーションである。私はGoogleで見つけたコードに基づいてCPTをページ分割する方法を考え出しました、そしてそれは機能します、しかしあなたが1ページを離れると、あなたはもはやフォームと共に提出された検索データを持っていません。私はこれをどのように保存するべきか、あるいはそれを渡すべきかを知る必要があるだけです。

通常のPHPでは、セッションを使ってデータを保存しますが、Wordpressではそれをしないように言われました。だから、最良の選択肢は何ですか?トランジェントはWPバージョンのセッションであると言われましたが、これを効率的に使用する方法や、ユーザーごとにそれらを別々にする方法がわからないです。

誰かにこれを書くように頼んでいるのではありません - このための最善の概念を理解するための手助けが必要です。

5
kcarter609

カスタム検索クエリを実装する代わりに、標準検索にカスタムフィールドを含め、書き換え規則を使用して/?post_type=cars&s=mysearchterm/search/cars/mysearchtermにマッピングします。あるいは、POST/$_POSTや一時的なデータではなく、URLでクエリ変数を使用するだけです。 GET/$_GETはここのあなたの友達です。

トランジェントは、データを再計算するのではなく、一時的にデータを保存するためのものです。 RSSフィード、および計算に費用がかかるその他のもので、永続的な存続期間はありません。それらはセッションの代わりにはなりません(また、セッションや他の類似物も必要ありません)。

これにより、検索でカスタムフィールドをバンドルする方法がわかります。

http://stv.whtly.com/2010/03/15/extend-wordpress-search-to-include-custom-post-meta/

$wp->query_vars['s']またはget_query_var( 's' )に対してテストして、検索クエリが自分の投稿タイプに対するものであるかどうかを確認します。そうすれば、カスタムメタ検索ビットを条件付きで含めることができます。

クレジット:get_query_varチップをくれてありがとうkaiser

6
Tom J Nowell

@TomJNowellanswer とよく似ています。

検索では、検索リクエストに$_GETの代わりに$_POSTを使用してください。あなたの検索変数はあなたのカスタムページネーションのためにURLのページからページへと続くでしょう。

$_GETを使用することは潜在的にセキュリティ侵害を求めています。変数を検証またはサニタイズするようにしてください。 WordPressには データ検証 に関する多数の文書があります。そうでなければ、 検証 または サニタイズ のその他の方法については PHPマニュアル を読んでください。

カスタムページネーションに関しては、URLに追加の変数を設定することをお勧めします。あなたのカスタムページネーションはすでにページ番号を設定しているはずです。そのため、URLからページ番号(例:$_GET['page'])を取得し、検索結果に合わせてクエリオフセットを調整できます。

仮説的に、あなたは以下の設定と共にURLに対応したページ付けがあったとしましょう。

$number_posts = 10;// Numer of search results to display per page.
$current_page = $_SERVER['REQUEST_URI'];// Will return the current page values of your URL.
$sub_page = '/page/';// Current pagination page.
$using_pagination = strpos($current_page, $sub_page);// Check for paginated content.
if($using_pagination === false){
    /* Not using the pagination, get $number_posts with no offset. */
} else{
    $page_number = explode('/page/', $current_page);// Locate just the sub-page from the URL.
    $page_number = preg_replace('/\D/', '', $page_number[1]);// Get only the sub-page number from the URL.
    if(is_numeric($page_number)){
        /* Set the correct offset number, based on the number of search results to display. */
        $offset = ($page_number - 1) * $number_posts;
    }
    /* Using the pagination, get $number_posts, with an offset of $offset. */
}

適切な検索結果を返すために、カスタムのページ付けに上記のコードを使用できます。 注: 正しい検索結果を正しく照会するには、もちろんURLから検索変数を取り出す必要があります。

1
Michael Ecklund