I had modified my custom theme to add widgetized sidebars, but as soon as I added the appropriate code, I got a series of 404 errors. After many days of tracing through the code, I found that I'd picked up a spurious $GLOBALS['name'] variable of value "Search Sidebar" that was throwing off the SQL request to the DB.
Here's what I found....
Through my tracing I could see that a $GLOBALS['name'] was being added into the DB query when I used the widgetized theme, which wasn't there with the old theme.
By tracing the flow through all the modules called by wp-blog-header.php I could see that nothing was set in $GLOBALS['name'] before my custom functions.php. However after the functions call, it was set to "Search Sidebar".
I put some tracing statements into the code to see what was going on:
<?php
/**
* @package WordPress
* @subpackage Kyoto-Green-3
*/
$sidebars = array('Home Sidebar',
'Single Sidebar',
'Page Sidebar',
'List Sidebar',
'Gallery Sidebar',
'Library Sidebar',
'Search Sidebar');
foreach($sidebars as $name) {
$dae_error = ">>>> 9a. Name: " . $name . " global name: " . $GLOBALS['name'];
error_log($dae_error, 0);
register_sidebar(array('name' => $name,
'before_widget' => '<div class="block">',
'after_widget' => '</div><div class="blockfooter"></div>',
'before_title' => '<h2>',
'after_title' => '</h2>'));
$dae_error = ">>>> 9b. Name: " . $name . " global name: " . $GLOBALS['name'];
error_log($dae_error, 0);
};
?>
My php error log showed:
[20-Aug-2009 07:40:13] >>>> 6yb. In wp-settings; global name:
[20-Aug-2009 07:40:13] >>>> 6yc. In wp-settings; global name:
[20-Aug-2009 07:40:13] >>>> 6yd. In wp-settings; global name:
[20-Aug-2009 07:40:13] >>>> 9a. Name: Home Sidebar global name: Home Sidebar
[20-Aug-2009 07:40:13] >>>> 9b. Name: Home Sidebar global name: Home Sidebar
[20-Aug-2009 07:40:13] >>>> 9a. Name: Single Sidebar global name: Single Sidebar
[20-Aug-2009 07:40:13] >>>> 9b. Name: Single Sidebar global name: Single Sidebar
[20-Aug-2009 07:40:13] >>>> 9a. Name: Page Sidebar global name: Page Sidebar
[20-Aug-2009 07:40:13] >>>> 9b. Name: Page Sidebar global name: Page Sidebar
[20-Aug-2009 07:40:13] >>>> 9a. Name: List Sidebar global name: List Sidebar
[20-Aug-2009 07:40:13] >>>> 9b. Name: List Sidebar global name: List Sidebar
[20-Aug-2009 07:40:13] >>>> 9a. Name: Gallery Sidebar global name: Gallery Sidebar
[20-Aug-2009 07:40:13] >>>> 9b. Name: Gallery Sidebar global name: Gallery Sidebar
[20-Aug-2009 07:40:13] >>>> 9a. Name: Library Sidebar global name: Library Sidebar
[20-Aug-2009 07:40:13] >>>> 9b. Name: Library Sidebar global name: Library Sidebar
[20-Aug-2009 07:40:13] >>>> 9a. Name: Search Sidebar global name: Search Sidebar
[20-Aug-2009 07:40:13] >>>> 9b. Name: Search Sidebar global name: Search Sidebar
[20-Aug-2009 07:40:13] >>>> 6yy. In wp-settings; global name: Search Sidebar
[20-Aug-2009 07:40:13] >>>> 6zz. In wp-settings; global name: Search Sidebar
So each iteration of the foreach loop was setting the $GLOBALS['name'] to the current $name value.
The fix was easy; I merely unset the variable at the bottom of the loop (I suppose I could have done it outside the loop):
<?php
/**
* @package WordPress
* @subpackage Kyoto-Green-3
*/
$sidebars = array('Home Sidebar',
'Single Sidebar',
'Page Sidebar',
'List Sidebar',
'Gallery Sidebar',
'Library Sidebar',
'Search Sidebar');
foreach($sidebars as $name) {
register_sidebar(array('name' => $name,
'before_widget' => '<div class="block">',
'after_widget' => '</div><div class="blockfooter"></div>',
'before_title' => '<h2>',
'after_title' => '</h2>'));
unset($GLOBALS['name']);
};
?>
I don't know enough about how PHP processes variables and assigns GLOBAL variables, but this behaviour looks wrong to me.
Can anyone explain why this is happening and if there's a better way to resolve the issue? Perhaps use other variable names that don't clash with the wp_query ones?