PageRenderTime 25ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-admin/includes/widgets.php

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