私は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'
を0
、null
、''
および'-' . $currentcategoryid
に設定してみました。それらはすべて、そうでなければ表示されるはずの投稿のみ(すべてカテゴリー内)を表示するか、または何も表示しません。
私はquery_posts()
を使ってみましたが、これもうまくいきませんでした。私はまた言われました:
分類法を操作するには、メタクエリーの処理を再実行する必要があります。
Cat変数の設定を解除するだけではおそらく不十分です。 pre_get_posts
フックはクエリ変数が既に解析された後に起こります。したがって、taxonomy =カテゴリとterms = yourカテゴリを持つtax_queryがおそらくあるでしょう。
あなたは、おそらくデバッグのために、あなたのコードですでに$ queryをダンプしています。それで、あなたが実際に捨てているものを見てください。 tax_queryが見えますか?コードを変更して、その$クエリを希望どおりになるように調整します。
これを試しましたか?
unset( $query->query_vars['cat'] );
それは約4年後です、しかし誰かが答えを必要とするならば、これは解決策です:
if ( $query->is_archive ) {
$q->set( 'category_name', '*your-category-slug*' );
}
乾杯
フィルタpre_get_posts()
を使用して、SQLクエリのWHERE部分を変更できます。
add_filter( 'posts_where', function ( $where ) {
$where = preg_replace("regex pattern", "", $where);
return $where;
}, 10, 2 );
これは少しハッキングによる解決策ですが、うまくいくはずです。