La ricerca vuota reindirizza alla home page, come reindirizzare alla pagina "nessun risultato"?
La funzione di ricerca predefinita, se il modulo di ricerca è vuoto, reindirizza alla home page. Vorrei invece che mostrasse una pagina con il messaggio "spiacenti, la tua ricerca non ha prodotto risultati".
questo post non risponde alla domanda
e questo ticket mi dice che è progettato per funzionare così! Qualcuno ha trovato un modo per cambiarlo senza usare un reindirizzamento .htaccess?
Sto usando il seguente file search.php:
<div id="content" class="clearfix">
<div id="main" class="col700 left clearfix" role="main">
<h1 class="archive_title"><span>Risultati della ricerca per:</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("Pubblicato", "bonestheme"); ?> <time datetime="<?php echo the_time('Y-m-j'); ?>" pubdate><?php the_time('F jS, Y'); ?></time> <?php _e("da", "bonestheme"); ?> <?php the_author_posts_link(); ?> <span class="amp">&</span> <?php _e("archiviato in", "bonestheme"); ?> <?php the_category(', '); ?>.</p>
</header> <!-- fine header articolo -->
<section class="post_content">
<?php the_excerpt('<span class="read-more">Leggi altro su "'.the_title('', '', false).'" »</span>'); ?>
</section> <!-- fine sezione articolo -->
<footer>
</footer> <!-- fine footer articolo -->
</article> <!-- fine articolo -->
<?php endwhile; ?>
<?php if (function_exists('page_navi')) { // se la funzionalità sperimentale è attiva ?>
<?php page_navi(); // usa la funzione page navi ?>
<?php } else { // se è disabilitata, mostra i link wp prev & next standard ?>
<nav class="wp-prev-next">
<ul class="clearfix">
<li class="prev-link"><?php next_posts_link(_e('« Articoli più vecchi', "bonestheme")) ?></li>
<li class="next-link"><?php previous_posts_link(_e('Articoli più recenti »', "bonestheme")) ?></li>
</ul>
</nav>
<?php } ?>
<?php else : ?>
<!-- questa area appare se non ci sono risultati -->
<article id="post-not-found">
<header>
<h1>Nessun Risultato Trovato</h1>
</header>
<section class="post_content">
<p>Spiacenti, ma la risorsa richiesta non è stata trovata su questo sito.</p>
</section>
<footer>
</footer>
</article>
<?php endif; ?>
</div> <!-- fine #main -->
<div id="sidebar1" class="sidebar right col220">
<?php get_search_form(); ?>
</div>
</div> <!-- fine #content -->

Ecco 3 modi per risolvere questo problema, ti consiglio di utilizzare la soluzione 2, ma presta attenzione al jQuery nella soluzione 1 come modo per evitare la situazione fin dall'inizio.
Per coloro che vogliono più codice pubblicato dal tema di chi ha posto la domanda, questo non è un problema del tema, è un problema generale di WordPress che riguarda tutti i siti WordPress.
Soluzione 1
Puoi trovare un tutorial approfondito su come risolvere questo problema qui:
http://wpengineer.com/2162/fix-empty-searches/
Oggi, diamo un'occhiata a qualcosa che la maggior parte dei professionisti non vede mai: ricerche vuote. Offri un campo di input per la ricerca e qualcuno preme il pulsante di invio accidentalmente, senza inserire alcun termine. L'URI risultante appare così: example.com/?s=. Mostra lo stesso contenuto della tua home page. In effetti, è la home page.
Nessuno ha bisogno di questo.
Soluzione 2 (consigliata)
Preso da un post di Spitzerg http://wordpress.org/support/topic/blank-search-sends-you-to-the-homepage
Un'altra opzione è aggiungere un filtro alle richieste:
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; }
Poi, se riutilizzi la query di ricerca nel tuo modulo di ricerca, non dimenticare di trimarla così non finirai con uno o più spazi (solo per mantenere le cose pulite, probabilmente non influenzerà i risultati.
<input type="text" name="s" id="s" value="<?php echo trim( get_search_query() ); ?>"/>
Spero che questo aiuti, sembra funzionare finora sul mio sito e non implica modificare alcun codice di WP rendendo gli aggiornamenti più facili.
Soluzione 3
http://www.warpconduit.net/2011/08/02/fix-redirection-and-error-page-on-empty-wordpress-search/
Simile alla soluzione 2 ma non altrettanto estesa e leggermente diversa.
if(!is_admin()){
add_action('init', 'search_query_fix');
}
function search_query_fix(){
if(isset($_GET['s']) && $_GET['s']==''){
$_GET['s']=' ';
}
}

Il problema con la soluzione 2 è che restituirà ogni post (o almeno ogni post con uno spazio) quando in realtà non dovrebbe restituire alcun post.

Inoltre non risolve domain.com/page/2

Basandosi sulla soluzione 2 di Tom ma assicurandosi che nessun post venga restituito, aggiungi un filtro di richiesta come prima:
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;
}
Ma questa volta imposta una variabile globale per indicare che nessun risultato di ricerca dovrebbe essere restituito. Quindi utilizzando un hook posts_where assicurati che nessun post venga restituito:
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;
}

