20 $sort = $wp_registered_widgets; |
20 $sort = $wp_registered_widgets; |
21 usort( $sort, '_sort_name_callback' ); |
21 usort( $sort, '_sort_name_callback' ); |
22 $done = array(); |
22 $done = array(); |
23 |
23 |
24 foreach ( $sort as $widget ) { |
24 foreach ( $sort as $widget ) { |
25 if ( in_array( $widget['callback'], $done, true ) ) // We already showed this multi-widget |
25 if ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget |
26 continue; |
26 continue; |
|
27 } |
27 |
28 |
28 $sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false ); |
29 $sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false ); |
29 $done[] = $widget['callback']; |
30 $done[] = $widget['callback']; |
30 |
31 |
31 if ( ! isset( $widget['params'][0] ) ) |
32 if ( ! isset( $widget['params'][0] ) ) { |
32 $widget['params'][0] = array(); |
33 $widget['params'][0] = array(); |
33 |
34 } |
34 $args = array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template' ); |
35 |
35 |
36 $args = array( |
36 if ( isset($wp_registered_widget_controls[$widget['id']]['id_base']) && isset($widget['params'][0]['number']) ) { |
37 'widget_id' => $widget['id'], |
37 $id_base = $wp_registered_widget_controls[$widget['id']]['id_base']; |
38 'widget_name' => $widget['name'], |
38 $args['_temp_id'] = "$id_base-__i__"; |
39 '_display' => 'template', |
39 $args['_multi_num'] = next_widget_id_number($id_base); |
40 ); |
40 $args['_add'] = 'multi'; |
41 |
|
42 if ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) ) { |
|
43 $id_base = $wp_registered_widget_controls[ $widget['id'] ]['id_base']; |
|
44 $args['_temp_id'] = "$id_base-__i__"; |
|
45 $args['_multi_num'] = next_widget_id_number( $id_base ); |
|
46 $args['_add'] = 'multi'; |
41 } else { |
47 } else { |
42 $args['_add'] = 'single'; |
48 $args['_add'] = 'single'; |
43 if ( $sidebar ) |
49 if ( $sidebar ) { |
44 $args['_hide'] = '1'; |
50 $args['_hide'] = '1'; |
45 } |
51 } |
46 |
52 } |
47 $args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) ); |
53 |
|
54 $args = wp_list_widget_controls_dynamic_sidebar( |
|
55 array( |
|
56 0 => $args, |
|
57 1 => $widget['params'][0], |
|
58 ) |
|
59 ); |
48 call_user_func_array( 'wp_widget_control', $args ); |
60 call_user_func_array( 'wp_widget_control', $args ); |
49 } |
61 } |
50 } |
62 } |
51 |
63 |
52 /** |
64 /** |
118 global $wp_registered_widgets; |
135 global $wp_registered_widgets; |
119 static $i = 0; |
136 static $i = 0; |
120 $i++; |
137 $i++; |
121 |
138 |
122 $widget_id = $params[0]['widget_id']; |
139 $widget_id = $params[0]['widget_id']; |
123 $id = isset($params[0]['_temp_id']) ? $params[0]['_temp_id'] : $widget_id; |
140 $id = isset( $params[0]['_temp_id'] ) ? $params[0]['_temp_id'] : $widget_id; |
124 $hidden = isset($params[0]['_hide']) ? ' style="display:none;"' : ''; |
141 $hidden = isset( $params[0]['_hide'] ) ? ' style="display:none;"' : ''; |
125 |
142 |
126 $params[0]['before_widget'] = "<div id='widget-{$i}_{$id}' class='widget'$hidden>"; |
143 $params[0]['before_widget'] = "<div id='widget-{$i}_{$id}' class='widget'$hidden>"; |
127 $params[0]['after_widget'] = "</div>"; |
144 $params[0]['after_widget'] = '</div>'; |
128 $params[0]['before_title'] = "%BEG_OF_TITLE%"; // deprecated |
145 $params[0]['before_title'] = '%BEG_OF_TITLE%'; // deprecated |
129 $params[0]['after_title'] = "%END_OF_TITLE%"; // deprecated |
146 $params[0]['after_title'] = '%END_OF_TITLE%'; // deprecated |
130 if ( is_callable( $wp_registered_widgets[$widget_id]['callback'] ) ) { |
147 if ( is_callable( $wp_registered_widgets[ $widget_id ]['callback'] ) ) { |
131 $wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback']; |
148 $wp_registered_widgets[ $widget_id ]['_callback'] = $wp_registered_widgets[ $widget_id ]['callback']; |
132 $wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control'; |
149 $wp_registered_widgets[ $widget_id ]['callback'] = 'wp_widget_control'; |
133 } |
150 } |
134 |
151 |
135 return $params; |
152 return $params; |
136 } |
153 } |
137 |
154 |
138 /** |
155 /** |
139 * |
|
140 * @global array $wp_registered_widgets |
156 * @global array $wp_registered_widgets |
141 * |
157 * |
142 * @param string $id_base |
158 * @param string $id_base |
143 * @return int |
159 * @return int |
144 */ |
160 */ |
145 function next_widget_id_number( $id_base ) { |
161 function next_widget_id_number( $id_base ) { |
146 global $wp_registered_widgets; |
162 global $wp_registered_widgets; |
147 $number = 1; |
163 $number = 1; |
148 |
164 |
149 foreach ( $wp_registered_widgets as $widget_id => $widget ) { |
165 foreach ( $wp_registered_widgets as $widget_id => $widget ) { |
150 if ( preg_match( '/' . $id_base . '-([0-9]+)$/', $widget_id, $matches ) ) |
166 if ( preg_match( '/' . $id_base . '-([0-9]+)$/', $widget_id, $matches ) ) { |
151 $number = max($number, $matches[1]); |
167 $number = max( $number, $matches[1] ); |
|
168 } |
152 } |
169 } |
153 $number++; |
170 $number++; |
154 |
171 |
155 return $number; |
172 return $number; |
156 } |
173 } |
170 * @return array |
187 * @return array |
171 */ |
188 */ |
172 function wp_widget_control( $sidebar_args ) { |
189 function wp_widget_control( $sidebar_args ) { |
173 global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets; |
190 global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets; |
174 |
191 |
175 $widget_id = $sidebar_args['widget_id']; |
192 $widget_id = $sidebar_args['widget_id']; |
176 $sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false; |
193 $sidebar_id = isset( $sidebar_args['id'] ) ? $sidebar_args['id'] : false; |
177 $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : '-1'; // position of widget in sidebar |
194 $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[ $sidebar_id ] ) : '-1'; // position of widget in sidebar |
178 $control = isset($wp_registered_widget_controls[$widget_id]) ? $wp_registered_widget_controls[$widget_id] : array(); |
195 $control = isset( $wp_registered_widget_controls[ $widget_id ] ) ? $wp_registered_widget_controls[ $widget_id ] : array(); |
179 $widget = $wp_registered_widgets[$widget_id]; |
196 $widget = $wp_registered_widgets[ $widget_id ]; |
180 |
197 |
181 $id_format = $widget['id']; |
198 $id_format = $widget['id']; |
182 $widget_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : ''; |
199 $widget_number = isset( $control['params'][0]['number'] ) ? $control['params'][0]['number'] : ''; |
183 $id_base = isset($control['id_base']) ? $control['id_base'] : $widget_id; |
200 $id_base = isset( $control['id_base'] ) ? $control['id_base'] : $widget_id; |
184 $multi_number = isset($sidebar_args['_multi_num']) ? $sidebar_args['_multi_num'] : ''; |
201 $width = isset( $control['width'] ) ? $control['width'] : ''; |
185 $add_new = isset($sidebar_args['_add']) ? $sidebar_args['_add'] : ''; |
202 $height = isset( $control['height'] ) ? $control['height'] : ''; |
186 |
203 $multi_number = isset( $sidebar_args['_multi_num'] ) ? $sidebar_args['_multi_num'] : ''; |
187 $before_form = isset( $sidebar_args['before_form'] ) ? $sidebar_args['before_form'] : '<form method="post">'; |
204 $add_new = isset( $sidebar_args['_add'] ) ? $sidebar_args['_add'] : ''; |
188 $after_form = isset( $sidebar_args['after_form'] ) ? $sidebar_args['after_form'] : '</form>'; |
205 |
|
206 $before_form = isset( $sidebar_args['before_form'] ) ? $sidebar_args['before_form'] : '<form method="post">'; |
|
207 $after_form = isset( $sidebar_args['after_form'] ) ? $sidebar_args['after_form'] : '</form>'; |
189 $before_widget_content = isset( $sidebar_args['before_widget_content'] ) ? $sidebar_args['before_widget_content'] : '<div class="widget-content">'; |
208 $before_widget_content = isset( $sidebar_args['before_widget_content'] ) ? $sidebar_args['before_widget_content'] : '<div class="widget-content">'; |
190 $after_widget_content = isset( $sidebar_args['after_widget_content'] ) ? $sidebar_args['after_widget_content'] : '</div>'; |
209 $after_widget_content = isset( $sidebar_args['after_widget_content'] ) ? $sidebar_args['after_widget_content'] : '</div>'; |
191 |
210 |
192 $query_arg = array( 'editwidget' => $widget['id'] ); |
211 $query_arg = array( 'editwidget' => $widget['id'] ); |
193 if ( $add_new ) { |
212 if ( $add_new ) { |
194 $query_arg['addnew'] = 1; |
213 $query_arg['addnew'] = 1; |
195 if ( $multi_number ) { |
214 if ( $multi_number ) { |
196 $query_arg['num'] = $multi_number; |
215 $query_arg['num'] = $multi_number; |
197 $query_arg['base'] = $id_base; |
216 $query_arg['base'] = $id_base; |
198 } |
217 } |
199 } else { |
218 } else { |
200 $query_arg['sidebar'] = $sidebar_id; |
219 $query_arg['sidebar'] = $sidebar_id; |
201 $query_arg['key'] = $key; |
220 $query_arg['key'] = $key; |
202 } |
221 } |
203 |
222 |
204 /* |
223 /* |
205 * We aren't showing a widget control, we're outputting a template |
224 * We aren't showing a widget control, we're outputting a template |
206 * for a multi-widget control. |
225 * for a multi-widget control. |
207 */ |
226 */ |
208 if ( isset($sidebar_args['_display']) && 'template' == $sidebar_args['_display'] && $widget_number ) { |
227 if ( isset( $sidebar_args['_display'] ) && 'template' == $sidebar_args['_display'] && $widget_number ) { |
209 // number == -1 implies a template where id numbers are replaced by a generic '__i__' |
228 // number == -1 implies a template where id numbers are replaced by a generic '__i__' |
210 $control['params'][0]['number'] = -1; |
229 $control['params'][0]['number'] = -1; |
211 // With id_base widget id's are constructed like {$id_base}-{$id_number}. |
230 // With id_base widget id's are constructed like {$id_base}-{$id_number}. |
212 if ( isset($control['id_base']) ) |
231 if ( isset( $control['id_base'] ) ) { |
213 $id_format = $control['id_base'] . '-__i__'; |
232 $id_format = $control['id_base'] . '-__i__'; |
214 } |
233 } |
215 |
234 } |
216 $wp_registered_widgets[$widget_id]['callback'] = $wp_registered_widgets[$widget_id]['_callback']; |
235 |
217 unset($wp_registered_widgets[$widget_id]['_callback']); |
236 $wp_registered_widgets[ $widget_id ]['callback'] = $wp_registered_widgets[ $widget_id ]['_callback']; |
|
237 unset( $wp_registered_widgets[ $widget_id ]['_callback'] ); |
218 |
238 |
219 $widget_title = esc_html( strip_tags( $sidebar_args['widget_name'] ) ); |
239 $widget_title = esc_html( strip_tags( $sidebar_args['widget_name'] ) ); |
220 $has_form = 'noform'; |
240 $has_form = 'noform'; |
221 |
241 |
222 echo $sidebar_args['before_widget']; ?> |
242 echo $sidebar_args['before_widget']; |
|
243 ?> |
223 <div class="widget-top"> |
244 <div class="widget-top"> |
224 <div class="widget-title-action"> |
245 <div class="widget-title-action"> |
225 <button type="button" class="widget-action hide-if-no-js" aria-expanded="false"> |
246 <button type="button" class="widget-action hide-if-no-js" aria-expanded="false"> |
226 <span class="screen-reader-text"><?php printf( __( 'Edit widget: %s' ), $widget_title ); ?></span> |
247 <span class="screen-reader-text edit"><?php printf( __( 'Edit widget: %s' ), $widget_title ); ?></span> |
|
248 <span class="screen-reader-text add"><?php printf( __( 'Add widget: %s' ), $widget_title ); ?></span> |
227 <span class="toggle-indicator" aria-hidden="true"></span> |
249 <span class="toggle-indicator" aria-hidden="true"></span> |
228 </button> |
250 </button> |
229 <a class="widget-control-edit hide-if-js" href="<?php echo esc_url( add_query_arg( $query_arg ) ); ?>"> |
251 <a class="widget-control-edit hide-if-js" href="<?php echo esc_url( add_query_arg( $query_arg ) ); ?>"> |
230 <span class="edit"><?php _ex( 'Edit', 'widget' ); ?></span> |
252 <span class="edit"><?php _ex( 'Edit', 'widget' ); ?></span> |
231 <span class="add"><?php _ex( 'Add', 'widget' ); ?></span> |
253 <span class="add"><?php _ex( 'Add', 'widget' ); ?></span> |
240 <?php echo $before_widget_content; ?> |
262 <?php echo $before_widget_content; ?> |
241 <?php |
263 <?php |
242 if ( isset( $control['callback'] ) ) { |
264 if ( isset( $control['callback'] ) ) { |
243 $has_form = call_user_func_array( $control['callback'], $control['params'] ); |
265 $has_form = call_user_func_array( $control['callback'], $control['params'] ); |
244 } else { |
266 } else { |
245 echo "\t\t<p>" . __('There are no options for this widget.') . "</p>\n"; |
267 echo "\t\t<p>" . __( 'There are no options for this widget.' ) . "</p>\n"; |
|
268 } |
|
269 |
|
270 $noform_class = ''; |
|
271 if ( 'noform' === $has_form ) { |
|
272 $noform_class = ' widget-control-noform'; |
246 } |
273 } |
247 ?> |
274 ?> |
248 <?php echo $after_widget_content; ?> |
275 <?php echo $after_widget_content; ?> |
249 <input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr($id_format); ?>" /> |
276 <input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr( $id_format ); ?>" /> |
250 <input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr($id_base); ?>" /> |
277 <input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr( $id_base ); ?>" /> |
251 <input type="hidden" name="widget-width" class="widget-width" value="<?php if (isset( $control['width'] )) echo esc_attr($control['width']); ?>" /> |
278 <input type="hidden" name="widget-width" class="widget-width" value="<?php echo esc_attr( $width ); ?>" /> |
252 <input type="hidden" name="widget-height" class="widget-height" value="<?php if (isset( $control['height'] )) echo esc_attr($control['height']); ?>" /> |
279 <input type="hidden" name="widget-height" class="widget-height" value="<?php echo esc_attr( $height ); ?>" /> |
253 <input type="hidden" name="widget_number" class="widget_number" value="<?php echo esc_attr($widget_number); ?>" /> |
280 <input type="hidden" name="widget_number" class="widget_number" value="<?php echo esc_attr( $widget_number ); ?>" /> |
254 <input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr($multi_number); ?>" /> |
281 <input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr( $multi_number ); ?>" /> |
255 <input type="hidden" name="add_new" class="add_new" value="<?php echo esc_attr($add_new); ?>" /> |
282 <input type="hidden" name="add_new" class="add_new" value="<?php echo esc_attr( $add_new ); ?>" /> |
256 |
283 |
257 <div class="widget-control-actions"> |
284 <div class="widget-control-actions"> |
258 <div class="alignleft"> |
285 <div class="alignleft"> |
259 <button type="button" class="button-link button-link-delete widget-control-remove"><?php _e( 'Delete' ); ?></button> |
286 <button type="button" class="button-link button-link-delete widget-control-remove"><?php _e( 'Delete' ); ?></button> |
260 <span class="widget-control-close-wrapper"> |
287 <span class="widget-control-close-wrapper"> |
261 | |
288 | |
262 <button type="button" class="button-link widget-control-close"><?php _e( 'Done' ); ?></button> |
289 <button type="button" class="button-link widget-control-close"><?php _e( 'Done' ); ?></button> |
263 </span> |
290 </span> |
264 </div> |
291 </div> |
265 <div class="alignright<?php if ( 'noform' === $has_form ) echo ' widget-control-noform'; ?>"> |
292 <div class="alignright<?php echo $noform_class; ?>"> |
266 <?php submit_button( __( 'Save' ), 'primary widget-control-save right', 'savewidget', false, array( 'id' => 'widget-' . esc_attr( $id_format ) . '-savewidget' ) ); ?> |
293 <?php submit_button( __( 'Save' ), 'primary widget-control-save right', 'savewidget', false, array( 'id' => 'widget-' . esc_attr( $id_format ) . '-savewidget' ) ); ?> |
267 <span class="spinner"></span> |
294 <span class="spinner"></span> |
268 </div> |
295 </div> |
269 <br class="clear" /> |
296 <br class="clear" /> |
270 </div> |
297 </div> |
271 <?php echo $after_form; ?> |
298 <?php echo $after_form; ?> |
272 </div> |
299 </div> |
273 |
300 |
274 <div class="widget-description"> |
301 <div class="widget-description"> |
275 <?php echo ( $widget_description = wp_widget_description($widget_id) ) ? "$widget_description\n" : "$widget_title\n"; ?> |
302 <?php echo ( $widget_description = wp_widget_description( $widget_id ) ) ? "$widget_description\n" : "$widget_title\n"; ?> |
276 </div> |
303 </div> |
277 <?php |
304 <?php |
278 echo $sidebar_args['after_widget']; |
305 echo $sidebar_args['after_widget']; |
279 |
306 |
280 return $sidebar_args; |
307 return $sidebar_args; |
281 } |
308 } |
282 |
309 |
283 /** |
310 /** |
284 * |
|
285 * @param string $classes |
311 * @param string $classes |
286 * @return string |
312 * @return string |
287 */ |
313 */ |
288 function wp_widgets_access_body_class($classes) { |
314 function wp_widgets_access_body_class( $classes ) { |
289 return "$classes widgets_access "; |
315 return "$classes widgets_access "; |
290 } |
316 } |