WordPress a prázdné hledání

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ě.

This entry was posted in Blog. Bookmark the permalink.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">