web-dev-qa-db-ja.com

カテゴリをクエリから削除します(archive.php内のすべての投稿を表示)。pre_get_posts()

私はpre_get_posts()を使ってすべての投稿をどのカテゴリーアーカイブにも表示できるようにしています。これは、isotope.jsを使用したJavaScriptのソートおよびフィルタリング方法を提供するためです。どのカテゴリページでもすべての投稿が出力されますが、そのカテゴリの一部ではないページは最初は非表示になります。

function show_all_cats( $query ) {
    if ( !$query->is_main_query() ){
        return;
    }
    if ( is_admin() ){
        return;
    }
    if ( $query->is_archive ) {
        $query->set('cat', ''); //here is the problem
        var_dump($query);
        return;
    }
    return;
}
add_action( 'pre_get_posts', 'show_all_cats' );

'cat'0null''および'-' . $currentcategoryidに設定してみました。それらはすべて、そうでなければ表示されるはずの投稿のみ(すべてカテゴリー内)を表示するか、または何も表示しません。

私はquery_posts()を使ってみましたが、これもうまくいきませんでした。私はまた言われました:

分類法を操作するには、メタクエリーの処理を再実行する必要があります。

1
Bill

Cat変数の設定を解除するだけではおそらく不十分です。 pre_get_postsフックはクエリ変数が既に解析された後に起こります。したがって、taxonomy =カテゴリとterms = yourカテゴリを持つtax_queryがおそらくあるでしょう。

あなたは、おそらくデバッグのために、あなたのコードですでに$ queryをダンプしています。それで、あなたが実際に捨てているものを見てください。 tax_queryが見えますか?コードを変更して、その$クエリを希望どおりになるように調整します。

1
Otto

これを試しましたか?

unset( $query->query_vars['cat'] );
0
Tom J Nowell

それは約4年後です、しかし誰かが答えを必要とするならば、これは解決策です:

if ( $query->is_archive ) {
    $q->set( 'category_name', '*your-category-slug*' );
}

乾杯

0
karlosuccess

フィルタpre_get_posts()を使用して、SQLクエリのWHERE部分を変更できます。

add_filter( 'posts_where', function ( $where ) {
    $where = preg_replace("regex pattern", "", $where);
        return $where;
    }, 10, 2 );

これは少しハッキングによる解決策ですが、うまくいくはずです。

0
user9909