Crea un file Search.php e incolla questo codice, quindi sostituisci il tuo loop con "get_template_part('loop', 'search');
<div id="container">
<div id="content" role="main">
<?php if ( have_posts() ) : ?>
<h1 class="page-title"><?php printf( __( 'Risultati della ricerca per: %s', 'mb' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
<?php
/* Esegui il loop per la ricerca per mostrare i risultati.
* Se vuoi sovrascriverlo in un child theme, includi un file
* chiamato loop-search.php e verrà utilizzato quello invece.
*/
get_template_part( 'loop', 'search' );
?>
<?php else : ?>
<div id="post-0" class="post no-results not-found">
<h2 class="entry-title"><?php _e( 'Nessun risultato trovato', 'mb' ); ?></h2>
<div class="entry-content">
<p><?php _e( 'Spiacenti, ma nessun risultato corrisponde ai tuoi criteri di ricerca. Per favore prova ancora con parole chiave diverse.', 'twentyten' ); ?></p>
<?php get_search_form(); ?>
</div><!-- .entry-content -->
</div><!-- #post-0 -->
<?php endif; ?>
</div><!-- #content -->
</div><!-- #container -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Verifica se la query di ricerca è vuota ( get_search_query() ), sostituisci semplicemente il primo IF con questo:
<?php if (have_posts() && get_search_query()) : while (have_posts()) : the_post(); ?>

Gestisco questa situazione nei miei temi nel seguente modo. Prova a utilizzare questo codice:
<?php if (!have_posts()): ?>
<article id="post-0">
<header>
<h3>Nessun articolo trovato.</h3>
</header> <!-- fine intestazione articolo -->
<section class="post_content">
Spiacenti, non abbiamo trovato articoli corrispondenti alla tua ricerca. Per favore prova a cercare ancora.
</section> <!-- fine sezione articolo -->
<footer>
</footer> <!-- fine piè di pagina articolo -->
</article> <!-- fine articolo -->
<?php endif; ?>
Stiamo gestendo la condizione if(!have_posts()). Inseriscila subito dopo il tuo h3.archive title, prima che inizi if(have_posts). Puoi anche chiamare la funzione del modulo di ricerca nell'area del contenuto.

Ho riscontrato lo stesso problema, è un comportamento predefinito di WordPress.
Ma fortunatamente ho trovato qualcosa che mi ha aiutato.
Aggiungi questo codice nel file "Functions.php"
function SearchFilter($query) {
// Se la variabile di richiesta 's' è impostata ma vuota
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');
E poi sostituisci questa riga (riga numero 15) nel file search.php
<?php if ( have_posts() && strlen( trim(get_search_query()) ) != 0 ) : ?>
Spero possa aiutare anche te
Per maggiori dettagli leggi questo: Personalizzare la ricerca vuota in WordPress

Un modo per evitare ricerche vuote è eseguire un controllo JavaScript per verificare se il campo di ricerca è vuoto e, nel caso, impedire l'invio del modulo di ricerca come mostrato di seguito:
$('#searchform').submit(function(){
search_value =$.trim($('#searchform #s').val());
if(search_value == ""){
return false; // Puoi anche mostrare una notifica per informare l'utente.
}
});

Non è chiaro come questo risponda alla domanda. Potresti modificare la tua risposta (usando il pulsante modifica in alto) e aggiungere alcuni dettagli su cosa fa questo codice, dove inserirlo e come risolve il problema, per favore?
