Pagina dei risultati di ricerca personalizzata

11 mag 2015, 12:25:13
Visualizzazioni: 77.6K
Voti: 3

quello che ho fatto,

ho creato un search.php

<?php get_header(); ?>
<div class="wapper">
  <div class="contentarea clearfix">
    <div class="content">
      <h1 class="search-title"> <?php echo $wp_query->found_posts; ?>
        <?php _e( 'Risultati di ricerca trovati per', 'locale' ); ?>: "<?php the_search_query(); ?>" </h1>
      <ul>
        <?php query_posts('showposts=3'); if (have_posts()) : ?>
        <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(); ?>">Leggi di più</a></div>
        </li>
        <?php endif ?>
      </ul>
    </div>
  </div>
</div>
<?php get_footer(); ?>

poi ho creato un searchform.php

<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
  <input type="search" id="searchbox" name="s" placeholder="Inserisci parole chiave" required>
    <input type="image" id="searchsubmit" alt="Cerca" class="searchicon" src="<?php bloginfo( 'template_url' ); ?>/images/icon-search.gif" />
</form>

ma la mia pagina dei risultati non mostra la descrizione del contenuto e mostra solo un risultato. Tuttavia nel titolo H1 mostra 2/3/5/6/7 ecc numero di risultati trovati. Vorrei mostrare almeno 10 risultati per pagina e poi la paginazione, e anche mostrare 200/300 caratteri di testo del contenuto per ogni risultato di ricerca. Ragazzi potete aiutarmi, non sono ancora un esperto di WordPress.

0
Tutte le risposte alla domanda 2
6
10

Ho alcune raccomandazioni per la tua domanda:

Primo: smetti di usare query_posts(). Vedi la codex su questa funzione per capire perché non dovresti usarla nei temi o plugin. Comunque, se ti trovi in una situazione particolare dove non hai alternative e devi usare query_posts(), dovresti eseguire wp_reset_query() dopo il loop. Devi sapere che stai usando global $wp_query, che contiene la query originale fatta da WordPress, e poi query_post altera la variabile global $wp_query, ottenendo risultati inaspettati. Inoltre, stai usando un parametro deprecato showposts, sostituito da posts_per_page.

Secondo: puoi usare un template di ricerca personalizzato (search.php) per personalizzare l'aspetto. Basta creare un file search.php nella cartella del tuo tema e personalizzarlo come preferisci. Non fare query personalizzate qui; se lo fai, stai creando una nuova query per i post e sprechi la query già fatta da WordPress. Uno spreco di risorse con impatto negativo sulle prestazioni.

Terzo: per modificare i parametri di query predefiniti usati da WordPress, come il numero di post per pagina, ecc., puoi usare l'azione pre_get_posts.

Quindi, crea il tuo template search.php come preferisci e usa l'azione pre_get_posts per dire a WordPress quali parametri vuoi usare nella query di ricerca:

Il template search.php potrebbe essere qualcosa come questo:

<?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( 'Risultati della ricerca trovati per', '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(); ?>">Leggi di più</a></div>
               </li>

            <?php } ?>

            </ul>

           <?php echo paginate_links(); ?>

        <?php } ?>

    </div>
  </div>
</div>
<?php get_footer(); ?>

E l'azione pre_get_posts potrebbe essere qualcosa come questo:

add_action( 'pre_get_posts', function( $query ) {

    // Verifica che sia la query che vogliamo modificare: query di ricerca front-end
    if( $query->is_main_query() && ! is_admin() && $query->is_search() ) {

        // Modifica i parametri della query
        $query->set( 'posts_per_page', 3 );

    }

} );
11 mag 2015 14:17:12
Commenti

Non è davvero necessario usare global $wp_query quando sei nel contesto del template, puoi semplicemente usare l'oggetto $wp_query dove necessario, ma immagino che sia meglio prevenire che curare :-)

Pieter Goosen Pieter Goosen
11 mag 2015 14:59:48

Non ero sicuro di questo, quindi ho incluso il riferimento globale. Grazie per la nota.

cybmeta cybmeta
11 mag 2015 15:33:41

@cybmeta grazie, funziona benissimo. Grazie ancora. Se non ti dispiace, potresti dirmi come aggiungere l'impaginazione?

pagol001 pagol001
11 mag 2015 23:41:48

@PieterGoosen quindi pensi che sia meglio sostituire global $wp_query; con $wp_query;

pagol001 pagol001
11 mag 2015 23:44:05

Non ho incluso la paginazione perché non c'era nel tuo codice, ho semplicemente copiato il tuo codice senza la parte della query personalizzata. Puoi usare una qualsiasi delle funzioni fornite da WordPress per la paginazione di articoli multipli.

cybmeta cybmeta
12 mag 2015 00:36:53

No, puoi lasciarlo così com'è :-).

Pieter Goosen Pieter Goosen
12 mag 2015 06:47:46
Mostra i restanti 1 commenti
2

Devi eseguire il loop, modifica il tuo search.php in modo simile al codice qui sotto

  <?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( __( 'Risultati della ricerca per: %s', 'twentyfourteen' ), get_search_query() ); ?></p>
            </header><!-- .page-header -->

                        <?php
                        // Inizia il 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(); ?>">Leggi tutto</a>
                            </div>
                        <?php
                        endwhile;
                else :
                // Se non ci sono contenuti, includi il template "Nessun post trovato"
                get_template_part( 'content', 'none' );
                endif;
                ?>       
            </ul>                                 

        </div>
      </div>
    </div>
<?php get_footer(); ?>
11 mag 2015 12:40:27
Commenti

Nel codice sopra, cambia 'twentyfourteen' con il tuo dominio di testo del tema

shuvroMithun shuvroMithun
11 mag 2015 12:53:53

grazie. se mi dà l'errore Parse error: syntax error, unexpected end of file in .../search.php alla riga 34

pagol001 pagol001
11 mag 2015 23:45:34