WordPress 4.4.1-scripts
[autoinstalls/wordpress.git] / wp-admin / widgets.php
index 6c05e533033564b21af22938928634738830de69..3b43ac06d2ae1e5775f9349d74b7ecc2992491b9 100644 (file)
@@ -1,19 +1,24 @@
 <?php
 /**
- * Widgets administration panel.
+ * Widget administration panel
  *
  * @package WordPress
  * @subpackage Administration
  */
 
 /** WordPress Administration Bootstrap */
-require_once( './admin.php' );
+require_once( dirname( __FILE__ ) . '/admin.php' );
 
 /** WordPress Administration Widgets API */
 require_once(ABSPATH . 'wp-admin/includes/widgets.php');
 
-if ( ! current_user_can('edit_theme_options') )
-       wp_die( __( 'Cheatin&#8217; uh?' ));
+if ( ! current_user_can( 'edit_theme_options' ) ) {
+       wp_die(
+               '<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .
+               '<p>' . __( 'You are not allowed to edit theme options on this site.' ) . '</p>',
+               403
+       );
+}
 
 $widgets_access = get_user_setting( 'widgets_access' );
 if ( isset($_GET['widgets-access']) ) {
@@ -21,15 +26,21 @@ if ( isset($_GET['widgets-access']) ) {
        set_user_setting( 'widgets_access', $widgets_access );
 }
 
-function wp_widgets_access_body_class($classes) {
-       return "$classes widgets_access ";
-}
-
-if ( 'on' == $widgets_access )
+if ( 'on' == $widgets_access ) {
        add_filter( 'admin_body_class', 'wp_widgets_access_body_class' );
-else
+} else {
        wp_enqueue_script('admin-widgets');
 
+       if ( wp_is_mobile() )
+               wp_enqueue_script( 'jquery-touch-punch' );
+}
+
+/**
+ * Fires early before the Widgets administration screen loads,
+ * after scripts are enqueued.
+ *
+ * @since 2.2.0
+ */
 do_action( 'sidebar_admin_setup' );
 
 $title = __( 'Widgets' );
@@ -55,32 +66,17 @@ get_current_screen()->add_help_tab( array(
 'title'                => __('Missing Widgets'),
 'content'      =>
        '<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>' .
-               '<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>'
+               '<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 Widgets area, where all of your widgets and their settings will have been saved.') . '</p>'
 ) );
 
 get_current_screen()->set_help_sidebar(
        '<p><strong>' . __('For more information:') . '</strong></p>' .
-       '<p>' . __('<a href="http://codex.wordpress.org/Appearance_Widgets_Screen" target="_blank">Documentation on Widgets</a>') . '</p>' .
-       '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'
+       '<p>' . __('<a href="https://codex.wordpress.org/Appearance_Widgets_Screen" target="_blank">Documentation on Widgets</a>') . '</p>' .
+       '<p>' . __('<a href="https://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'
 );
 
-if ( empty($wp_registered_sidebars) ) {
-       // the theme has no sidebars, die.
-       require_once( './admin-header.php' );
-?>
-
-       <div class="wrap">
-       <?php screen_icon(); ?>
-       <h2><?php echo esc_html( $title ); ?></h2>
-               <div class="error">
-                       <p><?php _e( 'No Sidebars Defined' ); ?></p>
-               </div>
-               <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>
-       </div>
-
-<?php
-       require_once( './admin-footer.php' );
-       exit;
+if ( ! current_theme_supports( 'widgets' ) ) {
+       wp_die( __( '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="https://codex.wordpress.org/Widgetizing_Themes">follow these instructions</a>.' ) );
 }
 
 // These are the widgets grouped by sidebar
@@ -93,7 +89,7 @@ foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
        if ( 'wp_inactive_widgets' == $sidebar_id )
                continue;
 
-       if ( !isset( $wp_registered_sidebars[ $sidebar_id ] ) ) {
+       if ( ! is_registered_sidebar( $sidebar_id ) ) {
                if ( ! empty( $widgets ) ) { // register the inactive_widgets area as sidebar
                        register_sidebar(array(
                                'name' => __( 'Inactive Sidebar (not used)' ),
@@ -146,7 +142,7 @@ if ( isset($_POST['savewidget']) || isset($_POST['removewidget']) ) {
        $id_base = $_POST['id_base'];
        $sidebar = isset($sidebars_widgets[$sidebar_id]) ? $sidebars_widgets[$sidebar_id] : array();
 
-       // delete
+       // Delete.
        if ( isset($_POST['removewidget']) && $_POST['removewidget'] ) {
 
                if ( !in_array($widget_id, $sidebar, true) ) {
@@ -156,6 +152,17 @@ if ( isset($_POST['savewidget']) || isset($_POST['removewidget']) ) {
 
                $sidebar = array_diff( $sidebar, array($widget_id) );
                $_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1');
+
+               /**
+                * Fires immediately after a widget has been marked for deletion.
+                *
+                * @since 4.4.0
+                *
+                * @param string $widget_id  ID of the widget marked for deletion.
+                * @param string $sidebar_id ID of the sidebar the widget was deleted from.
+                * @param string $id_base    ID base for the widget.
+                */
+               do_action( 'delete_widget', $widget_id, $sidebar_id, $id_base );
        }
 
        $_POST['widget-id'] = $sidebar;
@@ -173,7 +180,7 @@ if ( isset($_POST['savewidget']) || isset($_POST['removewidget']) ) {
 
        $sidebars_widgets[$sidebar_id] = $sidebar;
 
-       // remove old position
+       // Remove old position.
        if ( !isset($_POST['delete_widget']) ) {
                foreach ( $sidebars_widgets as $key => $sb ) {
                        if ( is_array($sb) )
@@ -187,13 +194,36 @@ if ( isset($_POST['savewidget']) || isset($_POST['removewidget']) ) {
        exit;
 }
 
+// Remove inactive widgets without js
+if ( isset( $_POST['removeinactivewidgets'] ) ) {
+       check_admin_referer( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' );
+
+       if ( $_POST['removeinactivewidgets'] ) {
+               foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {
+                       $pieces = explode( '-', $widget_id );
+                       $multi_number = array_pop( $pieces );
+                       $id_base = implode( '-', $pieces );
+                       $widget = get_option( 'widget_' . $id_base );
+                       unset( $widget[$multi_number] );
+                       update_option( 'widget_' . $id_base, $widget );
+                       unset( $sidebars_widgets['wp_inactive_widgets'][$key] );
+               }
+
+               wp_set_sidebars_widgets( $sidebars_widgets );
+       }
+
+       wp_redirect( admin_url( 'widgets.php?message=0' ) );
+       exit;
+}
+
 // Output the widget form without js
 if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {
        $widget_id = $_GET['editwidget'];
 
        if ( isset($_GET['addnew']) ) {
                // Default to the first sidebar
-               $sidebar = array_shift( $keys = array_keys($wp_registered_sidebars) );
+               $keys = array_keys( $wp_registered_sidebars );
+               $sidebar = reset( $keys );
 
                if ( isset($_GET['base']) && isset($_GET['num']) ) { // multi-widget
                        // Copy minimal info from an existing instance of this widget to a new instance
@@ -228,16 +258,15 @@ if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {
 
        $id_base = isset($control['id_base']) ? $control['id_base'] : $control['id'];
 
-       // show the widget form
+       // Show the widget form.
        $width = ' style="width:' . max($control['width'], 350) . 'px"';
        $key = isset($_GET['key']) ? (int) $_GET['key'] : 0;
 
-       require_once( './admin-header.php' ); ?>
+       require_once( ABSPATH . 'wp-admin/admin-header.php' ); ?>
        <div class="wrap">
-       <?php screen_icon(); ?>
-       <h2><?php echo esc_html( $title ); ?></h2>
+       <h1><?php echo esc_html( $title ); ?></h1>
        <div class="editwidget"<?php echo $width; ?>>
-       <h3><?php printf( __( 'Widget %s' ), $name ); ?></h3>
+       <h2><?php printf( __( 'Widget %s' ), $name ); ?></h2>
 
        <form action="widgets.php" method="post">
        <div class="widget-inside">
@@ -299,7 +328,7 @@ if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {
        </div>
        </div>
 <?php
-       require_once( './admin-footer.php' );
+       require_once( ABSPATH . 'wp-admin/admin-footer.php' );
        exit;
 }
 
@@ -312,99 +341,170 @@ $errors = array(
        __('Error in displaying the widget settings form.')
 );
 
-require_once( './admin-header.php' ); ?>
+require_once( ABSPATH . 'wp-admin/admin-header.php' ); ?>
 
 <div class="wrap">
-<?php screen_icon(); ?>
-<h2><?php echo esc_html( $title ); ?></h2>
+<h1>
+<?php
+       echo esc_html( $title );
+       if ( current_user_can( 'customize' ) ) {
+               printf(
+                       ' <a class="page-title-action hide-if-no-customize" href="%1$s">%2$s</a>',
+                       esc_url( add_query_arg(
+                               array(
+                                       array( 'autofocus' => array( 'panel' => 'widgets' ) ),
+                                       'return' => urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) )
+                               ),
+                               admin_url( 'customize.php' )
+                       ) ),
+                       __( 'Manage in Customizer' )
+               );
+       }
+?>
+</h1>
 
 <?php if ( isset($_GET['message']) && isset($messages[$_GET['message']]) ) { ?>
-<div id="message" class="updated"><p><?php echo $messages[$_GET['message']]; ?></p></div>
+<div id="message" class="updated notice is-dismissible"><p><?php echo $messages[$_GET['message']]; ?></p></div>
 <?php } ?>
 <?php if ( isset($_GET['error']) && isset($errors[$_GET['error']]) ) { ?>
 <div id="message" class="error"><p><?php echo $errors[$_GET['error']]; ?></p></div>
 <?php } ?>
 
-<?php do_action( 'widgets_admin_page' ); ?>
+<?php
+/**
+ * Fires before the Widgets administration page content loads.
+ *
+ * @since 3.0.0
+ */
+do_action( 'widgets_admin_page' ); ?>
 
 <div class="widget-liquid-left">
 <div id="widgets-left">
        <div id="available-widgets" class="widgets-holder-wrap">
                <div class="sidebar-name">
-               <div class="sidebar-name-arrow"><br /></div>
-               <h3><?php _e('Available Widgets'); ?> <span id="removing-widget"><?php _ex('Deactivate', 'removing-widget'); ?> <span></span></span></h3></div>
-               <div class="widget-holder">
-               <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>
-               <div id="widget-list">
-               <?php wp_list_widgets(); ?>
+                       <div class="sidebar-name-arrow"><br /></div>
+                       <h2><?php _e( 'Available Widgets' ); ?> <span id="removing-widget"><?php _ex( 'Deactivate', 'removing-widget' ); ?> <span></span></span></h2>
                </div>
-               <br class='clear' />
+               <div class="widget-holder">
+                       <div class="sidebar-description">
+                               <p class="description"><?php _e('To activate a widget drag it to a sidebar or click on it. To deactivate a widget and delete its settings, drag it back.'); ?></p>
+                       </div>
+                       <div id="widget-list">
+                               <?php wp_list_widgets(); ?>
+                       </div>
+                       <br class='clear' />
                </div>
                <br class="clear" />
        </div>
 
 <?php
+
+$theme_sidebars = array();
 foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
        if ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) {
                $wrap_class = 'widgets-holder-wrap';
                if ( !empty( $registered_sidebar['class'] ) )
                        $wrap_class .= ' ' . $registered_sidebar['class'];
 
-?>
-
+               ?>
                <div class="<?php echo esc_attr( $wrap_class ); ?>">
-                       <div class="sidebar-name">
-                               <div class="sidebar-name-arrow"><br /></div>
-                               <h3><?php echo esc_html( $registered_sidebar['name'] ); ?>
-                                       <span><img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" class="ajax-feedback" title="" alt="" /></span>
-                               </h3>
-                       </div>
                        <div class="widget-holder inactive">
-                               <?php wp_list_widget_controls( $registered_sidebar['id'] ); ?>
-                               <br class="clear" />
+                               <?php wp_list_widget_controls( $registered_sidebar['id'], $registered_sidebar['name'] ); ?>
+                               <div class="remove-inactive-widgets">
+                                       <form action="" method="post">
+                                               <p>
+                                                       <?php
+                                                       $attributes = array( 'id' => 'inactive-widgets-control-remove' );
+
+                                                       if ( empty($sidebars_widgets['wp_inactive_widgets']) ) {
+                                                               $attributes['disabled'] = '';
+                                                       }
+
+                                                       submit_button( __( 'Clear Inactive Widgets' ), 'delete', 'removeinactivewidgets', false, $attributes );
+                                                       ?>
+                                                       <span class="spinner">
+                                               </p>
+                                               <?php wp_nonce_field( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' ); ?>
+                                       </form>
+                               </div>
                        </div>
+                       <p class="description"><?php _e( 'This will clear all items from the inactive widgets list. You will not be able to restore any customizations.' ); ?></p>
                </div>
-<?php
+               <?php
+
+       } else {
+               $theme_sidebars[$sidebar] = $registered_sidebar;
        }
 }
-?>
 
+?>
 </div>
 </div>
+<?php
+
+$i = $split = 0;
+$single_sidebar_class = '';
+$sidebars_count = count( $theme_sidebars );
 
+if ( $sidebars_count > 1 ) {
+       $split = ceil( $sidebars_count / 2 );
+} else {
+       $single_sidebar_class = ' class="single-sidebar"';
+}
+
+?>
 <div class="widget-liquid-right">
-<div id="widgets-right">
+<div id="widgets-right"<?php echo $single_sidebar_class; ?>>
+<div class="sidebars-column-1">
 <?php
-$i = 0;
-foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
-       if ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) )
-               continue;
 
+foreach ( $theme_sidebars as $sidebar => $registered_sidebar ) {
        $wrap_class = 'widgets-holder-wrap';
        if ( !empty( $registered_sidebar['class'] ) )
                $wrap_class .= ' sidebar-' . $registered_sidebar['class'];
 
-       if ( $i )
-               $wrap_class .= ' closed'; ?>
+       if ( $i > 0 )
+               $wrap_class .= ' closed';
+
+       if ( $split && $i == $split ) {
+               ?>
+               </div><div class="sidebars-column-2">
+               <?php
+       }
 
+       ?>
        <div class="<?php echo esc_attr( $wrap_class ); ?>">
-       <div class="sidebar-name">
-       <div class="sidebar-name-arrow"><br /></div>
-       <h3><?php echo esc_html( $registered_sidebar['name'] ); ?>
-       <span><img src="<?php echo esc_url( admin_url( 'images/wpspin_dark.gif' ) ); ?>" class="ajax-feedback" title="" alt="" /></span></h3></div>
-       <?php wp_list_widget_controls( $sidebar ); // Show the control forms for each of the widgets in this sidebar ?>
+               <?php wp_list_widget_controls( $sidebar, $registered_sidebar['name'] ); // Show the control forms for each of the widgets in this sidebar ?>
        </div>
-<?php
+       <?php
+
        $i++;
-} ?>
+}
+
+?>
 </div>
 </div>
-<form action="" method="post">
+</div>
+<form method="post">
 <?php wp_nonce_field( 'save-sidebar-widgets', '_wpnonce_widgets', false ); ?>
 </form>
 <br class="clear" />
 </div>
 
+<div class="widgets-chooser">
+       <ul class="widgets-chooser-sidebars"></ul>
+       <div class="widgets-chooser-actions">
+               <button class="button-secondary"><?php _e( 'Cancel' ); ?></button>
+               <button class="button-primary"><?php _e( 'Add Widget' ); ?></button>
+       </div>
+</div>
+
 <?php
+
+/**
+ * Fires after the available widgets and sidebars have loaded, before the admin footer.
+ *
+ * @since 2.2.0
+ */
 do_action( 'sidebar_admin_page' );
-require_once( './admin-footer.php' );
+require_once( ABSPATH . 'wp-admin/admin-footer.php' );