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- Comment puis-je résoudre ce problème?
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.
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
}
});
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;