カテゴリフィルタとキーワード入力で検索する検索フォームを作成しました。検索フォームのコードはこちら
<form action="<?php bloginfo('url'); ?>" method="get" role="search" class="dropdown-form">
<div class="input-group">
<span class="input-group-addon">
<?php
wp_dropdown_categories(array(
'show_option_all' => 'all categories',
'class' => 'search_cats'
));
?>
</span>
<input type="search" class="form-control" placeholder="<?php esc_html_e('Search anything...', 'onepro'); ?>" name="s">
<span class="input-group-addon">
<button type="submit"><i class="ion-Android-arrow-forward"></i></button>
</span>
</div>
</form>
それから私はpre_get_posts
ファイルの一番下にfunctions.php
フックを追加しました
add_action('pre_get_posts', function() {
global $wp_query;
if (is_search()) {
$cat = intval($_GET['cat']);
$cat = ($cat > 0) ? $cat : '';
$wp_query->query_vars['cat'] = $cat;
}
});
検索フォームも機能しています。しかし、投稿カテゴリを表示するために私がWP_Query()
を使ったところに、以下のような注意が表示されます -
Notice:is_searchが誤って呼び出されました。条件付き照会タグは、照会が実行される前には機能しません。それ以前は、常にfalseを返していました。詳しくはWordPressでのデバッグをご覧ください。 (このメッセージはバージョン3.1.0で追加されました。)C:\ xampp\htdocs\onepro\wp-includes\functions.phpの3996行目に
これがクエリコードです。
global $wp_query;
global $paged;
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query(array(
'post_type' => 'post',
'posts_per_page' => $atts['show_posts'],
'paged' => $paged,
));
if ( $wp_query->have_posts() ) :
$all_cat_slug = array();
while ( $wp_query->have_posts() ) : $wp_query->the_post();
$category = get_the_category();
foreach( $category as $cat ){
array_Push($all_cat_slug, $cat->slug);
}
endwhile;
$all_cat_slug = array_unique( $all_cat_slug );
endif;
<!--Portfolio Filter-->
<div class="row filters_row text-left">
<ul class="nav navbar-nav" id="blogs_filters">
<li data-filter="*" class="active"><?php echo esc_html__('all', 'onepro-essential'); ?></li>
<?php
foreach( $all_cat_slug as $cs ){
$catname = get_category_by_slug( $cs );
echo '<li data-filter=".category-'. $cs .'">'. $catname->name .'</li>';
}
?>
</ul>
</div>
エラー通知は、表示されているカテゴリの前に表示されます。エラーのスクリーンショット - どうすればこの問題を解決できますか?
コアのis_search()
関数では、グローバルな$wp_query
が設定されているかどうかのチェックがあります。
global $wp_query;
if ( ! isset( $wp_query ) ) {
_doing_it_wrong( __FUNCTION__,
__( 'Conditional query tags do not work before the query is run.
Before then, they always return false.' ), '3.1.0' );
return false;
}
設定を解除していることに注意してください。
$wp_query = null;
WP_Query
が起動したときにis_search()
を呼び出す、新しいpre_get_posts
サブクエリを作成する直前に。
それが_doing_it_wrong()
がアクティブになった時です。
余分なデータベースクエリを実行しないように、可能であれば余分なWP_Query
サブクエリの代わりに mainクエリ を常に使用するようにしてください。
フロントエンドでメインの検索クエリをターゲットにするには、次のようにします。
add_action('pre_get_posts', function( \WP_Query $q ) {
if (
! is_admin() // Only target the front-end
&& $q->is_main_query() // Target the main query
&& $q->is_search() // Target a search query
) {
// do stuff
}
});
ありがとう@birgire。次のエラーメッセージで同様の問題が発生したので、コメントアウトして修正しました。$wp_query = null;
エラーメッセージ:
Notice:is_homeが誤って呼び出されました。条件付き照会タグは、照会が実行される前には機能しません。それ以前は、常にfalseを返していました。詳しくはWordPressでのデバッグをご覧ください。 (このメッセージはバージョン3.1.0で追加されました。)4146行目の(MYsyspath)/functions.php
そしてうまくいった、犯人は私のindex.php
に対するグローバル変数設定解除アクションだった
$wp_query = null; to //$wp_query = null;