PageRenderTime 24ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-admin/widgets.php

https://github.com/jao/jpcamargo
PHP | 395 lines | 308 code | 64 blank | 23 comment | 61 complexity | 05aebc535d0ce3accd25e71332df14d6 MD5 | raw file
  1. <?php
  2. /**
  3. * Widgets administration panel.
  4. *
  5. * @package WordPress
  6. * @subpackage Administration
  7. */
  8. /** WordPress Administration Bootstrap */
  9. require_once( 'admin.php' );
  10. /** WordPress Administration Widgets API */
  11. require_once(ABSPATH . 'wp-admin/includes/widgets.php');
  12. if ( ! current_user_can('switch_themes') )
  13. wp_die( __( 'Cheatin&#8217; uh?' ));
  14. wp_admin_css( 'widgets' );
  15. $widgets_access = get_user_setting( 'widgets_access' );
  16. if ( isset($_GET['widgets-access']) ) {
  17. $widgets_access = 'on' == $_GET['widgets-access'] ? 'on' : 'off';
  18. set_user_setting( 'widgets_access', $widgets_access );
  19. }
  20. if ( 'on' == $widgets_access )
  21. add_filter( 'admin_body_class', create_function('', '{return " widgets_access ";}') );
  22. else
  23. wp_enqueue_script('admin-widgets');
  24. do_action( 'sidebar_admin_setup' );
  25. $title = __( 'Widgets' );
  26. $parent_file = 'themes.php';
  27. // register the inactive_widgets area as sidebar
  28. register_sidebar(array(
  29. 'name' => __('Inactive Widgets'),
  30. 'id' => 'wp_inactive_widgets',
  31. 'before_widget' => '',
  32. 'after_widget' => '',
  33. 'before_title' => '',
  34. 'after_title' => '',
  35. ));
  36. // These are the widgets grouped by sidebar
  37. $sidebars_widgets = wp_get_sidebars_widgets();
  38. if ( empty( $sidebars_widgets ) )
  39. $sidebars_widgets = wp_get_widget_defaults();
  40. // look for "lost" widgets, this has to run at least on each theme change
  41. function retrieve_widgets() {
  42. global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;
  43. $_sidebars_widgets = array();
  44. $sidebars = array_keys($wp_registered_sidebars);
  45. unset( $sidebars_widgets['array_version'] );
  46. $old = array_keys($sidebars_widgets);
  47. sort($old);
  48. sort($sidebars);
  49. if ( $old == $sidebars )
  50. return;
  51. // Move the known-good ones first
  52. foreach ( $sidebars as $id ) {
  53. if ( array_key_exists( $id, $sidebars_widgets ) ) {
  54. $_sidebars_widgets[$id] = $sidebars_widgets[$id];
  55. unset($sidebars_widgets[$id], $sidebars[$id]);
  56. }
  57. }
  58. // if new theme has less sidebars than the old theme
  59. if ( !empty($sidebars_widgets) ) {
  60. foreach ( $sidebars_widgets as $lost => $val ) {
  61. if ( is_array($val) )
  62. $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val );
  63. }
  64. }
  65. // discard invalid, theme-specific widgets from sidebars
  66. $shown_widgets = array();
  67. foreach ( $_sidebars_widgets as $sidebar => $widgets ) {
  68. if ( !is_array($widgets) )
  69. continue;
  70. $_widgets = array();
  71. foreach ( $widgets as $widget ) {
  72. if ( isset($wp_registered_widgets[$widget]) )
  73. $_widgets[] = $widget;
  74. }
  75. $_sidebars_widgets[$sidebar] = $_widgets;
  76. $shown_widgets = array_merge($shown_widgets, $_widgets);
  77. }
  78. $sidebars_widgets = $_sidebars_widgets;
  79. unset($_sidebars_widgets, $_widgets);
  80. // find hidden/lost multi-widget instances
  81. $lost_widgets = array();
  82. foreach ( $wp_registered_widgets as $key => $val ) {
  83. if ( in_array($key, $shown_widgets, true) )
  84. continue;
  85. $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key);
  86. if ( 2 > (int) $number )
  87. continue;
  88. $lost_widgets[] = $key;
  89. }
  90. $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']);
  91. wp_set_sidebars_widgets($sidebars_widgets);
  92. }
  93. retrieve_widgets();
  94. if ( count($wp_registered_sidebars) == 1 ) {
  95. // If only "wp_inactive_widgets" is defined the theme has no sidebars, die.
  96. require_once( 'admin-header.php' );
  97. ?>
  98. <div class="wrap">
  99. <?php screen_icon(); ?>
  100. <h2><?php echo esc_html( $title ); ?></h2>
  101. <div class="error">
  102. <p><?php _e( 'No Sidebars Defined' ); ?></p>
  103. </div>
  104. <p><?php _e( 'The theme you are currently using isn&#8217;t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please <a href="http://codex.wordpress.org/Widgetizing_Themes">follow these instructions</a>.' ); ?></p>
  105. </div>
  106. <?php
  107. require_once( 'admin-footer.php' );
  108. exit;
  109. }
  110. // We're saving a widget without js
  111. if ( isset($_POST['savewidget']) || isset($_POST['removewidget']) ) {
  112. $widget_id = $_POST['widget-id'];
  113. check_admin_referer("save-delete-widget-$widget_id");
  114. $number = isset($_POST['multi_number']) ? (int) $_POST['multi_number'] : '';
  115. if ( $number ) {
  116. foreach ( $_POST as $key => $val ) {
  117. if ( is_array($val) && preg_match('/__i__|%i%/', key($val)) ) {
  118. $_POST[$key] = array( $number => array_shift($val) );
  119. break;
  120. }
  121. }
  122. }
  123. $sidebar_id = $_POST['sidebar'];
  124. $position = isset($_POST[$sidebar_id . '_position']) ? (int) $_POST[$sidebar_id . '_position'] - 1 : 0;
  125. $id_base = $_POST['id_base'];
  126. $sidebar = isset($sidebars_widgets[$sidebar_id]) ? $sidebars_widgets[$sidebar_id] : array();
  127. // delete
  128. if ( isset($_POST['removewidget']) && $_POST['removewidget'] ) {
  129. if ( !in_array($widget_id, $sidebar, true) ) {
  130. wp_redirect('widgets.php?error=0');
  131. exit;
  132. }
  133. $sidebar = array_diff( $sidebar, array($widget_id) );
  134. $_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1');
  135. }
  136. $_POST['widget-id'] = $sidebar;
  137. foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
  138. if ( $name != $id_base || !is_callable($control['callback']) )
  139. continue;
  140. ob_start();
  141. call_user_func_array( $control['callback'], $control['params'] );
  142. ob_end_clean();
  143. break;
  144. }
  145. $sidebars_widgets[$sidebar_id] = $sidebar;
  146. // remove old position
  147. if ( !isset($_POST['delete_widget']) ) {
  148. foreach ( $sidebars_widgets as $key => $sb ) {
  149. if ( is_array($sb) )
  150. $sidebars_widgets[$key] = array_diff( $sb, array($widget_id) );
  151. }
  152. array_splice( $sidebars_widgets[$sidebar_id], $position, 0, $widget_id );
  153. }
  154. wp_set_sidebars_widgets($sidebars_widgets);
  155. wp_redirect('widgets.php?message=0');
  156. exit;
  157. }
  158. // Output the widget form without js
  159. if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {
  160. $widget_id = $_GET['editwidget'];
  161. if ( isset($_GET['addnew']) ) {
  162. // Default to the first sidebar
  163. $sidebar = array_shift( $keys = array_keys($wp_registered_sidebars) );
  164. if ( isset($_GET['base']) && isset($_GET['num']) ) { // multi-widget
  165. // Copy minimal info from an existing instance of this widget to a new instance
  166. foreach ( $wp_registered_widget_controls as $control ) {
  167. if ( $_GET['base'] === $control['id_base'] ) {
  168. $control_callback = $control['callback'];
  169. $multi_number = (int) $_GET['num'];
  170. $control['params'][0]['number'] = -1;
  171. $widget_id = $control['id'] = $control['id_base'] . '-' . $multi_number;
  172. $wp_registered_widget_controls[$control['id']] = $control;
  173. break;
  174. }
  175. }
  176. }
  177. }
  178. if ( isset($wp_registered_widget_controls[$widget_id]) && !isset($control) ) {
  179. $control = $wp_registered_widget_controls[$widget_id];
  180. $control_callback = $control['callback'];
  181. } elseif ( !isset($wp_registered_widget_controls[$widget_id]) && isset($wp_registered_widgets[$widget_id]) ) {
  182. $name = esc_html( strip_tags($wp_registered_widgets[$widget_id]['name']) );
  183. }
  184. if ( !isset($name) )
  185. $name = esc_html( strip_tags($control['name']) );
  186. if ( !isset($sidebar) )
  187. $sidebar = isset($_GET['sidebar']) ? $_GET['sidebar'] : 'wp_inactive_widgets';
  188. if ( !isset($multi_number) )
  189. $multi_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';
  190. $id_base = isset($control['id_base']) ? $control['id_base'] : $control['id'];
  191. // show the widget form
  192. $width = ' style="width:' . max($control['width'], 350) . 'px"';
  193. $key = isset($_GET['key']) ? (int) $_GET['key'] : 0;
  194. require_once( 'admin-header.php' ); ?>
  195. <div class="wrap">
  196. <?php screen_icon(); ?>
  197. <h2><?php echo esc_html( $title ); ?></h2>
  198. <div class="editwidget"<?php echo $width; ?>>
  199. <h3><?php printf( __( 'Widget %s' ), $name ); ?></h3>
  200. <form action="widgets.php" method="post">
  201. <div class="widget-inside">
  202. <?php
  203. if ( is_callable( $control_callback ) )
  204. call_user_func_array( $control_callback, $control['params'] );
  205. else
  206. echo '<p>' . __('There are no options for this widget.') . "</p>\n"; ?>
  207. </div>
  208. <p class="describe"><?php _e('Select both the sidebar for this widget and the position of the widget in that sidebar.'); ?></p>
  209. <div class="widget-position">
  210. <table class="widefat"><thead><tr><th><?php _e('Sidebar'); ?></th><th><?php _e('Position'); ?></th></tr></thead><tbody>
  211. <?php
  212. foreach ( $wp_registered_sidebars as $sbname => $sbvalue ) {
  213. echo "\t\t<tr><td><label><input type='radio' name='sidebar' value='" . esc_attr($sbname) . "'" . checked( $sbname, $sidebar, false ) . " /> $sbvalue[name]</label></td><td>";
  214. if ( 'wp_inactive_widgets' == $sbname ) {
  215. echo '&nbsp;';
  216. } else {
  217. if ( !isset($sidebars_widgets[$sbname]) || !is_array($sidebars_widgets[$sbname]) ) {
  218. $j = 1;
  219. $sidebars_widgets[$sbname] = array();
  220. } else {
  221. $j = count($sidebars_widgets[$sbname]);
  222. if ( isset($_GET['addnew']) || !in_array($widget_id, $sidebars_widgets[$sbname], true) )
  223. $j++;
  224. }
  225. $selected = '';
  226. echo "\t\t<select name='{$sbname}_position'>\n";
  227. echo "\t\t<option value=''>" . __('-- select --') . "</option>\n";
  228. for ( $i = 1; $i <= $j; $i++ ) {
  229. if ( in_array($widget_id, $sidebars_widgets[$sbname], true) )
  230. $selected = selected( $i, $key + 1, false );
  231. echo "\t\t<option value='$i'$selected> $i </option>\n";
  232. }
  233. echo "\t\t</select>\n";
  234. }
  235. echo "</td></tr>\n";
  236. } ?>
  237. </tbody></table>
  238. </div>
  239. <div class="widget-control-actions">
  240. <?php if ( isset($_GET['addnew']) ) { ?>
  241. <a href="widgets.php" class="button alignleft"><?php _e('Cancel'); ?></a>
  242. <?php } else { ?>
  243. <input type="submit" name="removewidget" class="button alignleft" value="<?php esc_attr_e('Remove'); ?>" />
  244. <?php } ?>
  245. <input type="submit" name="savewidget" class="button-primary alignright" value="<?php esc_attr_e('Save Widget'); ?>" />
  246. <input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr($widget_id); ?>" />
  247. <input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr($id_base); ?>" />
  248. <input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr($multi_number); ?>" />
  249. <?php wp_nonce_field("save-delete-widget-$widget_id"); ?>
  250. <br class="clear" />
  251. </div>
  252. </form>
  253. </div>
  254. </div>
  255. <?php
  256. require_once( 'admin-footer.php' );
  257. exit;
  258. }
  259. $messages = array(
  260. __('Changes saved.')
  261. );
  262. $errors = array(
  263. __('Error while saving.'),
  264. __('Error in displaying the widget settings form.')
  265. );
  266. require_once( 'admin-header.php' ); ?>
  267. <div class="wrap">
  268. <?php screen_icon(); ?>
  269. <h2><?php echo esc_html( $title ); ?></h2>
  270. <?php if ( isset($_GET['message']) && isset($messages[$_GET['message']]) ) { ?>
  271. <div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
  272. <?php } ?>
  273. <?php if ( isset($_GET['error']) && isset($errors[$_GET['error']]) ) { ?>
  274. <div id="message" class="error"><p><?php echo $errors[$_GET['error']]; ?></p></div>
  275. <?php } ?>
  276. <div class="widget-liquid-left">
  277. <div id="widgets-left">
  278. <div id="available-widgets" class="widgets-holder-wrap">
  279. <div class="sidebar-name">
  280. <div class="sidebar-name-arrow"><br /></div>
  281. <h3><?php _e('Available Widgets'); ?> <span id="removing-widget"><?php _e('Deactivate'); ?> <span></span></span></h3></div>
  282. <div class="widget-holder">
  283. <p class="description"><?php _e('Drag widgets from here to a sidebar on the right to activate them. Drag widgets back here to deactivate them and delete their settings.'); ?></p>
  284. <div id="widget-list">
  285. <?php wp_list_widgets(); ?>
  286. </div>
  287. <br class='clear' />
  288. </div>
  289. <br class="clear" />
  290. </div>
  291. <div class="widgets-holder-wrap">
  292. <div class="sidebar-name">
  293. <div class="sidebar-name-arrow"><br /></div>
  294. <h3><?php _e('Inactive Widgets'); ?>
  295. <span><img src="images/wpspin_light.gif" class="ajax-feedback" title="" alt="" /></span></h3></div>
  296. <div class="widget-holder inactive">
  297. <p class="description"><?php _e('Drag widgets here to remove them from the sidebar but keep their settings.'); ?></p>
  298. <?php wp_list_widget_controls('wp_inactive_widgets'); ?>
  299. <br class="clear" />
  300. </div>
  301. </div>
  302. </div>
  303. </div>
  304. <div class="widget-liquid-right">
  305. <div id="widgets-right">
  306. <?php
  307. $i = 0;
  308. foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
  309. if ( 'wp_inactive_widgets' == $sidebar )
  310. continue;
  311. $closed = $i ? ' closed' : ''; ?>
  312. <div class="widgets-holder-wrap<?php echo $closed; ?>">
  313. <div class="sidebar-name">
  314. <div class="sidebar-name-arrow"><br /></div>
  315. <h3><?php echo esc_html( $registered_sidebar['name'] ); ?>
  316. <span><img src="images/wpspin_dark.gif" class="ajax-feedback" title="" alt="" /></span></h3></div>
  317. <?php wp_list_widget_controls( $sidebar ); // Show the control forms for each of the widgets in this sidebar ?>
  318. </div>
  319. <?php
  320. $i++;
  321. } ?>
  322. </div>
  323. </div>
  324. <form action="" method="post">
  325. <?php wp_nonce_field( 'save-sidebar-widgets', '_wpnonce_widgets', false ); ?>
  326. </form>
  327. <br class="clear" />
  328. </div>
  329. <?php
  330. do_action( 'sidebar_admin_page' );
  331. require_once( 'admin-footer.php' );