Sometimes even calling
<?php wp_reset_query(); ?>
may result in some side effects. Once it is called, further queries such as in_category() results failure due to reset. For more details refer
http://wordpress.org/support/topic/160374?replies=4
To circumvent all these issues my universe solution is to introduce global php varaibles such as $my_home, #my_category to replace is_home(), in_category() respectively.
In the index.php, single.php, archives.php I set these variables appropriately just before calling sidebar_x().
In all sidebar widget just check for status of (either 1 or 0) $my_home, $my_category… in widget don’t forget to declare these variables as global.
looks dirty work around, but it works like charm in any condition, any theme.. 🙂
Calling the below function before checking for is_home() may solve your problem. I had this issue and got solved in this way. This function resets the previous query.
<?php wp_reset_query(); ?>