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(); ?>
Go to WordPress Installation directory. Follow the path wp-content > themes. Open your theme folder. In that you can see index.
To find the file and edit it yourself go to wp-content > themes > your-theme-name > header. php. You can then open it in a code editor and make any changes you need to.
The role of index PHP file in WordPress varies. When the index PHP file is in the root of the installation, it initializes the WordPress. On the contrary, in the Theme folder inside our theme index PHP file plays a different role. It achieves its goal, but in a different way.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With