page de résultats de recherche personnalisée
2 réponses
- votes
-
- 2015-05-11
J'ai quelques recommandationspour votre question:
D'abord : arrêtez d'utiliser
query_posts ()
. Consultez le codex sur cettefonction pour voirpourquoi vousne devriezpas l'utiliser dans desthèmes ou desplugins. Quoi qu'ilen soit,si vous êtes dans une situation étrange où vousn'avezpas d'optionet que vous devez utiliserquery_posts ()
,vous devezexécuterwp_reset_query ()
après laboucle. Vous devez savoir que vous utilisez leglobal $ wp_query
,qui contient la requête d'originefaitepar WordPress,puisquery_post
quimodifie leglobal $ wp_query
variable,vous vous retrouvez avec des résultatsinattendus. Deplus,vous utilisez unparamètre obsolèteshowposts
,remplacéparposts_per_page
.Deuxième : vouspouvez utiliser unmodèle de recherchepersonnalisé (search.php)pourpersonnaliser l'apparence. Créez simplement unfichier search.php dans votre dossier dethèmeet personnalisez-le comme vous le souhaitez. Nefaitespas de requêtespersonnaliséesici ; si vousfaites cela,vousfaites unenouvelle requêtepour les articleset gaspillez la requête déjàeffectuéepar WordPress. Ungaspillage de ressources avec unimpactnégatif sur lesperformances.
Troisième :pourmodifier lesparamètres de requêtepar défaut utiliséspar WordPress,comme lenombre d'articlesparpage,etc.,vouspouvez utiliser
pre_get_posts
action .Alors,créez votremodèle search.php comme vous le souhaitezet utilisez l'action
pre_get_posts
pour dire à WordPress lesparamètres que vous souhaitez utiliser dans la requête de recherche:Lemodèle search.phppourrait être quelque chose comme ceci:
& lt;?php get_header (); global $ wp_query; ? > & lt; div class="wapper" > & lt; div class="contentarea clearfix" > & lt; div class="contenu" > & lt; h1 class="titre de recherche" > & lt;?phpecho $ wp_query- >found_posts;? > & lt;?php _e ('Résultats de la recherchetrouvéspour','locale');? > ;: "& lt;?phpthe_search_query ();? >" & lt;/h1 > & lt;?php si (have_posts ()) {? > & lt; ul > & lt;?php while (have_posts ()) {the_post ();? > & lt; li > & lt; h3 > & lt; a href="& lt;?phpechoget_permalink ();? >" > & lt;?phpthe_title ();? > & lt;/a > & lt;/h3 > & lt;?phpthe_post_thumbnail ('medium')? > & lt;?phpecho substr (get_the_excerpt (),0,200);? > & lt; div class="h-readmore" > & lt; a href="& lt;?phpthe_permalink ();? >" > En savoirplus & lt;/a > & lt;/div > & lt;/li > & lt;?php}? > & lt;/ul > & lt;?phpechopaginate_links ();? > & lt;?php}? > & lt;/div > & lt;/div > & lt;/div > & lt;?phpget_footer ();? >
Et l'action
pre_get_posts
quelque chose comme ceci:add_action ('pre_get_posts',function ($ query) { //Vérifier que c'estbien la requête quenous voulonsmodifier: requête de recherchefrontale if ($ query- >is_main_query () & amp; & amp;!is_admin () & amp; & amp; $ query- >is_search ()) { //Changer lesparamètres de la requête $ query- > set ('posts_per_page',3); } });
I have some recommendations for your question:
First: stop using
query_posts()
. See the codex about this function to see why you shouldn't use it in themes or plugins. Anyway, if you are in a some weird situation where you have not option and you need to usequery_posts()
, you should runwp_reset_query()
after the loop. You must know that you are using theglobal $wp_query
, that contains the original query made by WordPress, and thenquery_post
that alter theglobal $wp_query
variable, you end up with unexpected results. Additionally, you are using a deprecated parametershowposts
, replaced byposts_per_page
.Second: you can use a custom search template (search.php) to customize the look and feel. Just cerate a search.php file in your theme folder and customize it as you want. Don't make custom queries here; if you do that, you are making a new query for posts and wasting the query already done by WordPress. A waste of resources with negative performance impact.
Third: to change the default query parameters used by WordPress, like number of posts per page, etc, you can use
pre_get_posts
action.So, create a your search.php template as you wish and use
pre_get_posts
action to say to WordPress what parameters you want to use in the search query:The search.php template could be something like this:
<?php get_header(); global $wp_query; ?> <div class="wapper"> <div class="contentarea clearfix"> <div class="content"> <h1 class="search-title"> <?php echo $wp_query->found_posts; ?> <?php _e( 'Search Results Found For', 'locale' ); ?>: "<?php the_search_query(); ?>" </h1> <?php if ( have_posts() ) { ?> <ul> <?php while ( have_posts() ) { the_post(); ?> <li> <h3><a href="<?php echo get_permalink(); ?>"> <?php the_title(); ?> </a></h3> <?php the_post_thumbnail('medium') ?> <?php echo substr(get_the_excerpt(), 0,200); ?> <div class="h-readmore"> <a href="<?php the_permalink(); ?>">Read More</a></div> </li> <?php } ?> </ul> <?php echo paginate_links(); ?> <?php } ?> </div> </div> </div> <?php get_footer(); ?>
And the
pre_get_posts
action something like this:add_action( 'pre_get_posts', function( $query ) { // Check that it is the query we want to change: front-end search query if( $query->is_main_query() && ! is_admin() && $query->is_search() ) { // Change the query parameters $query->set( 'posts_per_page', 3 ); } } );
-
Pas vraimentnécessaire d'utiliser `global $ wp_query` dans un contexte demodèle,vouspouvez simplement utiliser l'objet` $ wp_query` sinécessaire,maisje suppose qu'il vautmieuxprévenir queguérir :-)Not really necessary to use `global $wp_query` when in template context, you can just use `$wp_query` object where necessary, but I guess better be safe than sorry :-)
- 1
- 2015-05-11
- Pieter Goosen
-
Jen'étaispas sûr de cela,alorsj'aiinclus la référencemondiale.Mercipour lanote.I was not sure about that, so I included the global reference. Thanks for the note.
- 1
- 2015-05-11
- cybmeta
-
@cybmetamerci,çamarchebien.Merciencore.si celane vous dérangepas,vouspouvezme dire comment ajouter lapagination?@cybmeta thanks it work nice. thank you again. if you never mind then you can tell me how to add paging ?
- 0
- 2015-05-11
- pagol001
-
@PieterGoosen alorspensez-vous queje feraismieux de remplacerglobal $ wp_query;à $ wp_query;@PieterGoosen so do you think i better replace global $wp_query; to $wp_query;
- 0
- 2015-05-11
- pagol001
-
Jen'aipasinclus lapagination car vousn'aviezpas depagination dans votre code,je copie simplement votre code sans lapartie de requêtepersonnalisée.Vouspouvez utiliser l'une des [fonctionsfourniespar WordPresspour lapagination deplusieurs articles] (https://codex.wordpress.org/Pagination).I didn't include pagination because you had not pagination in your code, I just copy your code without the custom query part. You could use any of the [functions provided by WordPress for multiple posts pagination](https://codex.wordpress.org/Pagination).
- 0
- 2015-05-11
- cybmeta
-
Non,vouspouvez le laissertel quel :-).No, you can leave it as is :-).
- 0
- 2015-05-12
- Pieter Goosen
-
- 2015-05-11
Vous devez lancer laboucle,modifier votre search.php quelque chose de similaire au code ci-dessous
<?php get_header();?> <div class="wapper"> <div class="contentarea clearfix"> <div class="content"> <ul> <?php if ( have_posts() ) : ?> <header class="page-header"> <p><?php printf( __( 'Search Results for: %s', 'twentyfourteen' ), get_search_query() ); ?></p> </header><!-- .page-header --> <?php // Start the Loop. while ( have_posts() ) : the_post(); ?> <li><h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3></li> <?php the_post_thumbnail('medium') ?> <?php echo substr(get_the_excerpt(), 0, 200); ?> <div class="h-readmore"> <a href="<?php the_permalink(); ?>">Read More</a> </div> <?php endwhile; else : // If no content, include the "No posts found" template. get_template_part( 'content', 'none' ); endif; ?> </ul> </div> </div> </div> <?php get_footer(); ?>
You have to run the loop , modify your search.php something similar to the code below
<?php get_header();?> <div class="wapper"> <div class="contentarea clearfix"> <div class="content"> <ul> <?php if ( have_posts() ) : ?> <header class="page-header"> <p><?php printf( __( 'Search Results for: %s', 'twentyfourteen' ), get_search_query() ); ?></p> </header><!-- .page-header --> <?php // Start the Loop. while ( have_posts() ) : the_post(); ?> <li><h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3></li> <?php the_post_thumbnail('medium') ?> <?php echo substr(get_the_excerpt(), 0, 200); ?> <div class="h-readmore"> <a href="<?php the_permalink(); ?>">Read More</a> </div> <?php endwhile; else : // If no content, include the "No posts found" template. get_template_part( 'content', 'none' ); endif; ?> </ul> </div> </div> </div> <?php get_footer(); ?>
-
Dans le code ci-dessus,remplacez "vingt-quatre"par le domaine detexte de votrethèmeIn the above code change 'twentyfourteen' to your theme text domain
- 0
- 2015-05-11
- shuvroMithun
-
Merci.sime donne uneerreur Erreur d'analyse:erreur de syntaxe,fin inattendue dufichier dans .../search.php à la ligne 34thanks. if giving me error Parse error: syntax error, unexpected end of file in .../search.php on line 34
- 0
- 2015-05-11
- pagol001
ce quej'aifait,
Je crée un search.php
puis créez un searchform.php
maismapage de résultatsn'affichepas la description du contenuet n'affiche également qu'un seul résultat.mais sur letitre H1ilmontre 2/3/5/6/7etcnuméro Résultat de la recherchetrouvé. Je veux afficher aumoins 10 résultats,puispageet également afficher letexte de contenu de 200/300 caractèrespour le résultat de la recherche lesgarspeuventm'aider.je ne suispasencoreexpert wp