]> scripts.mit.edu Git - autoinstallsdev/wordpress.git/blob - wp-admin/includes/widgets.php
Wordpress 2.7.1
[autoinstallsdev/wordpress.git] / wp-admin / includes / widgets.php
1 <?php
2 /**
3  * WordPress Widgets Administration API
4  *
5  * @package WordPress
6  * @subpackage Administration
7  */
8
9 /**
10  * Display list of widgets, either all or matching search.
11  *
12  * The search parameter are search terms separated by spaces.
13  *
14  * @since unknown
15  *
16  * @param string $show Optional, default is all. What to display, can be 'all', 'unused', or 'used'.
17  * @param string $_search Optional. Search for widgets. Should be unsanitized.
18  */
19 function wp_list_widgets( $show = 'all', $_search = false ) {
20         global $wp_registered_widgets, $sidebars_widgets, $wp_registered_widget_controls;
21         if ( $_search ) {
22                 // sanitize
23                 $search = preg_replace( '/[^\w\s]/', '', $_search );
24                 // array of terms
25                 $search_terms = preg_split( '/[\s]/', $search, -1, PREG_SPLIT_NO_EMPTY );
26         } else {
27                 $search_terms = array();
28         }
29
30         if ( !in_array( $show, array( 'all', 'unused', 'used' ) ) )
31                 $show = 'all';
32 ?>
33
34         <ul id='widget-list'>
35                 <?php
36                 $no_widgets_shown = true;
37                 $already_shown = array();
38                 foreach ( $wp_registered_widgets as $name => $widget ) :
39                         if ( 'all' == $show && in_array( $widget['callback'], $already_shown ) ) // We already showed this multi-widget
40                                 continue;
41
42                         if ( $search_terms ) {
43                                 $hit = false;
44                                 // Simple case-insensitive search.  Boolean OR.
45                                 $search_text = preg_replace( '/[^\w]/', '', $widget['name'] );
46                                 if ( isset($widget['description']) )
47                                         $search_text .= preg_replace( '/[^\w]/', '', $widget['description'] );
48
49                                 foreach ( $search_terms as $search_term ) {
50                                         if ( stristr( $search_text, $search_term ) ) {
51                                                 $hit = true;
52                                                 break;
53                                         }
54                                 }
55                                 if ( !$hit )
56                                         continue;
57                         }
58
59                         $sidebar = is_active_widget( $widget['callback'], $widget['id'] );
60
61                         if ( ( 'unused' == $show && $sidebar ) || ( 'used' == $show && !$sidebar ) )
62                                 continue;
63
64                         if ( ! isset( $widget['params'][0] ) )
65                                 $widget['params'][0] = array();
66                         ob_start();
67                         $args = wp_list_widget_controls_dynamic_sidebar( array( 0 => array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template', '_show' => $show ), 1 => $widget['params'][0] ) );
68                         $sidebar_args = call_user_func_array( 'wp_widget_control', $args );
69                         $widget_control_template = ob_get_contents();
70                         ob_end_clean();
71
72                         $widget_id = $widget['id']; // save this for later in case we mess with $widget['id']
73
74                         $is_multi = false !== strpos( $widget_control_template, '%i%' );
75                         if ( !$sidebar || $is_multi ) {
76                                 $add_query = array(
77                                         'sidebar' => $sidebar,
78                                         'key' => false,
79                                         'edit' => false
80                                 );
81                                 if ( 'all' == $show && $is_multi ) {
82                                         // it's a multi-widget.  We only need to show it in the list once.
83                                         $already_shown[] = $widget['callback'];
84                                         $num = (int) array_pop( $ids = explode( '-', $widget['id'] ) );
85                                         $id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
86                                         // so that we always add a new one when clicking "add"
87                                         while ( isset($wp_registered_widgets["$id_base-$num"]) )
88                                                 $num++;
89                                         $widget['id'] = "$id_base-$num";
90                                         $add_query['base'] = $id_base;
91                                         $add_query['key'] = $num;
92                                         $add_query['sidebar'] = $GLOBALS['sidebar'];
93                                 }
94                                 $add_query['add'] = $widget['id'];
95                                 $action = 'add';
96                                 $add_url = clean_url( wp_nonce_url( add_query_arg( $add_query ), "add-widget_$widget[id]" ) );
97                         } else {
98                                 $action = 'edit';
99                                 $edit_url = clean_url( add_query_arg( array(
100                                         'sidebar' => $sidebar,
101                                         'edit' => $widget['id'],
102                                         'key' => array_search( $widget['id'], $sidebars_widgets[$sidebar] ),
103                                 ) ) );
104
105                                 $widget_control_template = '<textarea rows="1" cols="1">' . htmlspecialchars( $widget_control_template ) . '</textarea>';
106                         }
107
108                         $widget_control_template = $sidebar_args['before_widget'] . $widget_control_template . $sidebar_args['after_widget'];
109
110                         $no_widgets_shown = false;
111
112
113                         if ( 'all' != $show && $sidebar_args['_widget_title'] )
114                                 $widget_title = $sidebar_args['_widget_title'];
115                         else
116                                 $widget_title = $widget['name'];
117                 ?>
118
119                 <li id="widget-list-item-<?php echo attribute_escape( $widget['id'] ); ?>" class="widget-list-item">
120                         <h4 class="widget-title widget-draggable">
121
122                                 <span><?php echo $widget_title; ?></span>
123
124                                 <?php if ( 'add' == $action ) : ?>
125
126                                 <a class="widget-action widget-control-add" href="<?php echo $add_url; ?>"><?php _e( 'Add' ); ?></a>
127
128                                 <?php elseif ( 'edit' == $action ) :
129                                         // We echo a hidden edit link for the sake of the JS.  Edit links are shown (needlessly?) after a widget is added.
130                                 ?>
131
132                                 <a class="widget-action widget-control-edit" href="<?php echo $edit_url; ?>" style="display: none;"><?php _e( 'Edit' ); ?></a>
133
134                                 <?php endif; ?>
135
136                                 <br class="clear" />
137
138                         </h4>
139
140
141                         <ul id="widget-control-info-<?php echo $widget['id']; ?>" class="widget-control-info">
142
143                                 <?php echo $widget_control_template; ?>
144
145                         </ul>
146
147                         <?php if ( 'add' == $action ) : ?>
148                         <?php endif; ?>
149
150                         <div class="widget-description">
151                                 <?php echo ( $widget_description = wp_widget_description( $widget_id ) ) ? $widget_description : '&nbsp;'; ?>
152                         </div>
153
154                         <br class="clear" />
155
156                 </li>
157
158                 <?php endforeach; if ( $no_widgets_shown ) : ?>
159
160                 <li><?php _e( 'No matching widgets' ); ?></li>
161
162                 <?php endif; ?>
163
164         </ul>
165 <?php
166 }
167
168 /**
169  * {@internal Missing Short Description}}
170  *
171  * @since unknown
172  *
173  * @param string $sidebar
174  */
175 function wp_list_widget_controls( $sidebar ) {
176         add_filter( 'dynamic_sidebar_params', 'wp_list_widget_controls_dynamic_sidebar' );
177 ?>
178
179         <ul class="widget-control-list">
180
181                 <?php if ( !dynamic_sidebar( $sidebar ) ) echo "<li />"; ?>
182
183         </ul>
184
185 <?php
186 }
187
188 /**
189  * {@internal Missing Short Description}}
190  *
191  * @since unknown
192  *
193  * @param array $params
194  * @return array
195  */
196 function wp_list_widget_controls_dynamic_sidebar( $params ) {
197         global $wp_registered_widgets;
198         static $i = 0;
199         $i++;
200
201         $widget_id = $params[0]['widget_id'];
202
203         $params[0]['before_widget'] = "<li id='widget-list-control-item-$i-$widget_id' class='widget-list-control-item widget-sortable'>\n";
204         $params[0]['after_widget'] = "</li>";
205         $params[0]['before_title'] = "%BEG_OF_TITLE%";
206         $params[0]['after_title'] = "%END_OF_TITLE%";
207         if ( is_callable( $wp_registered_widgets[$widget_id]['callback'] ) ) {
208                 $wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];
209                 $wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control';
210         }
211         return $params;
212 }
213
214 /**
215  * Meta widget used to display the control form for a widget.
216  *
217  * Called from dynamic_sidebar().
218  *
219  * @since unknown
220  *
221  * @param array $sidebar_args
222  * @return array
223  */
224 function wp_widget_control( $sidebar_args ) {
225         global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets, $edit_widget;
226         $widget_id = $sidebar_args['widget_id'];
227         $sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false;
228
229         $control = isset($wp_registered_widget_controls[$widget_id]) ? $wp_registered_widget_controls[$widget_id] : 0;
230         $widget  = $wp_registered_widgets[$widget_id];
231
232         $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : 'no-key'; // position of widget in sidebar
233
234         $edit = -1 <  $edit_widget && is_numeric($key) && $edit_widget === $key; // (bool) are we currently editing this widget
235
236         $id_format = $widget['id'];
237
238         if ( ! isset( $sidebar_args['_show'] ) )
239                 $sidebar_args['_show'] = '';
240
241         if ( ! isset( $sidebar_args['_display'] ) )
242                 $sidebar_args['_display'] = '';
243
244         // We aren't showing a widget control, we're outputing a template for a mult-widget control
245         if ( 'all' == $sidebar_args['_show'] && 'template' == $sidebar_args['_display'] && isset($control['params'][0]['number']) ) {
246                 // number == -1 implies a template where id numbers are replaced by a generic '%i%'
247                 $control['params'][0]['number'] = -1;
248                 // if given, id_base means widget id's should be constructed like {$id_base}-{$id_number}
249                 if ( isset($control['id_base']) )
250                         $id_format = $control['id_base'] . '-%i%';
251         }
252
253         $widget_title = '';
254         // We grab the normal widget output to find the widget's title
255         if ( ( 'all' != $sidebar_args['_show'] || 'template' != $sidebar_args['_display'] ) && is_callable( $widget['_callback'] ) ) {
256                 ob_start();
257                 $args = func_get_args();
258                 call_user_func_array( $widget['_callback'], $args );
259                 $widget_title = ob_get_clean();
260                 $widget_title = wp_widget_control_ob_filter( $widget_title );
261         }
262         $wp_registered_widgets[$widget_id]['callback'] = $wp_registered_widgets[$widget_id]['_callback'];
263         unset($wp_registered_widgets[$widget_id]['_callback']);
264
265         if ( $widget_title && $widget_title != $sidebar_args['widget_name'] )
266                 $widget_title = sprintf( _c('%1$s: %2$s|1: widget name, 2: widget title' ), $sidebar_args['widget_name'], $widget_title );
267         else
268                 $widget_title = wp_specialchars( strip_tags( $sidebar_args['widget_name'] ) );
269
270         $sidebar_args['_widget_title'] = $widget_title;
271
272         if ( empty($sidebar_args['_display']) || 'template' != $sidebar_args['_display'] )
273                 echo $sidebar_args['before_widget'];
274 ?>
275                 <div class="widget-top">
276                 <h4 class="widget-title"><span><?php echo $widget_title ?></span>
277
278                         <?php if ( $edit ) : ?>
279
280                         <a class="widget-action widget-control-edit" href="<?php echo clean_url( remove_query_arg( array( 'edit', 'key' ) ) ); ?>"><?php _e('Cancel'); ?></a>
281
282                         <?php else : ?>
283
284                         <a class="widget-action widget-control-edit" href="<?php echo clean_url( add_query_arg( array( 'edit' => $id_format, 'key' => $key ) ) ); ?>"><?php _e('Edit'); ?></a>
285
286                         <?php endif; ?>
287
288                         <br class="clear" />
289
290                 </h4></div>
291
292                 <div class="widget-control"<?php if ( $edit ) echo ' style="display: block;"'; ?>>
293
294                         <?php
295                         if ( $control )
296                                 call_user_func_array( $control['callback'], $control['params'] );
297                         else
298                                 echo '<p>' . __('There are no options for this widget.') . '</p>';
299                         ?>
300
301                         <input type="hidden" name="widget-id[]" value="<?php echo $id_format; ?>" />
302                         <input type="hidden" class="widget-width" value="<?php echo $control['width']; ?>" />
303
304                         <div class="widget-control-actions">
305
306                                 <?php if ( $control ) : ?>
307
308                                 <a class="button widget-action widget-control-save hide-if-no-js edit alignleft" href="#save:<?php echo $id_format; ?>"><?php _e('Done'); ?></a>
309
310                                 <?php endif; ?>
311
312                                 <a class="button widget-action widget-control-remove alignright" href="<?php echo clean_url( wp_nonce_url( add_query_arg( array( 'remove' => $id_format, 'key' => $key ) ), "remove-widget_$widget[id]" ) ); ?>"><?php _e('Remove'); ?></a>
313                                 <br class="clear" />
314                         </div>
315                 </div>
316 <?php
317         if ( empty($sidebar_args['_display']) || 'template' != $sidebar_args['_display'] )
318                 echo $sidebar_args['after_widget'];
319         return $sidebar_args;
320 }
321
322 /**
323  * {@internal Missing Short Description}}
324  *
325  * @since unknown
326  *
327  * @param string $string
328  * @return string
329  */
330 function wp_widget_control_ob_filter( $string ) {
331         if ( false === $beg = strpos( $string, '%BEG_OF_TITLE%' ) )
332                 return '';
333         if ( false === $end = strpos( $string, '%END_OF_TITLE%' ) )
334                 return '';
335         $string = substr( $string, $beg + 14 , $end - $beg - 14);
336         $string = str_replace( '&nbsp;', ' ', $string );
337         return trim( wp_specialchars( strip_tags( $string ) ) );
338 }
339
340 ?>