Support » Fixing WordPress » Using is_home() after the loop

  • Hi, after much searching of various sites and reading of the codex, I’m stumped. I’m making a new theme and I need to check if I’m on the homepage in the file footer.php

    I can use is_home() in header.php and in index.php, but using it in footer.php returns false, even when the same use in the other files returns true. The only thing which I can spot is that is_home() doesn’t work after the loop. Can someone point out something that I’ve obviously missed or is this a bug introduced in 2.6?

    Cheers,
    Jim

Viewing 12 replies - 1 through 12 (of 12 total)
  • Nope, your wrong on both accounts.

    done properly is_home works fine in the footer.

    http://www.pajamadeen.com/cherie/

    see the footer.

    U.S. Soldiers Torment Dog in Green Zone

    see the footer 🙂

    🙂 That throws my theory out the window then. Do you have any suggestion on what might be causing my use of is_home in the footer.php to break then?

    did you review the page in the codex?

    http://codex.wordpress.org/Conditional_Tags

    taking note of the “note”?

    Could have a problem if you are using the “Front page displays – A static page” Setting->Reading option.

    Oops, same point as whooami is making…

    Nope, not using a static page for the homepage.

    Might post your code, both the index.php and the footer.php, in a pastebin and report the link back here.

    Ignore the formatting and what not, the theme is a work in progress. This is just the contents of the index.php file. You’ll notice there’s an if-else before the main body of content and an if-else afterward just containing echo’s. The first one outputs HOMEPAGE and the second one doesn’t. Any thoughts, greatly appreciated.

    <?php
    get_header();
    if (is_front_page() || is_home()) echo 'HOMEPAGE';
    else echo 'HMM NOT HOMEPAGE';
    // IF [homepage]
    if (is_front_page() || is_home()) {
    	$controlPanel = get_option('controlPanel'); ?>
    	<script type="text/javascript">
    		//swfobject.embedSWF('<?php bloginfo('template_directory'); ?>/assets/flash/introduction.swf', 'flash', '495', '240', '9.0.0', {}, {title: '<?php echo $controlPanel['homepageFlashText']; ?>'}, {});
    	</script>
    	<img id="flash" class="screen" src="<?php bloginfo('template_directory'); ?>/assets/images/noFlash.png" alt="<?php echo stripslashes($controlPanel['homepageFlashText']); ?>" width="495px" height="240px" />
    	<p id="introduction"><?php echo stripslashes($controlPanel['homepageIntroduction']); ?></p>
    	<h3>Latest News</h3>
    	<?php query_posts('showposts=1&category_name=news');
    	global $more;
    	$more = 0;
    	if (have_posts()) :
    		while (have_posts()) : the_post(); ?>
    			<div class="post split">
    				<div class="image">
    					<div class="container">
    						<img src="<?php echo get_bloginfo('url').'/'.get_option('upload_path').'/'.get_post_meta($post->ID, 'thumbnail', true); ?>" alt="<?php the_title(); ?>" />
    					</div>
    				</div>
    				<div class="text">
    					<h3><?php the_title(); ?></h3>
    					<?php the_content('Read More'); ?>
    					<p class="date"><?php the_time('F j, Y'); ?> at <?php the_time('G:i'); ?></p>
    				</div>
    			</div>
    		<?php endwhile;
    	else: ?>
    	<div class="post">
    		<p>There are currently no news items to display.</p>
    	</div>
    	<?php endif; ?>
    	<h3>Case Studies</h3>
    	<?php query_posts('showposts=1&category_name=casestudies');
    	global $more;
    	$more = 0;
    	if (have_posts()) :
    		while (have_posts()) : the_post(); ?>
    			<div class="post split">
    				<div class="image">
    					thumbnail here
    				</div>
    				<div class="text">
    					<h3><?php the_title(); ?></h3>
    					<?php the_content('Read More'); ?>
    					<p class="date"><?php the_time('F j, Y'); ?> at <?php the_time('G:i'); ?></p>
    				</div>
    			</div>
    		<?php endwhile;
    	else: ?>
    	<div class="post">
    		<p>There are currently no case studies to display.</p>
    	</div>
    	<?php endif;
    // IF [static page]
    } else if (is_page()) {
    	if (have_posts()) :
    		while (have_posts()) : the_post(); ?>
    			<div id="banner">
    				<h2><?php the_title(); ?></h2>
    				<?php $site->breadcrumbs($post, null); ?>
    			</div>
    			<?php $site->subpages($post);
    			the_content();
    		endwhile;
    	endif;
    
    // IF [single post]
    } else if (is_single()) {
    	if (have_posts()) :
    		while (have_posts()) : the_post(); ?>
    			<div id="banner">
    				<h2><?php the_title(); ?></h2>
    				<?php $site->breadcrumbs($post, get_the_category()); ?>
    			</div>
    			<?php the_content(); ?>
    			<p class="date"><?php the_time('F j, Y'); ?> at <?php the_time('G:i'); ?></p>
    		<?php endwhile;
    	endif;
    }
    if (is_front_page() || is_home()) echo 'HOMEPAGE';
    else echo 'HMM NOT HOMEPAGE';
    get_footer();
    ?>

    Ok people after an exhaustive trial and error exercise, I’ve narrowed the problem down to my usage of query_posts() in the top (ignoring the debugging echos) if statement. I’m using query_posts() to display the last post in the category news, then a bit of html, then the last post in category casestudies. This then causes the bottom echo, testing is_home() to fail even though the top one passes. I have read the codex on query_posts() but have to say I’m still at a loss as to solving the problem. Does anyone have any suggestions?

    Cheers,
    Jim

    Jim, thanks for posting your research. I had the same problem – is_front_page was not working in footer.php. My problem was likely the use of “get_post” within the page.

    To work around the problem, I call is_front_page at the top of the page (while it still works) and save the result in a variable $front_page. Then within footer.php I used:

    <?php
    global $front_page;
    if ($front_page) {
    // do special front page stuff
    }
    ?>

    Sometimes when I use query_posts() I’ll save and restore a clone of the original query object by wrapping the new loop in the following commands:

    $query_backup = clone($GLOBALS['wp_query']);
    [...]
     $GLOBALS['wp_query'] = $query_backup;

    Note that the clone method requires php5, but you can fake compatibility with something like this: clone for PHP4

    Hi!

    I had the same problem! is_home() or is_front_page() did not work in the footer. I figured out it turns FALSE after the query_posts() or get_post() (as BStofko wrote).

    So instead of using a variable for this and struggle with GLOBALS I’ve found and used this wordpress function after finishing the query:

    <?php wp_reset_query(); ?>

    Works like a charm for me. 🙂

    wp_reset_query (line 75)
    Destroy the previous query and setup a new query.

    This should be used after query_posts() and before another query_posts(). This will remove obscure bugs that occur when the previous wp_query object is not destroyed properly before another is setup.

    since: 2.3.0
    uses: $wp_query
    void wp_reset_query ()

    The above quote is from: here

    Another forum post about this: here

    @agenerousdesigner – I was having a similar problem and putting the <?php wp_reset_query(); ?> right before my is_home() call did the trick!
    Thanks!
    -Don

Viewing 12 replies - 1 through 12 (of 12 total)
  • The topic ‘Using is_home() after the loop’ is closed to new replies.