web-dev-qa-db-ja.com

Wordpressの複数カテゴリ検索

数ヶ月から、私は複数のカテゴリー検索オプションのためにワードプレスを掘り下げて、そしてついにこれを思い付きました。

Wordpressでは複数のタグを使用できます。つまり、URLに次のように入力すると、

http://yourblog.com/tag/tag1+tag2

それから、タグtag1 _と_ tag2を持つすべての投稿を返します

あなたがタイプするなら

http://yourblog.com/tag/tag1,tag2

それからそれはtag1 _または_ tag2を持つすべての投稿を返すでしょう

同じことが今もカテゴリのために働く

http://yourblog.com/category/cat1+cat2http://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

動作しません。

誰かがこれを手伝ってくれる?私は本当にこれを機能させたい

まだ待っています

5
Niraj Chauhan

問題は、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'クエリ変数に配列を分割して渡すことができます。

5
sanchothefat

@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;
}
1
stz184

これを試してください:http://yourblog.com/?s=html&cat[]=114&cat[]=115

ところで、なぜあなたはあなたの検索をフィルタリングするためにフックリンクpre_get_postsを使わないのですか?検索URLを微調整するよりもはるかに簡単です。

1
Anh Tran