[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-admin/ -> widgets.php (source)

   1  <?php
   2  /**
   3   * Widgets administration panel.
   4   *
   5   * @package WordPress
   6   * @subpackage Administration
   7   */
   8  
   9  /** WordPress Administration Bootstrap */
  10  require_once ( './admin.php' );
  11  
  12  /** WordPress Administration Widgets API */
  13  require_once (ABSPATH . 'wp-admin/includes/widgets.php');
  14  
  15  if ( ! current_user_can('edit_theme_options') )
  16      wp_die( __( 'Cheatin&#8217; uh?' ));
  17  
  18  $widgets_access = get_user_setting( 'widgets_access' );
  19  if ( isset($_GET['widgets-access']) ) {
  20      $widgets_access = 'on' == $_GET['widgets-access'] ? 'on' : 'off';
  21      set_user_setting( 'widgets_access', $widgets_access );
  22  }
  23  
  24  function wp_widgets_access_body_class($classes) {
  25      return "$classes widgets_access ";
  26  }
  27  
  28  if ( 'on' == $widgets_access ) {
  29      add_filter( 'admin_body_class', 'wp_widgets_access_body_class' );
  30  } else {
  31      wp_enqueue_script('admin-widgets');
  32  
  33      if ( wp_is_mobile() )
  34          wp_enqueue_script( 'jquery-touch-punch' );
  35  }
  36  
  37  do_action( 'sidebar_admin_setup' );
  38  
  39  $title = __( 'Widgets' );
  40  $parent_file = 'themes.php';
  41  
  42  get_current_screen()->add_help_tab( array(
  43  'id'        => 'overview',
  44  'title'        => __('Overview'),
  45  'content'    =>
  46      '<p>' . __('Widgets are independent sections of content that can be placed into any widgetized area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them.') . '</p>
  47      <p>' . __('The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget.') . '</p>'
  48  ) );
  49  get_current_screen()->add_help_tab( array(
  50  'id'        => 'removing-reusing',
  51  'title'        => __('Removing and Reusing'),
  52  'content'    =>
  53      '<p>' . __('If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas.') . '</p>
  54      <p>' . __('Widgets may be used multiple times. You can give each widget a title, to display on your site, but it&#8217;s not required.') . '</p>
  55      <p>' . __('Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop.') . '</p>'
  56  ) );
  57  get_current_screen()->add_help_tab( array(
  58  'id'        => 'missing-widgets',
  59  'title'        => __('Missing Widgets'),
  60  'content'    =>
  61      '<p>' . __('Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area.') . '</p>' .
  62          '<p>' . __('When changing themes, there is often some variation in the number and setup of widget areas/sidebars and sometimes these conflicts make the transition a bit less smooth. If you changed themes and seem to be missing widgets, scroll down on this screen to the Inactive area, where all your widgets and their settings will have been saved.') . '</p>'
  63  ) );
  64  
  65  get_current_screen()->set_help_sidebar(
  66      '<p><strong>' . __('For more information:') . '</strong></p>' .
  67      '<p>' . __('<a href="http://codex.wordpress.org/Appearance_Widgets_Screen" target="_blank">Documentation on Widgets</a>') . '</p>' .
  68      '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'
  69  );
  70  
  71  if ( empty($wp_registered_sidebars) ) {
  72      // the theme has no sidebars, die.
  73      require_once ( './admin-header.php' );
  74  ?>
  75  
  76      <div class="wrap">
  77      <?php screen_icon(); ?>
  78      <h2><?php echo esc_html( $title ); ?></h2>
  79          <div class="error">
  80              <p><?php _e( 'No Sidebars Defined' ); ?></p>
  81          </div>
  82          <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>
  83      </div>
  84  
  85  <?php
  86      require_once ( './admin-footer.php' );
  87      exit;
  88  }
  89  
  90  // These are the widgets grouped by sidebar
  91  $sidebars_widgets = wp_get_sidebars_widgets();
  92  
  93  if ( empty( $sidebars_widgets ) )
  94      $sidebars_widgets = wp_get_widget_defaults();
  95  
  96  foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
  97      if ( 'wp_inactive_widgets' == $sidebar_id )
  98          continue;
  99  
 100      if ( !isset( $wp_registered_sidebars[ $sidebar_id ] ) ) {
 101          if ( ! empty( $widgets ) ) { // register the inactive_widgets area as sidebar
 102              register_sidebar(array(
 103                  'name' => __( 'Inactive Sidebar (not used)' ),
 104                  'id' => $sidebar_id,
 105                  'class' => 'inactive-sidebar orphan-sidebar',
 106                  'description' => __( 'This sidebar is no longer available and does not show anywhere on your site. Remove each of the widgets below to fully remove this inactive sidebar.' ),
 107                  'before_widget' => '',
 108                  'after_widget' => '',
 109                  'before_title' => '',
 110                  'after_title' => '',
 111              ));
 112          } else {
 113              unset( $sidebars_widgets[ $sidebar_id ] );
 114          }
 115      }
 116  }
 117  
 118  // register the inactive_widgets area as sidebar
 119  register_sidebar(array(
 120      'name' => __('Inactive Widgets'),
 121      'id' => 'wp_inactive_widgets',
 122      'class' => 'inactive-sidebar',
 123      'description' => __( 'Drag widgets here to remove them from the sidebar but keep their settings.' ),
 124      'before_widget' => '',
 125      'after_widget' => '',
 126      'before_title' => '',
 127      'after_title' => '',
 128  ));
 129  
 130  retrieve_widgets();
 131  
 132  // We're saving a widget without js
 133  if ( isset($_POST['savewidget']) || isset($_POST['removewidget']) ) {
 134      $widget_id = $_POST['widget-id'];
 135      check_admin_referer("save-delete-widget-$widget_id");
 136  
 137      $number = isset($_POST['multi_number']) ? (int) $_POST['multi_number'] : '';
 138      if ( $number ) {
 139          foreach ( $_POST as $key => $val ) {
 140              if ( is_array($val) && preg_match('/__i__|%i%/', key($val)) ) {
 141                  $_POST[$key] = array( $number => array_shift($val) );
 142                  break;
 143              }
 144          }
 145      }
 146  
 147      $sidebar_id = $_POST['sidebar'];
 148      $position = isset($_POST[$sidebar_id . '_position']) ? (int) $_POST[$sidebar_id . '_position'] - 1 : 0;
 149  
 150      $id_base = $_POST['id_base'];
 151      $sidebar = isset($sidebars_widgets[$sidebar_id]) ? $sidebars_widgets[$sidebar_id] : array();
 152  
 153      // delete
 154      if ( isset($_POST['removewidget']) && $_POST['removewidget'] ) {
 155  
 156          if ( !in_array($widget_id, $sidebar, true) ) {
 157              wp_redirect( admin_url('widgets.php?error=0') );
 158              exit;
 159          }
 160  
 161          $sidebar = array_diff( $sidebar, array($widget_id) );
 162          $_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1');
 163      }
 164  
 165      $_POST['widget-id'] = $sidebar;
 166  
 167      foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
 168          if ( $name != $id_base || !is_callable($control['callback']) )
 169              continue;
 170  
 171          ob_start();
 172              call_user_func_array( $control['callback'], $control['params'] );
 173          ob_end_clean();
 174  
 175          break;
 176      }
 177  
 178      $sidebars_widgets[$sidebar_id] = $sidebar;
 179  
 180      // remove old position
 181      if ( !isset($_POST['delete_widget']) ) {
 182          foreach ( $sidebars_widgets as $key => $sb ) {
 183              if ( is_array($sb) )
 184                  $sidebars_widgets[$key] = array_diff( $sb, array($widget_id) );
 185          }
 186          array_splice( $sidebars_widgets[$sidebar_id], $position, 0, $widget_id );
 187      }
 188  
 189      wp_set_sidebars_widgets($sidebars_widgets);
 190      wp_redirect( admin_url('widgets.php?message=0') );
 191      exit;
 192  }
 193  
 194  // Output the widget form without js
 195  if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {
 196      $widget_id = $_GET['editwidget'];
 197  
 198      if ( isset($_GET['addnew']) ) {
 199          // Default to the first sidebar
 200          $sidebar = array_shift( $keys = array_keys($wp_registered_sidebars) );
 201  
 202          if ( isset($_GET['base']) && isset($_GET['num']) ) { // multi-widget
 203              // Copy minimal info from an existing instance of this widget to a new instance
 204              foreach ( $wp_registered_widget_controls as $control ) {
 205                  if ( $_GET['base'] === $control['id_base'] ) {
 206                      $control_callback = $control['callback'];
 207                      $multi_number = (int) $_GET['num'];
 208                      $control['params'][0]['number'] = -1;
 209                      $widget_id = $control['id'] = $control['id_base'] . '-' . $multi_number;
 210                      $wp_registered_widget_controls[$control['id']] = $control;
 211                      break;
 212                  }
 213              }
 214          }
 215      }
 216  
 217      if ( isset($wp_registered_widget_controls[$widget_id]) && !isset($control) ) {
 218          $control = $wp_registered_widget_controls[$widget_id];
 219          $control_callback = $control['callback'];
 220      } elseif ( !isset($wp_registered_widget_controls[$widget_id]) && isset($wp_registered_widgets[$widget_id]) ) {
 221          $name = esc_html( strip_tags($wp_registered_widgets[$widget_id]['name']) );
 222      }
 223  
 224      if ( !isset($name) )
 225          $name = esc_html( strip_tags($control['name']) );
 226  
 227      if ( !isset($sidebar) )
 228          $sidebar = isset($_GET['sidebar']) ? $_GET['sidebar'] : 'wp_inactive_widgets';
 229  
 230      if ( !isset($multi_number) )
 231          $multi_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';
 232  
 233      $id_base = isset($control['id_base']) ? $control['id_base'] : $control['id'];
 234  
 235      // show the widget form
 236      $width = ' style="width:' . max($control['width'], 350) . 'px"';
 237      $key = isset($_GET['key']) ? (int) $_GET['key'] : 0;
 238  
 239      require_once ( './admin-header.php' ); ?>
 240      <div class="wrap">
 241      <?php screen_icon(); ?>
 242      <h2><?php echo esc_html( $title ); ?></h2>
 243      <div class="editwidget"<?php echo $width; ?>>
 244      <h3><?php printf( __( 'Widget %s' ), $name ); ?></h3>
 245  
 246      <form action="widgets.php" method="post">
 247      <div class="widget-inside">
 248  <?php
 249      if ( is_callable( $control_callback ) )
 250          call_user_func_array( $control_callback, $control['params'] );
 251      else
 252          echo '<p>' . __('There are no options for this widget.') . "</p>\n"; ?>
 253      </div>
 254  
 255      <p class="describe"><?php _e('Select both the sidebar for this widget and the position of the widget in that sidebar.'); ?></p>
 256      <div class="widget-position">
 257      <table class="widefat"><thead><tr><th><?php _e('Sidebar'); ?></th><th><?php _e('Position'); ?></th></tr></thead><tbody>
 258  <?php
 259      foreach ( $wp_registered_sidebars as $sbname => $sbvalue ) {
 260          echo "\t\t<tr><td><label><input type='radio' name='sidebar' value='" . esc_attr($sbname) . "'" . checked( $sbname, $sidebar, false ) . " /> $sbvalue[name]</label></td><td>";
 261          if ( 'wp_inactive_widgets' == $sbname || 'orphaned_widgets' == substr( $sbname, 0, 16 ) ) {
 262              echo '&nbsp;';
 263          } else {
 264              if ( !isset($sidebars_widgets[$sbname]) || !is_array($sidebars_widgets[$sbname]) ) {
 265                  $j = 1;
 266                  $sidebars_widgets[$sbname] = array();
 267              } else {
 268                  $j = count($sidebars_widgets[$sbname]);
 269                  if ( isset($_GET['addnew']) || !in_array($widget_id, $sidebars_widgets[$sbname], true) )
 270                      $j++;
 271              }
 272              $selected = '';
 273              echo "\t\t<select name='{$sbname}_position'>\n";
 274              echo "\t\t<option value=''>" . __('&mdash; Select &mdash;') . "</option>\n";
 275              for ( $i = 1; $i <= $j; $i++ ) {
 276                  if ( in_array($widget_id, $sidebars_widgets[$sbname], true) )
 277                      $selected = selected( $i, $key + 1, false );
 278                  echo "\t\t<option value='$i'$selected> $i </option>\n";
 279              }
 280              echo "\t\t</select>\n";
 281          }
 282          echo "</td></tr>\n";
 283      } ?>
 284      </tbody></table>
 285      </div>
 286  
 287      <div class="widget-control-actions">
 288  <?php
 289      if ( isset($_GET['addnew']) ) { ?>
 290      <a href="widgets.php" class="button alignleft"><?php _e('Cancel'); ?></a>
 291  <?php
 292      } else {
 293          submit_button( __( 'Delete' ), 'button alignleft', 'removewidget', false );
 294      }
 295      submit_button( __( 'Save Widget' ), 'button-primary alignright', 'savewidget', false ); ?>
 296      <input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr($widget_id); ?>" />
 297      <input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr($id_base); ?>" />
 298      <input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr($multi_number); ?>" />
 299  <?php    wp_nonce_field("save-delete-widget-$widget_id"); ?>
 300      <br class="clear" />
 301      </div>
 302      </form>
 303      </div>
 304      </div>
 305  <?php
 306      require_once ( './admin-footer.php' );
 307      exit;
 308  }
 309  
 310  $messages = array(
 311      __('Changes saved.')
 312  );
 313  
 314  $errors = array(
 315      __('Error while saving.'),
 316      __('Error in displaying the widget settings form.')
 317  );
 318  
 319  require_once ( './admin-header.php' ); ?>
 320  
 321  <div class="wrap">
 322  <?php screen_icon(); ?>
 323  <h2><?php echo esc_html( $title ); ?></h2>
 324  
 325  <?php if ( isset($_GET['message']) && isset($messages[$_GET['message']]) ) { ?>
 326  <div id="message" class="updated"><p><?php echo $messages[$_GET['message']]; ?></p></div>
 327  <?php } ?>
 328  <?php if ( isset($_GET['error']) && isset($errors[$_GET['error']]) ) { ?>
 329  <div id="message" class="error"><p><?php echo $errors[$_GET['error']]; ?></p></div>
 330  <?php } ?>
 331  
 332  <?php do_action( 'widgets_admin_page' ); ?>
 333  
 334  <div class="widget-liquid-left">
 335  <div id="widgets-left">
 336      <div id="available-widgets" class="widgets-holder-wrap">
 337          <div class="sidebar-name">
 338          <div class="sidebar-name-arrow"><br /></div>
 339          <h3><?php _e('Available Widgets'); ?> <span id="removing-widget"><?php _ex('Deactivate', 'removing-widget'); ?> <span></span></span></h3></div>
 340          <div class="widget-holder">
 341          <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>
 342          <div id="widget-list">
 343          <?php wp_list_widgets(); ?>
 344          </div>
 345          <br class='clear' />
 346          </div>
 347          <br class="clear" />
 348      </div>
 349  
 350  <?php
 351  foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
 352      if ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) {
 353          $wrap_class = 'widgets-holder-wrap';
 354          if ( !empty( $registered_sidebar['class'] ) )
 355              $wrap_class .= ' ' . $registered_sidebar['class'];
 356  
 357  ?>
 358  
 359          <div class="<?php echo esc_attr( $wrap_class ); ?>">
 360              <div class="sidebar-name">
 361                  <div class="sidebar-name-arrow"><br /></div>
 362                  <h3><?php echo esc_html( $registered_sidebar['name'] ); ?>
 363                      <span><img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" class="ajax-feedback" title="" alt="" /></span>
 364                  </h3>
 365              </div>
 366              <div class="widget-holder inactive">
 367                  <?php wp_list_widget_controls( $registered_sidebar['id'] ); ?>
 368                  <br class="clear" />
 369              </div>
 370          </div>
 371  <?php
 372      }
 373  }
 374  ?>
 375  
 376  </div>
 377  </div>
 378  
 379  <div class="widget-liquid-right">
 380  <div id="widgets-right">
 381  <?php
 382  $i = 0;
 383  foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
 384      if ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) )
 385          continue;
 386  
 387      $wrap_class = 'widgets-holder-wrap';
 388      if ( !empty( $registered_sidebar['class'] ) )
 389          $wrap_class .= ' sidebar-' . $registered_sidebar['class'];
 390  
 391      if ( $i )
 392          $wrap_class .= ' closed'; ?>
 393  
 394      <div class="<?php echo esc_attr( $wrap_class ); ?>">
 395      <div class="sidebar-name">
 396      <div class="sidebar-name-arrow"><br /></div>
 397      <h3><?php echo esc_html( $registered_sidebar['name'] ); ?>
 398      <span><img src="<?php echo esc_url( admin_url( 'images/wpspin_dark.gif' ) ); ?>" class="ajax-feedback" title="" alt="" /></span></h3></div>
 399      <?php wp_list_widget_controls( $sidebar ); // Show the control forms for each of the widgets in this sidebar ?>
 400      </div>
 401  <?php
 402      $i++;
 403  } ?>
 404  </div>
 405  </div>
 406  <form action="" method="post">
 407  <?php wp_nonce_field( 'save-sidebar-widgets', '_wpnonce_widgets', false ); ?>
 408  </form>
 409  <br class="clear" />
 410  </div>
 411  
 412  <?php
 413  do_action( 'sidebar_admin_page' );
 414  require_once ( './admin-footer.php' );


Generated: Fri May 25 03:56:23 2012 Hosted by follow the white rabbit.