WordPress má, minimálně od verze 3.0, starší jsem na svém localhostu nainstalovanou nenašel, zajímavou vlastnost. A sice, že pokud stisknete tlačítko “Hledat”, a to ať myší či přes klávesnici, bez toho, aniž byste zadali hledaný výraz, načte se stránka čerpající ze šablony pro index.php, namísto toho, aby došlo k užití šablony search.php.
Co to má za následek? To, že se uživateli namísto zprávy o tom, že hledání bylo neúspěšné, což mi, a nejen mě, přijde jako logické chování, zobrazí výpis příspěvků na blogu stejně, jako by šlo o stránku s výpisem příspěvků – nedojde ani k přesměrování na úvodní stránku.
Ovšem každý problém má své řešení. Když jsem na toto narazil, chvíli jsem o této problematice něco hleda a narazil jsem na polovičaté řešení uživatele spitzerg. Ten přišel s jednoduchým filtrem, který stačí vložit do souboru functions.php:
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; }
Ovšem toto není dostačující. Tím, že se vyhledávací řetězec změní z prázdného na mezeru, dojde sice k přesměrování na šablonu search.php, ovšem mezi výsledky se objeví všechyn stránky, jelikož nějakou tu mezeru snad každý příspěvek obsahuje.
Je nutné tedy modifikovat také kód souboru šablony search.php. V šabloně Twenty Eleven vypadá obsah tohoto souboru takto:
<?php /** * The template for displaying Search Results pages. * * @package WordPress * @subpackage Twenty_Eleven * @since Twenty Eleven 1.0 */ get_header(); ?> <section id="primary"> <div id="content" role="main"> <?php if ( have_posts() ) : ?> <header class="page-header"> <h1 class="page-title"><?php printf( __( 'Search Results for: %s', 'twentyeleven' ), '<span>' . get_search_query() . '</span>' ); ?></h1> </header> <?php twentyeleven_content_nav( 'nav-above' ); ?> <?php /* Start the Loop */ ?> <?php while ( have_posts() ) : the_post(); ?> <?php /* Include the Post-Format-specific template for the content. * If you want to overload this in a child theme then include a file * called content-___.php (where ___ is the Post Format name) and that will be used instead. */ get_template_part( 'content', get_post_format() ); ?> <?php endwhile; ?> <?php twentyeleven_content_nav( 'nav-below' ); ?> <?php else : ?> <article id="post-0" class="post no-results not-found"> <header class="entry-header"> <h1 class="entry-title"><?php _e( 'Nothing Found', 'twentyeleven' ); ?></h1> </header><!-- .entry-header --> <div class="entry-content"> <p><?php _e( 'Sorry, but nothing matched your search criteria. Please try again with some different keywords.', 'twentyeleven' ); ?></p> <?php get_search_form(); ?> </div><!-- .entry-content --> </article><!-- #post-0 --> <?php endif; ?> </div><!-- #content --> </section><!-- #primary --> <?php get_sidebar(); ?> <?php get_footer(); ?>
Náš problém vyřeší úprava první podmínky tak, aby nevyhodnocovala pouze to, zda-li náš řetězec odpovídá nějakému výsledku, ale také to, zda-li náš řetězec neobsahuje pouhou mezeru:
<?php /** * The template for displaying Search Results pages. * * @package WordPress * @subpackage Twenty_Eleven * @since Twenty Eleven 1.0 */ get_header(); ?> <section id="primary"> <div id="content" role="main"> <?php if ( have_posts() && get_search_query != " " ) : ?> ...
A tím je problém WordPress s prázdným vyhledáváním zobrazujícím výpis příspěvků vyřešen kompletně.