[wp-hackers] Sidebar ID Naming Problems

Chris Jean gaarai at gaarai.com
Wed Nov 18 16:09:29 UTC 2009


I really appreciate you bringing this up Charles. This is a situation 
that I have dreaded for a long time.

I often produce solutions that have a very large number number of 
"sidebars". This results in widget shuffling when any of the sidebars 
are removed or new ones are added. I'd love a solution that allowed me 
to specify very specific sidebar IDs using alphanumeric, -, and _ 
characters.

I'm going to start working on a Core patch that does just that. Does 
anyone know of any potential pitfalls as I begin working with this? For 
example, is there code in the widget handling that expects/requires an 
integer sidebar id?

Chris Jean
http://gaarai.com/
@chrisjean



Charles K. Clarkson wrote:
> Hello,
>
> This went a little long. There were a lot more problems than I 
> anticipated. So,
> I moved the question to the top.
>
> How should I proceed?
>
>     Write a patch for a new function that gets the sidebar id from a 
> name-or-id
>     input or an array where the name or id is specified? (Which would 
> entail
>     patching other functions [3] in /wp-includes/widgets.php.)
>
>     - OR -
>
>     Rewrite the documentation to reflect the problems with some edge 
> cases of id
>     naming.
>
>     - OR -
>
>     Something else?
>
>
>
> register_sidebar() allows more names and ids to be registered than
> dynamic_sidebar() recognizes as valid names and ids.
>
> For example, register_sidebar() allows me to name a side bar "1" with 
> a id of
> "first". I don't know why anyone would choose those values, but
> register_sidebar() allows it [1].
>
> register_sidebar( array('name' => 1, id => 'first') );
>
>
> dynamic_sidebar() will not be able to find the sidebar given its name 
> (1).
>
>     if ( is_int($index) ) {
>         $index = "sidebar-$index"; /// 1 becomes 'sidebar-1'
>         ...
>
> The main problem is that dynamic_sidebar() is trying to process both 
> ids and
> names through the same variable ($index) while register_sidebar() 
> separates the
> two with an array ( array('name' => 'Top', 'id' => 'sidebar-1' ).
>
> According to the in-line docs for dynamic_sidebar():
>
>     It is confusing for the $index parameter, but just know that it 
> should just
>     work. When you register the sidebar in the theme, you will use the 
> same name
>     for this function or "Pay no heed to the man behind the curtain." 
> Just
>     accept it as an oddity of WordPress sidebar register and display.
>
>
> It does "just work" if you never use your own sidebar ids.
>
>
> I started looking at this because I wanted to use is_active_sidebar() 
> which
> tests to see if a dynamic_sidebar() has anything in it. There is no
> get_dynamic_sidebar(). dynamic_sidebar() sends everything to the 
> browser or
> returns false.
>
>     register_sidebar( array('name' => 'Top') ); // id defaults to 
> "sidebar-1"
>     ...
>
>     if ( is_active_sidebar('Top') )
>         dynamic_sidebar('Top');
>
> Which fails because is_active_sidebar() just completely skips over 
> searching for
> an id to go with a name. To get it to work you need to know when it was
> registered. Not something theme authors and designers are going to follow
> easily. There's a ticket to fix this: 
> http://core.trac.wordpress.org/ticket/10440
>
>     if ( is_active_sidebar(1) )
>         dynamic_sidebar('Top');
>
> Like dynamic_sidebar(), is_active_sidebar() converts 1 to "sidebar-1". 
> Unlike
> dynamic_sidebar() it assumes everything is entered as an id.
>
>
> unregister_sidebar() assumes its parameter (incorrectly named $name, 
> not $id) is
> an id. But it wants a literal id, like "sidebar-1". unregister_sidebar(1)
> unregisters a sidebar with an id of 1, while dynamic_sidebar(1) tries 
> to display
> a sidebar with an id of "sidebar-1".
>
>
> Wait. There's more.
>
> The dynamic_sidebar() function is used by the Widgets management page. 
> So, it is
> possible to create a sidebar with register_sidebar() that 
> dynamic_sidebar()
> cannot find. You can populate it with drag and drop [2] and not have 
> it appear
> on the web site.
>
>
> Note:
> [1] register_sidebar() allows the user to override the default setting 
> of:
>     'id' => "sidebar-$i",
>
> [2] When you refresh the Widgets management page the widgets will 
> disappear from
>     the sidebar. They are still attached to a sidebar, but 
> dynamic_sidebar()
>     cannot see the sidebar.
>
> [3] Depending on the exact solution used, this might include patching 
> these
>     functions:
>         dynamic_sidebar()
>         is_active_sidebar()
>         unregister_sidebar()
>         register_sidebar()
>         register_sidebars()
>
>     And creating this one:
>         get_sidebar_id()
>
>
> HTH,
>
>
> Charles Clarkson
> -- 
> Mobile Home Investor
> Free Market Advocate
> Programmer
>
> I'm not really a smart person. I just play one on the Internet.
>
> Stephenville, TX
> http://www.clarksonenergyhomes.com/wordpress/about/
> http://twitter.com/CharlesClarkson
> +1 (254) 968-8328
> _______________________________________________
> wp-hackers mailing list
> wp-hackers at lists.automattic.com
> http://lists.automattic.com/mailman/listinfo/wp-hackers


More information about the wp-hackers mailing list