Pagină personalizată de rezultate căutare

11 mai 2015, 12:25:13
Vizualizări: 77.6K
Voturi: 3

Ce am făcut eu,

Am creat un fișier 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( 'Rezultate găsite pentru', '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(); ?>">Citește mai mult</a></div>
        </li>
        <?php endif ?>
      </ul>
    </div>
  </div>
</div>
<?php get_footer(); ?>

apoi am creat searchform.php

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

dar pagina mea de rezultate nu afișează descrierea conținutului și arată doar un rezultat. Dar în titlul H1 arată 2/3/5/6/7 etc număr de rezultate găsite. Vreau să afișez cel puțin 10 rezultate și apoi paginare și, de asemenea, să afișez 200/300 caractere text de conținut pentru rezultatul căutării. Băieți puteți să mă ajutați, nu sunt încă expert în WordPress

0
Toate răspunsurile la întrebare 2
6
10

Am câteva recomandări pentru întrebarea ta:

În primul rând: încetează să folosești query_posts(). Vezi codicele despre această funcție pentru a înțelege de ce nu ar trebui să o folosești în teme sau pluginuri. Oricum, dacă te afli într-o situație neobișnuită în care nu ai altă opțiune și trebuie să folosești query_posts(), ar trebui să rulezi wp_reset_query() după bucla. Trebuie să știi că folosești global $wp_query, care conține interogarea originală făcută de WordPress, iar apoi query_post alterează variabila global $wp_query, ceea ce poate duce la rezultate neașteptate. În plus, folosești un parametru învechit showposts, înlocuit de posts_per_page.

În al doilea rând: poți folosi un șablon personalizat de căutare (search.php) pentru a personaliza aspectul. Pur și simplu creează un fișier search.php în directorul temei tale și personalizează-l după preferințe. Nu face interogări personalizate aici; dacă faci asta, creezi o nouă interogare pentru articole și pierzi interogarea deja făcută de WordPress. O risipă de resurse cu impact negativ asupra performanței.

În al treilea rând: pentru a schimba parametrii impliciți ai interogării folosiți de WordPress, cum ar fi numărul de articole pe pagină, etc., poți folosi acțiunea pre_get_posts.

Deci, creează șablonul tău search.php așa cum dorești și folosește acțiunea pre_get_posts pentru a spune WordPress ce parametri dorești să folosești în interogarea de căutare:

Șablonul search.php ar putea arăta astfel:

<?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( 'Rezultatele Căutării Găsite Pentru', '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(); ?>">Citește Mai Mult</a></div>
               </li>

            <?php } ?>

            </ul>

           <?php echo paginate_links(); ?>

        <?php } ?>

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

Iar acțiunea pre_get_posts ar putea arăta astfel:

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

    // Verifică dacă este interogarea pe care dorim să o modificăm: interogarea de căutare în front-end
    if( $query->is_main_query() && ! is_admin() && $query->is_search() ) {

        // Schimbă parametrii interogării
        $query->set( 'posts_per_page', 3 );

    }

} );
11 mai 2015 14:17:12
Comentarii

Nu este chiar necesar să folosești global $wp_query în contextul template-ului, poți folosi direct obiectul $wp_query unde este necesar, dar presupun că mai bine prevenit decât necăjit :-)

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

Nu eram sigur de asta, așa că am inclus referința globală. Mulțumesc pentru observație.

cybmeta cybmeta
11 mai 2015 15:33:41

@cybmeta mulțumesc, funcționează perfect. dacă nu te superi, poți să-mi spui și cum să adaug paginare?

pagol001 pagol001
11 mai 2015 23:41:48

@PieterGoosen deci crezi că e mai bine să înlocuiesc global $wp_query; cu $wp_query;

pagol001 pagol001
11 mai 2015 23:44:05

Nu am inclus paginarea pentru că nu aveai paginare în codul tău, doar am copiat codul tău fără partea de interogare personalizată. Poți folosi oricare dintre funcțiile oferite de WordPress pentru paginarea postărilor multiple.

cybmeta cybmeta
12 mai 2015 00:36:53

Nu, poți să-l lași așa cum e :-).

Pieter Goosen Pieter Goosen
12 mai 2015 06:47:46
Arată celelalte 1 comentarii
2

Trebuie să rulezi bucla, modifică fișierul tău search.php similar cu codul de mai jos

  <?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( __( 'Rezultatele căutării pentru: %s', 'twentyfourteen' ), get_search_query() ); ?></p>
            </header><!-- .page-header -->

                        <?php
                        // Începe bucla.
                        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(); ?>">Citește mai mult</a>
                            </div>
                        <?php
                        endwhile;
                else :
                // Dacă nu există conținut, include șablonul "Nu au fost găsite articole".
                get_template_part( 'content', 'none' );
                endif;
                ?>       
            </ul>                                 

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

În codul de mai sus, schimbați 'twentyfourteen' cu domeniul de text al temei dumneavoastră

shuvroMithun shuvroMithun
11 mai 2015 12:53:53

mulțumesc. dacă îmi dă eroarea Parse error: syntax error, unexpected end of file in .../search.php la linia 34

pagol001 pagol001
11 mai 2015 23:45:34