web-dev-qa-db-ja.com

is_searchが誤って呼び出されました

カテゴリフィルタとキーワード入力で検索する検索フォームを作成しました。検索フォームのコードはこちら

<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>

エラー通知は、表示されているカテゴリの前に表示されます。エラーのスクリーンショット - enter image description here  どうすればこの問題を解決できますか?

1
Eh Jewel

なぜ part

コアの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()がアクティブになった時です。

Workaround

余分なデータベースクエリを実行しないように、可能であれば余分な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
    }
});
3
birgire

ありがとう@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;
0
Aness