Căutarea goală returnează pagina principală, cum să returneze pagina de căutare fără rezultate?

26 sept. 2011, 18:14:14
Vizualizări: 33.6K
Voturi: 16

Funcția implicită de căutare returnează pagina principală dacă formularul de căutare este gol. Vreau să returneze o pagină cu mesajul "ne pare rău, căutarea dvs. nu a returnat niciun rezultat".

această postare nu răspunde la întrebare

iar acest ticket îmi spune că așa ar trebui să funcționeze! A reușit cineva să schimbe acest comportament fără a folosi o redirecționare .htaccess?

Folosesc următorul fișier search.php: `

        <div id="content" class="clearfix">

            <div id="main" class="col700 left clearfix" role="main">

                <h1 class="archive_title"><span>Rezultatele căutării pentru:</span> <?php echo esc_attr(get_search_query()); ?></h1>

                <?php if (have_posts()) : while (have_posts()) : the_post(); ?>

                <article id="post-<?php the_ID(); ?>" <?php post_class('clearfix'); ?>>

                    <header>

                        <h3><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>

                        <p class="meta"><?php _e("Publicat", "bonestheme"); ?> <time datetime="<?php echo the_time('Y-m-j'); ?>" pubdate><?php the_time('F jS, Y'); ?></time> <?php _e("de", "bonestheme"); ?> <?php the_author_posts_link(); ?> <span class="amp">&</span> <?php _e("categorisit în", "bonestheme"); ?> <?php the_category(', '); ?>.</p>

                    </header> <!-- sfârșitul header-ului articolului -->

                    <section class="post_content">
                        <?php the_excerpt('<span class="read-more">Citește mai mult despre "'.the_title('', '', false).'" &raquo;</span>'); ?>

                    </section> <!-- sfârșitul secțiunii articolului -->

                    <footer>


                    </footer> <!-- sfârșitul footer-ului articolului -->

                </article> <!-- sfârșitul articolului -->

                <?php endwhile; ?>  

                <?php if (function_exists('page_navi')) { // dacă funcția experimentală este activă ?>

                    <?php page_navi(); // folosește funcția de navigare în pagină ?>

                <?php } else { // dacă este dezactivată, afișează link-urile wp prev & next standard ?>
                    <nav class="wp-prev-next">
                        <ul class="clearfix">
                            <li class="prev-link"><?php next_posts_link(_e('&laquo; Intrări mai vechi', "bonestheme")) ?></li>
                            <li class="next-link"><?php previous_posts_link(_e('Intrări mai noi &raquo;', "bonestheme")) ?></li>
                        </ul>
                    </nav>
                <?php } ?>          

                <?php else : ?>

                <!-- această zonă apare dacă nu există rezultate -->

                <article id="post-not-found">
                    <header>
                        <h1>Nu au fost găsite rezultate</h1>
                    </header>
                    <section class="post_content">
                        <p>Ne pare rău, dar resursa solicitată nu a fost găsită pe acest site.</p>
                    </section>
                    <footer>
                    </footer>
                </article>

                <?php endif; ?>

            </div> <!-- sfârșitul #main -->

            <div id="sidebar1" class="sidebar right col220">

                <?php get_search_form(); ?>



            </div>

        </div> <!-- sfârșitul #content -->

`

9
Comentarii

arătați niște cod?

kaiser kaiser
26 sept. 2011 18:18:31

nici măcar nu știu de unde să încep să abordez asta (în afară de htaccess), deci nu am cod. Orice ajutor este binevenit

Drai Drai
26 sept. 2011 19:10:20

ce zici de codul tău din searchform.php și search.php?

kaiser kaiser
26 sept. 2011 20:00:28

Folosesc tema bones care are un fișier search.php dar utilizează formularul de căutare standard (core searchform)

Drai Drai
26 sept. 2011 21:44:54

ups, este tema Roots

Drai Drai
30 sept. 2011 04:22:19

link? (text temporar)

kaiser kaiser
30 sept. 2011 12:02:09

@Drai, ai reușit să rezolvi? Am aceeași problemă. Mulțumesc!

dashaluna dashaluna
20 oct. 2011 16:10:34

Aici este linkul către tema Roots pe care o folosesc https://github.com/retlehs/roots

Drai Drai
25 oct. 2011 00:52:41

Aceasta este o problemă generală a WordPress, nu una specifică temei

Tom J Nowell Tom J Nowell
28 oct. 2011 17:07:17
Arată celelalte 4 comentarii
Toate răspunsurile la întrebare 8
3
18

