Make WordPress Core

Opened 6 years ago

Closed 6 years ago

Last modified 17 months ago

#12606 closed defect (bug) (fixed)

register_sidebars(n) fails to register multiple sidebars when 'id' argument defined

Reported by: minusfive Owned by: azaozz
Milestone: 3.0 Priority: normal
Severity: major Version: 2.9.2
Component: Widgets Keywords: widgets register_sidebars
Focuses: Cc:


When using default args for 'register_sidebars()' as defined on Codex:

$args = array(
    'name'          => 'My Custom Sidebar %d',
    'id'            => 'my-custom-sidebar-$i',
    'before_widget' => '<li id=\"%1$s\" class=\"widget %2$s\">',
    'after_widget'  => '</li>',
    'before_title'  => '<h2 class=\"widgettitle\">',
    'after_title'   => '</h2>' );

'id' argument won't get the '$i' variable value, thus won't be unique for each sidebar. Because all sidebars will end up using the same id, each iteration will override the previous sidebar. This obviously causes the system to register only 1 sidebar (the last iteration).

If 'id' argument is simply not defined and the function is allowed to use the default all sidebars are created, which is OK unless you insert another sidebar before, in which case all settings are lost. This is because the default 'id' argument for multiple sidebars is dependent on the sidebar's position in the wp_registered_sidebars array.

Proposed solution attached.

Attachments (1)

widgets.php.diff (474 bytes) - added by minusfive 6 years ago.
Proposed solution for Ticket #12606

Download all attachments as: .zip

Change History (8)

6 years ago

Proposed solution for Ticket #12606

#1 @dd32
6 years ago

  • Resolution set to fixed
  • Status changed from new to closed

(In [13698]) Ensure that for multiple sidebar additions, the ID is unique (even if specified). Append -2.. for > 1 sidebars. Props minusfive. Fixes #12606

#2 @dd32
6 years ago

(In [13699]) Simplify the Id uniqueness loops. Guard against more use-cases which might cause ID conflicts. See #12606

#3 @dd32
6 years ago

(In [13700]) Revert [13699], It breaks dynamic_sidebar(<int>) compatibility. Use a safer loop for clashes. See #12606

#4 @dd32
6 years ago

(In [13701]) Restore backwards compatibility of integer sidebars("sidebar-$i"). See #12606

#5 @nacin
5 years ago

  • Milestone 2.9.3 deleted

Milestone 2.9.3 deleted

#6 @nacin
5 years ago

  • Milestone set to 3.0

#7 @mcleod@…
17 months ago

  • Keywords changed from widgets, register_sidebars to widgets register_sidebars

The documentation was wrong. The point is, 'id' needs to be just a simple string, like 'sidebar' or 'mybar', not 'sidebar-$i' nor 'sidebar-%d'. The number will be appended automatically to the id, as stated in the textual description below the example cited in this ticket.

Note: See TracTickets for help on using tickets.