だから私はそれが特定のカテゴリだけを検索するように私の検索を編集しようとしています。このコードを子テーマのfunctions.php
ファイルに追加します。
function searchcategory($query) {
if ($query->is_search) {
$query->set('cat','37');
}
return $query;
}
add_filter('pre_get_posts','searchcategory');
これが問題です。たとえば、このコードを実行すると、検索でも何も見つかりません。
重要な注意事項:1)最初に、Toolsetプラグインを使用していくつかの分類法とカスタム投稿タイプを作成しました。これらは分類法の1つのIDです。これは問題になりますか? 2)検索結果からすべてのページを除外することになっているこのコードを実行すると、まだいくつかのページが表示されます。それは奇妙です。
function SearchFilter($query) {
if ($query->is_search) {
$query->set('post_type', 'page');
}
return $query;
}
add_filter('pre_get_posts','SearchFilter');
誰がこの問題の原因となり得るのか知っていますか?
このコードは問題なく動作するはずですが、いくつか問題があります。それを分解してコメントを加えましょう。
function searchcategory($query) {
if ($query->is_search) {
// Checking only for is_search is very risky. It will be set to true
// whenever param "s" is set. So your function will modify any wp_query with s,
// for instance the one in wp-admin... But also any other, even if
// the query isn't querying for posts...
$query->set('cat','37');
// You pass ID of term in here. It's a number. Passing it as string
// is not a problem, but it's another bad practice, because it will
// have to be converted to number.
}
return $query;
// It's an action - you don't have to return anything in it. Your result
// will be ignored.
}
add_filter('pre_get_posts','searchcategory');
// pre_get_posts is and action and not a filter.
// Due to the way actions/filters are implemented,
// you can assign your callback using `add_filter`,
// but it isn't a good practice.
それでは、どのようにそれをより良く書くのですか?
function searchcategory($query) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'cat', 37 );
}
}
add_action( 'pre_get_posts', 'searchcategory' );
私は問題を解決しました。私はこれと同じコードを追加しました:
function searchcategory($query) {
if ($query->is_search) {
$query->set('cat','37');
}
return $query;
}
add_filter('pre_get_posts','searchcategory');
問題はツールセットプラグインにありました。どういうわけか、それはカテゴリ/分類法に基づく検索結果をめちゃくちゃにしていました。それが何であれ、上記のコードはオリジナルのWordPressカテゴリでうまく動作します。