数ヶ月から、私は複数のカテゴリー検索オプションのためにワードプレスを掘り下げて、そしてついにこれを思い付きました。
Wordpressでは複数のタグを使用できます。つまり、URLに次のように入力すると、
http://yourblog.com/tag/tag1+tag2
それから、タグtag1 _と_ tag2を持つすべての投稿を返します
あなたがタイプするなら
http://yourblog.com/tag/tag1,tag2
それからそれはtag1 _または_ tag2を持つすべての投稿を返すでしょう
同じことが今もカテゴリのために働く
http://yourblog.com/category/cat1+cat2
とhttp://yourblog.com/category/cat1,cat2
しかし、これはカテゴリとタグに対してのみ機能します。私は検索オプションに対してそれを試みています。
今まで私はこのURLが機能している場所をコーディングしていました(つまり、カテゴリID 114のHTMLのみを検索します)。
http://yourblog.com/?s=html&cat=114
このURLでは、 コンマ区切り文字 は非常にうまく機能しますが、 + は機能しません。
私が言うつもりです
http://yourblog.com/?s=html&cat=114,115
非常にうまくいきますが
http://yourblog.com/?s=html&cat=114+115
動作しません。
誰かがこれを手伝ってくれる?私は本当にこれを機能させたい
まだ待っています
問題は、URL内の '+'記号はスペースと同じで、PHPがそれを見る方法です。
parse_request
に対してアクションを使用すると、このように動作させることができます。
add_action( 'parse_request', 'category_search_logic', 11 );
function category_search_logic( $query ) {
if ( ! isset( $query->query_vars[ 'cat' ] ) )
return $query;
// split cat query on a space to get IDs separated by '+' in URL
$cats = explode( ' ', $query->query_vars[ 'cat' ] );
if ( count( $cats ) > 1 ) {
unset( $query->query_vars[ 'cat' ] );
$query->query_vars[ 'category__and' ] = $cats;
}
return $query;
}
上の例では、PHPが$ _GETパラメータで見るものであるスペースでそれらを分割することによってそれらの間に '+'で渡されたカテゴリIDを取得します。
配列内に複数の項目がある場合、それは 'and'スタイルの検索である必要があります。そのため、指定したすべてのカテゴリの投稿を返す'category__and'
クエリ変数に配列を分割して渡すことができます。
@sanchothefatによって提案された解決策は問題ありませんが、ページネーションが使用されている場合は問題を引き起こします。たとえば、domain.com/?s=&cat=1+2のようなURLがあります。 2ページをクリックすると、URLはdomain.com/?s=&cat=1+ 2になりますが、wp-includes/canonical.phpで定義されているredirect_canonical()はurlをdomain.com/?s&cat=12に変更しようとします。同じではありません... category_search_logic()を書き直すよりもredirect_canonical()ロジックを調べて追加のフィルタを適用する方が簡単です。
これが私の標準的な論理を回避する方法です。
function category_search_logic( $query ) {
if ( ! isset( $_GET['categories'] ) )
return $query;
// split cat query on a space to get IDs separated by ',' in URL
$cats = explode(',', $_GET['categories'] );
if ( count( $cats ) > 1 ) {
unset($_GET['categories']);
$query->query_vars[ 'category__and' ] = $cats;
}
return $query;
}
これを試してください:http://yourblog.com/?s=html&cat[]=114&cat[]=115
ところで、なぜあなたはあなたの検索をフィルタリングするためにフックリンクpre_get_posts
を使わないのですか?検索URLを微調整するよりもはるかに簡単です。