web-dev-qa-db-fra.com

is_search a été appelé de manière incorrecte

J'ai créé un formulaire de recherche qui recherche par filtre de catégorie et par mot clé. Le code du formulaire de recherche est ici-

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

Puis j'ai ajouté le hook pre_get_posts au bas du fichier 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;
  }
});

Le formulaire de recherche fonctionne également. Mais l’avis ci-dessous apparaît sur lequel j’ai utilisé WP_Query() pour afficher les catégories de messages -

Remarque: is_search a été appelé de manière incorrecte. Les balises de requête conditionnelles ne fonctionnent pas avant l'exécution de la requête. Avant cela, ils retournent toujours faux. S'il vous plaît voir le débogage dans WordPress pour plus d'informations. (Ce message a été ajouté à la version 3.1.0.) Dans C:\xampp\htdocs\onepro\wp-includes\functions.php à la ligne 3996

Voici le code de requête

    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>

L'avis d'erreur se produit avant les catégories affichées. La capture d'écran d'erreur-  enter image description here  Comment puis-je résoudre ce problème?

1
Eh Jewel

Le Pourquoi partie

Dans la fonction principale is_search(), il est vérifié si le $wp_query global est défini:

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

Notez que vous le réinitialisez avec:

$wp_query = null;

juste avant de créer une nouvelle sous-requête WP_Query, celle-ci appelle is_search() lorsque pre_get_posts est déclenché.

C'est à ce moment que la _doing_it_wrong() est activée.

Workaround

Essayez toujours d'utiliser la requête main query , au lieu de sous-requêtes WP_Query supplémentaires si possible, pour éviter d'exécuter des requêtes de base de données supplémentaires.

Pour cibler la requête de recherche principale dans le front-end, nous pouvons utiliser:

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

Merci @birgire. Vous avez un problème similaire avec le message d'erreur suivant et vous l'avez corrigé en commentant la ligne: $wp_query = null;

Message d'erreur:

Remarque: is_home a été appelé de manière incorrecte. Les balises de requête conditionnelles ne fonctionnent pas avant l'exécution de la requête. Avant cela, ils retournent toujours faux. S'il vous plaît voir le débogage dans WordPress pour plus d'informations. (Ce message a été ajouté à la version 3.1.0.) Dans (MYsyspath) /functions.php à la ligne 4146

Et cela a fonctionné, le coupable était l'action non définie de variable globale sur mon index.php

$wp_query = null; to //$wp_query = null;
0
Aness