views:

33

answers:

2

I have the following code in header.php to echo the body's id: <body id="<?php echo $body; ?>"> which is taken from a variable from index.php: $body = "home";

The output result is: body id=""

Any suggestions to fix this?

(I made var_dump($body) and the value is "home" so the variable is working)

header.php:

<?php
/**
 * The Header for our theme.
 *
 * Displays all of the <head> section and everything up till <div id="main">
 *
 * @package WordPress
 * @subpackage Starkers
 * @since Starkers 3.0
 */
?><!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>" />
<title><?php
    /*
     * Print the <title> tag based on what is being viewed.
     * We filter the output of wp_title() a bit -- see
     * twentyten_filter_wp_title() in functions.php.
     */
    wp_title( '|', true, 'right' );

    ?></title>
<link rel="profile" href="http://gmpg.org/xfn/11" />
<link rel="stylesheet" type="text/css" media="all" href="<?php bloginfo( 'stylesheet_url' ); ?>" />
<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />
<?php
    /* We add some JavaScript to pages with the comment form
     * to support sites with threaded comments (when in use).
     */
    if ( is_singular() && get_option( 'thread_comments' ) )
        wp_enqueue_script( 'comment-reply' );

    /* Always have wp_head() just before the closing </head>
     * tag of your theme, or you will break many plugins, which
     * generally use this hook to add elements to <head> such
     * as styles, scripts, and meta tags.
     */
    wp_head();
?>
</head>

<!--<body <?php body_class(); ?>>-->
<body id="<?php echo $body; ?>">
<div id="header">
    <div class="container">
        <div id="header-top">
            <h1>
                <a href="<?php echo home_url( '/' ); ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a>
            </h1>
            <!--<p><?php bloginfo( 'description' ); ?></p>-->

            <div id="access" role="navigation">
              <?php /*  Allow screen readers / text browsers to skip the navigation menu and get right to the good stuff */ ?>
              <!--<a href="#content" title="<?php esc_attr_e( 'Skip to content', 'twentyten' ); ?>"><?php _e( 'Skip to content', 'twentyten' ); ?></a>-->
                <?php /* Our navigation menu.  If one isn't filled out, wp_nav_menu falls back to wp_page_menu.  The menu assiged to the primary position is the one used.  If none is assigned, the menu with the lowest ID is used.  */ ?>
                <?php wp_nav_menu( array( 'container_class' => 'menu-header', 'theme_location' => 'primary' ) ); ?>
            </div><!-- #access -->
            <ul id="lang">
                <li <?php if($lang_file=='lang.en.php') {echo 'class="current"';} ?>><a href="index.php?lang=en">ENGLISH</a></li>
                <li <?php if($lang_file=='lang.zh-tw.php') {echo 'class="current"';} ?>><a href="index.php?lang=zh-tw">CHINESE</a></li>
            </ul>
        </div>
    </div><!-- .container -->
</div><!-- #header -->

index.php:

<?php
/**
 * The main template file.
 *
 * This is the most generic template file in a WordPress theme
 * and one of the two required files for a theme (the other being style.css).
 * It is used to display a page when nothing more specific matches a query.
 * E.g., it puts together the home page when no home.php file exists.
 * Learn more: http://codex.wordpress.org/Template_Hierarchy
 *
 * @package WordPress
 * @subpackage Starkers
 * @since Starkers 3.0
 */
$body = "home";
include_once 'localization.php';
get_header(); ?>
<div id="content">
    <div class="container">
        <div id="mainbar">
            <?php
            /* Run the loop to output the posts.
             * If you want to overload this in a child theme then include a file
             * called loop-index.php and that will be used instead.
             */
             get_template_part( 'loop', 'index' );
            ?>
            <p><?php echo l('test'); ?></p>
        </div>
        <?php get_sidebar(); ?>
    </div><!-- .container -->
</div><!-- #main-content -->
<?php get_footer(); ?>
+1  A: 

You're dealing with a variable scoping issue.

Since the inclusion of the header.php is done by the get_header() function, the $body variable within the header.php file is contained within the scope of that function (i.e. it is a local variable in the function).

You need to declare the variable as global within the header.php file. Before doing anything else with the variable, add this line to header.php:

global $body;

I believe this should help achieve the behavior you're looking for.

See these for reference:

PHP Variable Scope

Wordpress - Stepping Into Templates

chuckx
Hey it worked thanks!
janoChen
A: 

Actually what is happening is much simpler than that. The header.php file is being called before index.php. If you were to delete all the HTML and just look at the PHP, you'd see this.

    <body id="<?php echo $body; ?>">
    <?php $body = "home";
          include_once 'localization.php';
          get_header(); ?>

You're just trying to echo the value of $body before it was ever set.

Michael