PageRenderTime 71ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-admin/includes/widgets.php

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