Iată 3 metode de a rezolva această problemă, vă recomand să folosiți soluția 2, dar fiți atenți la jQuery din soluția 1 ca o modalitate de a evita situația de la bun început.

Pentru cei care doresc mai mult cod de la tema utilizatorului care a pus întrebarea, aceasta nu este o problemă specifică temei, ci o problemă generală WordPress care afectează toate site-urile WordPress.

Soluția 1

Puteți găsi un tutorial detaliat despre cum să remediați această problemă aici:

http://wpengineer.com/2162/fix-empty-searches/

Astăzi, să analizăm ceva pe care majoritatea profesionalilor nu-l întâlnesc niciodată: căutările goale. Oferiți un câmp de căutare, iar cineva apasă butonul de trimitere din greșeală, fără să introducă niciun termen. URI-ul rezultat arată astfel: exemplu.ro/?s=. Acesta afișează același conținut ca pagina principală. De fapt, este chiar pagina principală.

Nimeni nu are nevoie de asta.

Soluția 2 (recomandată)

Preluat dintr-un post de Spitzerg http://wordpress.org/support/topic/blank-search-sends-you-to-the-homepage

O altă opțiune este să adăugați un filtru de request:

add_filter( 'request', 'my_request_filter' );
function my_request_filter( $query_vars ) {
    if( isset( $_GET['s'] ) && empty( $_GET['s'] ) ) {
        $query_vars['s'] = " ";
    }
    return $query_vars;
}

Apoi, dacă refolosiți interogarea de căutare în formularul de căutare, nu uitați să o tăiați (trim) ca să nu rămâneți cu unul sau mai multe spații (doar pentru a menține lucrurile curate, probabil nu va afecta rezultatele).

<input type="text" name="s" id="s" value="<?php echo trim( get_search_query() ); ?>"/>

Sper că acest lucru vă ajută, pare să funcționeze până acum pe site-ul meu și nu implică modificarea codului WP, făcând actualizările mai ușoare.

Soluția 3

http://www.warpconduit.net/2011/08/02/fix-redirection-and-error-page-on-empty-wordpress-search/

Similar cu soluția 2, dar nu la fel de extins și ușor diferit.

    if(!is_admin()){
        add_action('init', 'search_query_fix');
    }
    function search_query_fix(){
        if(isset($_GET['s']) && $_GET['s']==''){
            $_GET['s']=' ';
        }
    }
28 oct. 2011 17:05:30
Comentarii

Problema cu soluția 2 este că va returna fiecare articol (sau cel puțin fiecare articol care conține un spațiu) atunci când ar trebui să nu returneze niciun articol deloc.

Felix Eve Felix Eve
2 sept. 2014 08:10:48

De asemenea, nu rezolvă domain.com/page/2

fdrv fdrv
20 mai 2020 08:49:02

spațiul este doar ceea ce am folosit ca substituent, poate ai putea considera să folosești ceva ce știi că nu va apărea niciodată în conținutul tău, dar nu m-am putut gândi la ceva potrivit atunci. De asemenea, există mai multe soluții

Tom J Nowell Tom J Nowell
20 mai 2020 21:44:31
1

Bazându-ne pe soluția lui Tom nr. 2, dar asigurându-ne că nu sunt returnate postări, adăugăm un filtru de cerere ca înainte:

add_filter( 'request', 'my_request_filter' );
function my_request_filter( $query_vars ) {
    if( isset( $_GET['s'] ) && empty( $_GET['s'] ) ) {
        $query_vars['s'] = " ";
        global $no_search_results;
        $no_search_results = TRUE;
    }
    return $query_vars;
}

Dar de data aceasta setăm o variabilă globală care indică faptul că nu ar trebui returnate rezultate de căutare. Apoi, folosind un hook posts_where, ne asigurăm că nu sunt returnate postări:

add_filter( 'posts_where' , 'posts_where_statement' ); 
function posts_where_statement( $where ) {
    global $no_search_results;
    if($no_search_results) {
        $where .= ' AND 1=0';
    }
    return $where;
}
2 sept. 2014 08:28:24
Comentarii

Mulțumesc mult pentru fragmentul de cod. Era enervant faptul că returna toate articolele atunci când nu căutam nimic.

Michael Rogers Michael Rogers
28 dec. 2021 17:44:46
0

