Could someone please explain why when I submit an empty search form I get sent to a page with no navigation menu? The navigation menu is there when a search term that has no matches is submitted and the error message is the exact same: "Sorry, but nothing matched your search criteria. Please try again with some different keywords."

looking at the seach.php file there's only one else clause that handles the no result found code so why isn't functioning the same? I haven't modified the search from the original theme

<?php
get_header(); ?>

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

<?php if ( have_posts() ) : ?>
                <h1 class="page-title"><?php printf( __( 'Search Results for: %s', 'twentyten' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
                <?php
                /* Run the loop for the search to output the results.
                 * If you want to overload this in a child theme then include a file
                 * called loop-search.php and that will be used instead.
                 */
                 get_template_part( 'loop', 'search' );
                ?>
<?php else : ?>
                <div id="post-0" class="post no-results not-found">
                    <h2 class="entry-title"><?php _e( 'Nothing Found', 'twentyten' ); ?></h2>
                    <div class="entry-content">
                        <p><?php printf( 'Sorry, but nothing matched your search criteria. Please try again with some different keywords.', 'twentyten' ); ?></p>
                        <!---<?php get_search_form(); ?>-->
                    </div><!-- .entry-content -->
                </div><!-- #post-0 -->
<?php endif; ?>
            </div><!-- #content -->
        </div><!-- #container -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

Dani AI

Generated

Short version: an empty submit is often handled differently from a real search term, so the search template can be reached in a different context (or not at all) and the header/menu that you expect can be missing. As suggested, something “breaks” on the empty submit — but the fix is to debug where WordPress is routing the request (theme vs core vs plugin) and then either prevent empty submits or explicitly handle them. Note: the built-in search form posts to the site root by default, and empty-query handling has varied in core (older setups could land you on the front page). (developer.wordpress.org)

Checklist to reproduce & narrow it down

  • Submit an empty search and note the full URL (eg. /?s=). Compare it to a non-empty search URL.
  • View source on both pages and search for the menu HTML (TwentyTen uses the #access / wp_nav_menu markup). If the markup is missing the header wasn’t output; if it’s present but invisible, CSS/JS is hiding it.
  • Inspect body classes and console errors (different body_class values or JS errors can explain the difference).
  • Disable plugins and test, and/or temporarily switch to an unmodified TwentyTen. Also grep functions.php (and any plugins) for hooks that run on searches (template_redirect, pre_get_posts, is_search checks).

Quick fixes you can apply

  • Prevent empty submissions (fastest): make the search input required in searchform.php so browsers won’t submit nothing:

    <form role="search" method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>">
      <label for="s" class="screen-reader-text">Search for:</label>
      <input type="search" name="s" id="s" value="<?php echo get_search_query(); ?>" required />
      <input type="submit" value="Search" />
    </form>
  • Force an empty submit to return “no results” (so the same search.php else branch runs safely). Add to your child theme’s functions.php:

    add_action( 'pre_get_posts', 'dw_empty_search_noresults' );
    function dw_empty_search_noresults( $query ) {
      if ( is_admin() || ! $query->is_main_query() ) return;
      if ( isset( $_GET['s'] ) && trim( $_GET['s'] ) === '' ) {
        // force no posts so have_posts() is false
        $query->set( 'post__in', array( 0 ) );
      }
    }

    Use the pre_get_posts hook when altering the main query. Forcing post__in to a non-existent ID is a common pattern to return zero posts (there are a few variations; see sources). (developer.wordpress.org)

If you need more targeted help: after trying the above, post the exact empty-search URL and the header.php snippet that outputs your menu — that will show whether the header is simply not being included or is present but hidden. As suggested, check for an unclosed tag or a plugin that conditionally alters search routing. If you want the site to treat empty queries as “no input” (rather than run a full-site query), the pre_get_posts approach above plus the Relevanssi-style safeguards are recommended. (relevanssi.com)

Recommended Answers

All 3 Replies

Sounds like something breaks when you submit an empty form. It could be as simple as an unclosed tag in that situation. I'd search for issue in that specific case.

I appreciate your response however I have checked and haven't noted anything missing. Also it looks to me that an empty search form and a search form with no matches is processed by the same else clause. Have you had experience with Wordpress? specifically Twentyten theme?

Also it looks to me that an empty search form and a search form with no matches is processed by the same else clause.

Make sure.

Have you had experience with Wordpress? specifically Twentyten theme?

No. Just seen a lot of bad coding...

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.