Creează un fișier search.php și lipește acest cod, apoi înlocuiește bucla ta cu "get_template_part('loop', 'search');

                    <div id="container">
                        <div id="content" role="main">

            <?php if ( have_posts() ) : ?>
                            <h1 class="page-title"><?php printf( __( 'Rezultatele căutării pentru: %s', 'mb' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
                            <?php
                            /* Rulează bucla pentru căutare pentru a afișa rezultatele.
                             * Dacă dorești să suprascrii asta într-un child theme, include un fișier
                             * numit loop-search.php și acesta va fi folosit în schimb.
                             */
                             get_template_part( 'loop', 'search' );
                            ?>
            <?php else : ?>
                            <div id="post-0" class="post no-results not-found">
                                <h2 class="entry-title"><?php _e( 'Nu s-a găsit nimic', 'mb' ); ?></h2>
                                <div class="entry-content">
                                    <p><?php _e( 'Ne pare rău, dar nimic nu corespunde criteriilor tale de căutare. Te rugăm să încerci din nou cu alte cuvinte cheie.', 'twentyten' ); ?></p>
                                    <?php get_search_form(); ?>
                                </div><!-- .entry-content -->
                            </div><!-- #post-0 -->
            <?php endif; ?>
                        </div><!-- #content -->
                    </div><!-- #container -->

            <?php get_sidebar(); ?>
            <?php get_footer(); ?>
27 sept. 2011 08:54:19
1

Verifică dacă interogarea de căutare este goală (get_search_query()), înlocuiește primul IF cu acesta:

<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>
6 aug. 2015 16:04:49
Comentarii

Cred că aceasta este o soluție destul de corectă. Simplă și elegantă. Fără filtre speciale și acțiuni care ar putea complica codul

Kamil Kamil
24 sept. 2019 17:23:57
0

Eu gestionez acest lucru în temele mele în felul următor. Încearcă să folosești acest cod:

<?php if (!have_posts()): ?>
    <article id="post-0">
        <header>
            <h3>Nu s-au găsit articole.</h3>
        </header> <!-- sfârșit antet articol -->

        <section class="post_content">
           Ne pare rău, nu am găsit nicio postare pentru căutarea ta. Te rugăm să încerci din nou.
        </section> <!-- sfârșit secțiune articol -->

        <footer>
        </footer> <!-- sfârșit subsol articol -->

    </article> <!-- sfârșit articol -->
<?php endif; ?>

Gestionăm condiția if(!have_posts()). Pune-o imediat după h3.archive title, înainte de începutul lui if(have_posts). Poți chiar să apelezi funcția formularului de căutare în zona de conținut.

27 sept. 2011 06:45:06
0

Am întâmpinat și eu aceeași problemă, este ceva prestabilit de WordPress.

Dar din fericire, am găsit ceva care m-a ajutat.

Adaugă următorul cod în "functions.php":

function SearchFilter($query) {
    // Dacă variabila 's' este setată dar goală
    if (isset($_GET['s']) && empty($_GET['s']) && $query->is_main_query()){
        $query->is_search = true;
        $query->is_home = false;
    }
    return $query;}
add_filter('pre_get_posts','SearchFilter');

Și apoi înlocuiește următoarea linie (linia 15) în search.php:

<?php if ( have_posts() && strlen( trim(get_search_query()) ) != 0 ) : ?>

Poate te va ajuta și pe tine.

Pentru detalii, citește aici: Personalizează căutarea goală în WordPress

3 aug. 2013 08:55:06
0

O modalitate de a evita căutările goale este să efectuați o verificare în javascript pentru valoarea goală a câmpului de căutare și, dacă se constată că câmpul este gol, atunci opriți trimiterea formularului de căutare, așa cum se arată mai jos:

$('#searchform').submit(function(){

            search_value =$.trim($('#searchform #s').val());

            if(search_value == ""){

                return false; // Puteți afișa și o notificare aici pentru a informa utilizatorul.
            }

});
8 mai 2015 11:23:58
1
# Redirecționează căutările goale
RewriteCond %{QUERY_STRING} ^s=$
RewriteRule ^ /? [L,R=301]
28 feb. 2017 22:07:54
Comentarii

Nu este clar cum acest lucru răspunde la întrebare. Poți să editezi răspunsul tău (folosind butonul de editare de mai sus) și să adaugi câteva detalii despre ce face acest cod, unde să-l pui și cum rezolvă problema, te rog?

Howdy_McGee Howdy_McGee
28 feb. 2017 22:29:19