wp/wp-admin/widgets.php
changeset 9 177826044cd9
parent 7 cf61fcea0001
child 16 a86126ab1dd4
equal deleted inserted replaced
8:c7c34916027a 9:177826044cd9
     8 
     8 
     9 /** WordPress Administration Bootstrap */
     9 /** WordPress Administration Bootstrap */
    10 require_once( dirname( __FILE__ ) . '/admin.php' );
    10 require_once( dirname( __FILE__ ) . '/admin.php' );
    11 
    11 
    12 /** WordPress Administration Widgets API */
    12 /** WordPress Administration Widgets API */
    13 require_once(ABSPATH . 'wp-admin/includes/widgets.php');
    13 require_once( ABSPATH . 'wp-admin/includes/widgets.php' );
    14 
    14 
    15 if ( ! current_user_can( 'edit_theme_options' ) ) {
    15 if ( ! current_user_can( 'edit_theme_options' ) ) {
    16 	wp_die(
    16 	wp_die(
    17 		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
    17 		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
    18 		'<p>' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '</p>',
    18 		'<p>' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '</p>',
    19 		403
    19 		403
    20 	);
    20 	);
    21 }
    21 }
    22 
    22 
    23 $widgets_access = get_user_setting( 'widgets_access' );
    23 $widgets_access = get_user_setting( 'widgets_access' );
    24 if ( isset($_GET['widgets-access']) ) {
    24 if ( isset( $_GET['widgets-access'] ) ) {
    25 	check_admin_referer( 'widgets-access' );
    25 	check_admin_referer( 'widgets-access' );
    26 
    26 
    27 	$widgets_access = 'on' == $_GET['widgets-access'] ? 'on' : 'off';
    27 	$widgets_access = 'on' == $_GET['widgets-access'] ? 'on' : 'off';
    28 	set_user_setting( 'widgets_access', $widgets_access );
    28 	set_user_setting( 'widgets_access', $widgets_access );
    29 }
    29 }
    30 
    30 
    31 if ( 'on' == $widgets_access ) {
    31 if ( 'on' == $widgets_access ) {
    32 	add_filter( 'admin_body_class', 'wp_widgets_access_body_class' );
    32 	add_filter( 'admin_body_class', 'wp_widgets_access_body_class' );
    33 } else {
    33 } else {
    34 	wp_enqueue_script('admin-widgets');
    34 	wp_enqueue_script( 'admin-widgets' );
    35 
    35 
    36 	if ( wp_is_mobile() )
    36 	if ( wp_is_mobile() ) {
    37 		wp_enqueue_script( 'jquery-touch-punch' );
    37 		wp_enqueue_script( 'jquery-touch-punch' );
       
    38 	}
    38 }
    39 }
    39 
    40 
    40 /**
    41 /**
    41  * Fires early before the Widgets administration screen loads,
    42  * Fires early before the Widgets administration screen loads,
    42  * after scripts are enqueued.
    43  * after scripts are enqueued.
    43  *
    44  *
    44  * @since 2.2.0
    45  * @since 2.2.0
    45  */
    46  */
    46 do_action( 'sidebar_admin_setup' );
    47 do_action( 'sidebar_admin_setup' );
    47 
    48 
    48 $title = __( 'Widgets' );
    49 $title       = __( 'Widgets' );
    49 $parent_file = 'themes.php';
    50 $parent_file = 'themes.php';
    50 
    51 
    51 get_current_screen()->add_help_tab( array(
    52 get_current_screen()->add_help_tab(
    52 'id'		=> 'overview',
    53 	array(
    53 'title'		=> __('Overview'),
    54 		'id'      => 'overview',
    54 'content'	=>
    55 		'title'   => __( 'Overview' ),
    55 	'<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>
    56 		'content' =>
    56 	<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>'
    57 				 '<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>
    57 ) );
    58 	<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>',
    58 get_current_screen()->add_help_tab( array(
    59 	)
    59 'id'		=> 'removing-reusing',
    60 );
    60 'title'		=> __('Removing and Reusing'),
    61 get_current_screen()->add_help_tab(
    61 'content'	=>
    62 	array(
    62 	'<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>
    63 		'id'      => 'removing-reusing',
    63 	<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>
    64 		'title'   => __( 'Removing and Reusing' ),
    64 	<p>' . __('Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop.') . '</p>'
    65 		'content' =>
    65 ) );
    66 				 '<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>
    66 get_current_screen()->add_help_tab( array(
    67 	<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>
    67 'id'		=> 'missing-widgets',
    68 	<p>' . __( 'Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop.' ) . '</p>',
    68 'title'		=> __('Missing Widgets'),
    69 	)
    69 'content'	=>
    70 );
    70 	'<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>' .
    71 get_current_screen()->add_help_tab(
    71 		'<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>'
    72 	array(
    72 ) );
    73 		'id'      => 'missing-widgets',
       
    74 		'title'   => __( 'Missing Widgets' ),
       
    75 		'content' =>
       
    76 				 '<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>' .
       
    77 					 '<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>',
       
    78 	)
       
    79 );
    73 
    80 
    74 get_current_screen()->set_help_sidebar(
    81 get_current_screen()->set_help_sidebar(
    75 	'<p><strong>' . __('For more information:') . '</strong></p>' .
    82 	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
    76 	'<p>' . __('<a href="https://codex.wordpress.org/Appearance_Widgets_Screen">Documentation on Widgets</a>') . '</p>' .
    83 	'<p>' . __( '<a href="https://codex.wordpress.org/Appearance_Widgets_Screen">Documentation on Widgets</a>' ) . '</p>' .
    77 	'<p>' . __('<a href="https://wordpress.org/support/">Support Forums</a>') . '</p>'
    84 	'<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>'
    78 );
    85 );
    79 
    86 
    80 if ( ! current_theme_supports( 'widgets' ) ) {
    87 if ( ! current_theme_supports( 'widgets' ) ) {
    81 	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>.' ) );
    88 	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>.' ) );
    82 }
    89 }
    83 
    90 
    84 // These are the widgets grouped by sidebar
    91 // These are the widgets grouped by sidebar
    85 $sidebars_widgets = wp_get_sidebars_widgets();
    92 $sidebars_widgets = wp_get_sidebars_widgets();
    86 
    93 
    87 if ( empty( $sidebars_widgets ) )
    94 if ( empty( $sidebars_widgets ) ) {
    88 	$sidebars_widgets = wp_get_widget_defaults();
    95 	$sidebars_widgets = wp_get_widget_defaults();
       
    96 }
    89 
    97 
    90 foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
    98 foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
    91 	if ( 'wp_inactive_widgets' == $sidebar_id )
    99 	if ( 'wp_inactive_widgets' == $sidebar_id ) {
    92 		continue;
   100 		continue;
       
   101 	}
    93 
   102 
    94 	if ( ! is_registered_sidebar( $sidebar_id ) ) {
   103 	if ( ! is_registered_sidebar( $sidebar_id ) ) {
    95 		if ( ! empty( $widgets ) ) { // register the inactive_widgets area as sidebar
   104 		if ( ! empty( $widgets ) ) { // register the inactive_widgets area as sidebar
    96 			register_sidebar(array(
   105 			register_sidebar(
    97 				'name' => __( 'Inactive Sidebar (not used)' ),
   106 				array(
    98 				'id' => $sidebar_id,
   107 					'name'          => __( 'Inactive Sidebar (not used)' ),
    99 				'class' => 'inactive-sidebar orphan-sidebar',
   108 					'id'            => $sidebar_id,
   100 				'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.' ),
   109 					'class'         => 'inactive-sidebar orphan-sidebar',
   101 				'before_widget' => '',
   110 					'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.' ),
   102 				'after_widget' => '',
   111 					'before_widget' => '',
   103 				'before_title' => '',
   112 					'after_widget'  => '',
   104 				'after_title' => '',
   113 					'before_title'  => '',
   105 			));
   114 					'after_title'   => '',
       
   115 				)
       
   116 			);
   106 		} else {
   117 		} else {
   107 			unset( $sidebars_widgets[ $sidebar_id ] );
   118 			unset( $sidebars_widgets[ $sidebar_id ] );
   108 		}
   119 		}
   109 	}
   120 	}
   110 }
   121 }
   111 
   122 
   112 // register the inactive_widgets area as sidebar
   123 // register the inactive_widgets area as sidebar
   113 register_sidebar(array(
   124 register_sidebar(
   114 	'name' => __('Inactive Widgets'),
   125 	array(
   115 	'id' => 'wp_inactive_widgets',
   126 		'name'          => __( 'Inactive Widgets' ),
   116 	'class' => 'inactive-sidebar',
   127 		'id'            => 'wp_inactive_widgets',
   117 	'description' => __( 'Drag widgets here to remove them from the sidebar but keep their settings.' ),
   128 		'class'         => 'inactive-sidebar',
   118 	'before_widget' => '',
   129 		'description'   => __( 'Drag widgets here to remove them from the sidebar but keep their settings.' ),
   119 	'after_widget' => '',
   130 		'before_widget' => '',
   120 	'before_title' => '',
   131 		'after_widget'  => '',
   121 	'after_title' => '',
   132 		'before_title'  => '',
   122 ));
   133 		'after_title'   => '',
       
   134 	)
       
   135 );
   123 
   136 
   124 retrieve_widgets();
   137 retrieve_widgets();
   125 
   138 
   126 // We're saving a widget without js
   139 // We're saving a widget without js
   127 if ( isset($_POST['savewidget']) || isset($_POST['removewidget']) ) {
   140 if ( isset( $_POST['savewidget'] ) || isset( $_POST['removewidget'] ) ) {
   128 	$widget_id = $_POST['widget-id'];
   141 	$widget_id = $_POST['widget-id'];
   129 	check_admin_referer("save-delete-widget-$widget_id");
   142 	check_admin_referer( "save-delete-widget-$widget_id" );
   130 
   143 
   131 	$number = isset($_POST['multi_number']) ? (int) $_POST['multi_number'] : '';
   144 	$number = isset( $_POST['multi_number'] ) ? (int) $_POST['multi_number'] : '';
   132 	if ( $number ) {
   145 	if ( $number ) {
   133 		foreach ( $_POST as $key => $val ) {
   146 		foreach ( $_POST as $key => $val ) {
   134 			if ( is_array($val) && preg_match('/__i__|%i%/', key($val)) ) {
   147 			if ( is_array( $val ) && preg_match( '/__i__|%i%/', key( $val ) ) ) {
   135 				$_POST[$key] = array( $number => array_shift($val) );
   148 				$_POST[ $key ] = array( $number => array_shift( $val ) );
   136 				break;
   149 				break;
   137 			}
   150 			}
   138 		}
   151 		}
   139 	}
   152 	}
   140 
   153 
   141 	$sidebar_id = $_POST['sidebar'];
   154 	$sidebar_id = $_POST['sidebar'];
   142 	$position = isset($_POST[$sidebar_id . '_position']) ? (int) $_POST[$sidebar_id . '_position'] - 1 : 0;
   155 	$position   = isset( $_POST[ $sidebar_id . '_position' ] ) ? (int) $_POST[ $sidebar_id . '_position' ] - 1 : 0;
   143 
   156 
   144 	$id_base = $_POST['id_base'];
   157 	$id_base = $_POST['id_base'];
   145 	$sidebar = isset($sidebars_widgets[$sidebar_id]) ? $sidebars_widgets[$sidebar_id] : array();
   158 	$sidebar = isset( $sidebars_widgets[ $sidebar_id ] ) ? $sidebars_widgets[ $sidebar_id ] : array();
   146 
   159 
   147 	// Delete.
   160 	// Delete.
   148 	if ( isset($_POST['removewidget']) && $_POST['removewidget'] ) {
   161 	if ( isset( $_POST['removewidget'] ) && $_POST['removewidget'] ) {
   149 
   162 
   150 		if ( !in_array($widget_id, $sidebar, true) ) {
   163 		if ( ! in_array( $widget_id, $sidebar, true ) ) {
   151 			wp_redirect( admin_url('widgets.php?error=0') );
   164 			wp_redirect( admin_url( 'widgets.php?error=0' ) );
   152 			exit;
   165 			exit;
   153 		}
   166 		}
   154 
   167 
   155 		$sidebar = array_diff( $sidebar, array($widget_id) );
   168 		$sidebar = array_diff( $sidebar, array( $widget_id ) );
   156 		$_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1');
   169 		$_POST   = array(
       
   170 			'sidebar'            => $sidebar_id,
       
   171 			'widget-' . $id_base => array(),
       
   172 			'the-widget-id'      => $widget_id,
       
   173 			'delete_widget'      => '1',
       
   174 		);
   157 
   175 
   158 		/**
   176 		/**
   159 		 * Fires immediately after a widget has been marked for deletion.
   177 		 * Fires immediately after a widget has been marked for deletion.
   160 		 *
   178 		 *
   161 		 * @since 4.4.0
   179 		 * @since 4.4.0
   168 	}
   186 	}
   169 
   187 
   170 	$_POST['widget-id'] = $sidebar;
   188 	$_POST['widget-id'] = $sidebar;
   171 
   189 
   172 	foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
   190 	foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
   173 		if ( $name != $id_base || !is_callable($control['callback']) )
   191 		if ( $name != $id_base || ! is_callable( $control['callback'] ) ) {
   174 			continue;
   192 			continue;
       
   193 		}
   175 
   194 
   176 		ob_start();
   195 		ob_start();
   177 			call_user_func_array( $control['callback'], $control['params'] );
   196 			call_user_func_array( $control['callback'], $control['params'] );
   178 		ob_end_clean();
   197 		ob_end_clean();
   179 
   198 
   180 		break;
   199 		break;
   181 	}
   200 	}
   182 
   201 
   183 	$sidebars_widgets[$sidebar_id] = $sidebar;
   202 	$sidebars_widgets[ $sidebar_id ] = $sidebar;
   184 
   203 
   185 	// Remove old position.
   204 	// Remove old position.
   186 	if ( !isset($_POST['delete_widget']) ) {
   205 	if ( ! isset( $_POST['delete_widget'] ) ) {
   187 		foreach ( $sidebars_widgets as $key => $sb ) {
   206 		foreach ( $sidebars_widgets as $key => $sb ) {
   188 			if ( is_array($sb) )
   207 			if ( is_array( $sb ) ) {
   189 				$sidebars_widgets[$key] = array_diff( $sb, array($widget_id) );
   208 				$sidebars_widgets[ $key ] = array_diff( $sb, array( $widget_id ) );
   190 		}
   209 			}
   191 		array_splice( $sidebars_widgets[$sidebar_id], $position, 0, $widget_id );
   210 		}
   192 	}
   211 		array_splice( $sidebars_widgets[ $sidebar_id ], $position, 0, $widget_id );
   193 
   212 	}
   194 	wp_set_sidebars_widgets($sidebars_widgets);
   213 
   195 	wp_redirect( admin_url('widgets.php?message=0') );
   214 	wp_set_sidebars_widgets( $sidebars_widgets );
       
   215 	wp_redirect( admin_url( 'widgets.php?message=0' ) );
   196 	exit;
   216 	exit;
   197 }
   217 }
   198 
   218 
   199 // Remove inactive widgets without js
   219 // Remove inactive widgets without js
   200 if ( isset( $_POST['removeinactivewidgets'] ) ) {
   220 if ( isset( $_POST['removeinactivewidgets'] ) ) {
   201 	check_admin_referer( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' );
   221 	check_admin_referer( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' );
   202 
   222 
   203 	if ( $_POST['removeinactivewidgets'] ) {
   223 	if ( $_POST['removeinactivewidgets'] ) {
   204 		foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {
   224 		foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {
   205 			$pieces = explode( '-', $widget_id );
   225 			$pieces       = explode( '-', $widget_id );
   206 			$multi_number = array_pop( $pieces );
   226 			$multi_number = array_pop( $pieces );
   207 			$id_base = implode( '-', $pieces );
   227 			$id_base      = implode( '-', $pieces );
   208 			$widget = get_option( 'widget_' . $id_base );
   228 			$widget       = get_option( 'widget_' . $id_base );
   209 			unset( $widget[$multi_number] );
   229 			unset( $widget[ $multi_number ] );
   210 			update_option( 'widget_' . $id_base, $widget );
   230 			update_option( 'widget_' . $id_base, $widget );
   211 			unset( $sidebars_widgets['wp_inactive_widgets'][$key] );
   231 			unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] );
   212 		}
   232 		}
   213 
   233 
   214 		wp_set_sidebars_widgets( $sidebars_widgets );
   234 		wp_set_sidebars_widgets( $sidebars_widgets );
   215 	}
   235 	}
   216 
   236 
   217 	wp_redirect( admin_url( 'widgets.php?message=0' ) );
   237 	wp_redirect( admin_url( 'widgets.php?message=0' ) );
   218 	exit;
   238 	exit;
   219 }
   239 }
   220 
   240 
   221 // Output the widget form without js
   241 // Output the widget form without js
   222 if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {
   242 if ( isset( $_GET['editwidget'] ) && $_GET['editwidget'] ) {
   223 	$widget_id = $_GET['editwidget'];
   243 	$widget_id = $_GET['editwidget'];
   224 
   244 
   225 	if ( isset($_GET['addnew']) ) {
   245 	if ( isset( $_GET['addnew'] ) ) {
   226 		// Default to the first sidebar
   246 		// Default to the first sidebar
   227 		$keys = array_keys( $wp_registered_sidebars );
   247 		$keys    = array_keys( $wp_registered_sidebars );
   228 		$sidebar = reset( $keys );
   248 		$sidebar = reset( $keys );
   229 
   249 
   230 		if ( isset($_GET['base']) && isset($_GET['num']) ) { // multi-widget
   250 		if ( isset( $_GET['base'] ) && isset( $_GET['num'] ) ) { // multi-widget
   231 			// Copy minimal info from an existing instance of this widget to a new instance
   251 			// Copy minimal info from an existing instance of this widget to a new instance
   232 			foreach ( $wp_registered_widget_controls as $control ) {
   252 			foreach ( $wp_registered_widget_controls as $control ) {
   233 				if ( $_GET['base'] === $control['id_base'] ) {
   253 				if ( $_GET['base'] === $control['id_base'] ) {
   234 					$control_callback = $control['callback'];
   254 					$control_callback                                = $control['callback'];
   235 					$multi_number = (int) $_GET['num'];
   255 					$multi_number                                    = (int) $_GET['num'];
   236 					$control['params'][0]['number'] = -1;
   256 					$control['params'][0]['number']                  = -1;
   237 					$widget_id = $control['id'] = $control['id_base'] . '-' . $multi_number;
   257 					$widget_id                                       = $control['id'] = $control['id_base'] . '-' . $multi_number;
   238 					$wp_registered_widget_controls[$control['id']] = $control;
   258 					$wp_registered_widget_controls[ $control['id'] ] = $control;
   239 					break;
   259 					break;
   240 				}
   260 				}
   241 			}
   261 			}
   242 		}
   262 		}
   243 	}
   263 	}
   244 
   264 
   245 	if ( isset($wp_registered_widget_controls[$widget_id]) && !isset($control) ) {
   265 	if ( isset( $wp_registered_widget_controls[ $widget_id ] ) && ! isset( $control ) ) {
   246 		$control = $wp_registered_widget_controls[$widget_id];
   266 		$control          = $wp_registered_widget_controls[ $widget_id ];
   247 		$control_callback = $control['callback'];
   267 		$control_callback = $control['callback'];
   248 	} elseif ( !isset($wp_registered_widget_controls[$widget_id]) && isset($wp_registered_widgets[$widget_id]) ) {
   268 	} elseif ( ! isset( $wp_registered_widget_controls[ $widget_id ] ) && isset( $wp_registered_widgets[ $widget_id ] ) ) {
   249 		$name = esc_html( strip_tags($wp_registered_widgets[$widget_id]['name']) );
   269 		$name = esc_html( strip_tags( $wp_registered_widgets[ $widget_id ]['name'] ) );
   250 	}
   270 	}
   251 
   271 
   252 	if ( !isset($name) )
   272 	if ( ! isset( $name ) ) {
   253 		$name = esc_html( strip_tags($control['name']) );
   273 		$name = esc_html( strip_tags( $control['name'] ) );
   254 
   274 	}
   255 	if ( !isset($sidebar) )
   275 
   256 		$sidebar = isset($_GET['sidebar']) ? $_GET['sidebar'] : 'wp_inactive_widgets';
   276 	if ( ! isset( $sidebar ) ) {
   257 
   277 		$sidebar = isset( $_GET['sidebar'] ) ? $_GET['sidebar'] : 'wp_inactive_widgets';
   258 	if ( !isset($multi_number) )
   278 	}
   259 		$multi_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';
   279 
   260 
   280 	if ( ! isset( $multi_number ) ) {
   261 	$id_base = isset($control['id_base']) ? $control['id_base'] : $control['id'];
   281 		$multi_number = isset( $control['params'][0]['number'] ) ? $control['params'][0]['number'] : '';
       
   282 	}
       
   283 
       
   284 	$id_base = isset( $control['id_base'] ) ? $control['id_base'] : $control['id'];
   262 
   285 
   263 	// Show the widget form.
   286 	// Show the widget form.
   264 	$width = ' style="width:' . max($control['width'], 350) . 'px"';
   287 	$width = ' style="width:' . max( $control['width'], 350 ) . 'px"';
   265 	$key = isset($_GET['key']) ? (int) $_GET['key'] : 0;
   288 	$key   = isset( $_GET['key'] ) ? (int) $_GET['key'] : 0;
   266 
   289 
   267 	require_once( ABSPATH . 'wp-admin/admin-header.php' ); ?>
   290 	require_once( ABSPATH . 'wp-admin/admin-header.php' ); ?>
   268 	<div class="wrap">
   291 	<div class="wrap">
   269 	<h1><?php echo esc_html( $title ); ?></h1>
   292 	<h1><?php echo esc_html( $title ); ?></h1>
   270 	<div class="editwidget"<?php echo $width; ?>>
   293 	<div class="editwidget"<?php echo $width; ?>>
   271 	<h2><?php printf( __( 'Widget %s' ), $name ); ?></h2>
   294 	<h2><?php printf( __( 'Widget %s' ), $name ); ?></h2>
   272 
   295 
   273 	<form action="widgets.php" method="post">
   296 	<form action="widgets.php" method="post">
   274 	<div class="widget-inside">
   297 	<div class="widget-inside">
   275 <?php
   298 	<?php
   276 	if ( is_callable( $control_callback ) )
   299 	if ( is_callable( $control_callback ) ) {
   277 		call_user_func_array( $control_callback, $control['params'] );
   300 		call_user_func_array( $control_callback, $control['params'] );
   278 	else
   301 	} else {
   279 		echo '<p>' . __('There are no options for this widget.') . "</p>\n"; ?>
   302 		echo '<p>' . __( 'There are no options for this widget.' ) . "</p>\n";
   280 	</div>
   303 	}
   281 
   304 	?>
   282 	<p class="describe"><?php _e('Select both the sidebar for this widget and the position of the widget in that sidebar.'); ?></p>
   305 	</div>
       
   306 
       
   307 	<p class="describe"><?php _e( 'Select both the sidebar for this widget and the position of the widget in that sidebar.' ); ?></p>
   283 	<div class="widget-position">
   308 	<div class="widget-position">
   284 	<table class="widefat"><thead><tr><th><?php _e('Sidebar'); ?></th><th><?php _e('Position'); ?></th></tr></thead><tbody>
   309 	<table class="widefat"><thead><tr><th><?php _e( 'Sidebar' ); ?></th><th><?php _e( 'Position' ); ?></th></tr></thead><tbody>
   285 <?php
   310 	<?php
   286 	foreach ( $wp_registered_sidebars as $sbname => $sbvalue ) {
   311 	foreach ( $wp_registered_sidebars as $sbname => $sbvalue ) {
   287 		echo "\t\t<tr><td><label><input type='radio' name='sidebar' value='" . esc_attr($sbname) . "'" . checked( $sbname, $sidebar, false ) . " /> $sbvalue[name]</label></td><td>";
   312 		echo "\t\t<tr><td><label><input type='radio' name='sidebar' value='" . esc_attr( $sbname ) . "'" . checked( $sbname, $sidebar, false ) . " /> $sbvalue[name]</label></td><td>";
   288 		if ( 'wp_inactive_widgets' == $sbname || 'orphaned_widgets' == substr( $sbname, 0, 16 ) ) {
   313 		if ( 'wp_inactive_widgets' == $sbname || 'orphaned_widgets' == substr( $sbname, 0, 16 ) ) {
   289 			echo '&nbsp;';
   314 			echo '&nbsp;';
   290 		} else {
   315 		} else {
   291 			if ( !isset($sidebars_widgets[$sbname]) || !is_array($sidebars_widgets[$sbname]) ) {
   316 			if ( ! isset( $sidebars_widgets[ $sbname ] ) || ! is_array( $sidebars_widgets[ $sbname ] ) ) {
   292 				$j = 1;
   317 				$j                           = 1;
   293 				$sidebars_widgets[$sbname] = array();
   318 				$sidebars_widgets[ $sbname ] = array();
   294 			} else {
   319 			} else {
   295 				$j = count($sidebars_widgets[$sbname]);
   320 				$j = count( $sidebars_widgets[ $sbname ] );
   296 				if ( isset($_GET['addnew']) || !in_array($widget_id, $sidebars_widgets[$sbname], true) )
   321 				if ( isset( $_GET['addnew'] ) || ! in_array( $widget_id, $sidebars_widgets[ $sbname ], true ) ) {
   297 					$j++;
   322 					$j++;
       
   323 				}
   298 			}
   324 			}
   299 			$selected = '';
   325 			$selected = '';
   300 			echo "\t\t<select name='{$sbname}_position'>\n";
   326 			echo "\t\t<select name='{$sbname}_position'>\n";
   301 			echo "\t\t<option value=''>" . __('&mdash; Select &mdash;') . "</option>\n";
   327 			echo "\t\t<option value=''>" . __( '&mdash; Select &mdash;' ) . "</option>\n";
   302 			for ( $i = 1; $i <= $j; $i++ ) {
   328 			for ( $i = 1; $i <= $j; $i++ ) {
   303 				if ( in_array($widget_id, $sidebars_widgets[$sbname], true) )
   329 				if ( in_array( $widget_id, $sidebars_widgets[ $sbname ], true ) ) {
   304 					$selected = selected( $i, $key + 1, false );
   330 					$selected = selected( $i, $key + 1, false );
       
   331 				}
   305 				echo "\t\t<option value='$i'$selected> $i </option>\n";
   332 				echo "\t\t<option value='$i'$selected> $i </option>\n";
   306 			}
   333 			}
   307 			echo "\t\t</select>\n";
   334 			echo "\t\t</select>\n";
   308 		}
   335 		}
   309 		echo "</td></tr>\n";
   336 		echo "</td></tr>\n";
   310 	} ?>
   337 	}
       
   338 	?>
   311 	</tbody></table>
   339 	</tbody></table>
   312 	</div>
   340 	</div>
   313 
   341 
   314 	<div class="widget-control-actions">
   342 	<div class="widget-control-actions">
   315 <?php
   343 	<?php
   316 	if ( isset($_GET['addnew']) ) { ?>
   344 	if ( isset( $_GET['addnew'] ) ) {
   317 	<a href="widgets.php" class="button alignleft"><?php _e('Cancel'); ?></a>
   345 		?>
   318 <?php
   346 	<a href="widgets.php" class="button alignleft"><?php _e( 'Cancel' ); ?></a>
       
   347 		<?php
   319 	} else {
   348 	} else {
   320 		submit_button( __( 'Delete' ), 'alignleft', 'removewidget', false );
   349 		submit_button( __( 'Delete' ), 'alignleft', 'removewidget', false );
   321 	}
   350 	}
   322 	submit_button( __( 'Save Widget' ), 'primary alignright', 'savewidget', false ); ?>
   351 	submit_button( __( 'Save Widget' ), 'primary alignright', 'savewidget', false );
   323 	<input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr($widget_id); ?>" />
   352 	?>
   324 	<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr($id_base); ?>" />
   353 	<input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr( $widget_id ); ?>" />
   325 	<input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr($multi_number); ?>" />
   354 	<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr( $id_base ); ?>" />
   326 <?php	wp_nonce_field("save-delete-widget-$widget_id"); ?>
   355 	<input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr( $multi_number ); ?>" />
       
   356 	<?php	wp_nonce_field( "save-delete-widget-$widget_id" ); ?>
   327 	<br class="clear" />
   357 	<br class="clear" />
   328 	</div>
   358 	</div>
   329 	</form>
   359 	</form>
   330 	</div>
   360 	</div>
   331 	</div>
   361 	</div>
   332 <?php
   362 	<?php
   333 	require_once( ABSPATH . 'wp-admin/admin-footer.php' );
   363 	require_once( ABSPATH . 'wp-admin/admin-footer.php' );
   334 	exit;
   364 	exit;
   335 }
   365 }
   336 
   366 
   337 $messages = array(
   367 $messages = array(
   338 	__('Changes saved.')
   368 	__( 'Changes saved.' ),
   339 );
   369 );
   340 
   370 
   341 $errors = array(
   371 $errors = array(
   342 	__('Error while saving.'),
   372 	__( 'Error while saving.' ),
   343 	__('Error in displaying the widget settings form.')
   373 	__( 'Error in displaying the widget settings form.' ),
   344 );
   374 );
   345 
   375 
   346 require_once( ABSPATH . 'wp-admin/admin-header.php' ); ?>
   376 require_once( ABSPATH . 'wp-admin/admin-header.php' );
       
   377 ?>
   347 
   378 
   348 <div class="wrap">
   379 <div class="wrap">
   349 <h1 class="wp-heading-inline"><?php
   380 <h1 class="wp-heading-inline">
       
   381 <?php
   350 echo esc_html( $title );
   382 echo esc_html( $title );
   351 ?></h1>
   383 ?>
       
   384 </h1>
   352 
   385 
   353 <?php
   386 <?php
   354 if ( current_user_can( 'customize' ) ) {
   387 if ( current_user_can( 'customize' ) ) {
   355 	printf(
   388 	printf(
   356 		' <a class="page-title-action hide-if-no-customize" href="%1$s">%2$s</a>',
   389 		' <a class="page-title-action hide-if-no-customize" href="%1$s">%2$s</a>',
   357 		esc_url( add_query_arg(
   390 		esc_url(
   358 			array(
   391 			add_query_arg(
   359 				array( 'autofocus' => array( 'panel' => 'widgets' ) ),
   392 				array(
   360 				'return' => urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) )
   393 					array( 'autofocus' => array( 'panel' => 'widgets' ) ),
   361 			),
   394 					'return' => urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ),
   362 			admin_url( 'customize.php' )
   395 				),
   363 		) ),
   396 				admin_url( 'customize.php' )
       
   397 			)
       
   398 		),
   364 		__( 'Manage with Live Preview' )
   399 		__( 'Manage with Live Preview' )
   365 	);
   400 	);
   366 }
   401 }
   367 ?>
   402 
       
   403 $nonce = wp_create_nonce( 'widgets-access' );
       
   404 ?>
       
   405 <div class="widget-access-link">
       
   406 	<a id="access-on" href="widgets.php?widgets-access=on&_wpnonce=<?php echo urlencode( $nonce ); ?>"><?php _e( 'Enable accessibility mode' ); ?></a><a id="access-off" href="widgets.php?widgets-access=off&_wpnonce=<?php echo urlencode( $nonce ); ?>"><?php _e( 'Disable accessibility mode' ); ?></a>
       
   407 </div>
   368 
   408 
   369 <hr class="wp-header-end">
   409 <hr class="wp-header-end">
   370 
   410 
   371 <?php if ( isset($_GET['message']) && isset($messages[$_GET['message']]) ) { ?>
   411 <?php if ( isset( $_GET['message'] ) && isset( $messages[ $_GET['message'] ] ) ) { ?>
   372 <div id="message" class="updated notice is-dismissible"><p><?php echo $messages[$_GET['message']]; ?></p></div>
   412 <div id="message" class="updated notice is-dismissible"><p><?php echo $messages[ $_GET['message'] ]; ?></p></div>
   373 <?php } ?>
   413 <?php } ?>
   374 <?php if ( isset($_GET['error']) && isset($errors[$_GET['error']]) ) { ?>
   414 <?php if ( isset( $_GET['error'] ) && isset( $errors[ $_GET['error'] ] ) ) { ?>
   375 <div id="message" class="error"><p><?php echo $errors[$_GET['error']]; ?></p></div>
   415 <div id="message" class="error"><p><?php echo $errors[ $_GET['error'] ]; ?></p></div>
   376 <?php } ?>
   416 <?php } ?>
   377 
   417 
   378 <?php
   418 <?php
   379 /**
   419 /**
   380  * Fires before the Widgets administration page content loads.
   420  * Fires before the Widgets administration page content loads.
   381  *
   421  *
   382  * @since 3.0.0
   422  * @since 3.0.0
   383  */
   423  */
   384 do_action( 'widgets_admin_page' ); ?>
   424 do_action( 'widgets_admin_page' );
       
   425 ?>
   385 
   426 
   386 <div class="widget-liquid-left">
   427 <div class="widget-liquid-left">
   387 <div id="widgets-left">
   428 <div id="widgets-left">
   388 	<div id="available-widgets" class="widgets-holder-wrap">
   429 	<div id="available-widgets" class="widgets-holder-wrap">
   389 		<div class="sidebar-name">
   430 		<div class="sidebar-name">
   393 			</button>
   434 			</button>
   394 			<h2><?php _e( 'Available Widgets' ); ?> <span id="removing-widget"><?php _ex( 'Deactivate', 'removing-widget' ); ?> <span></span></span></h2>
   435 			<h2><?php _e( 'Available Widgets' ); ?> <span id="removing-widget"><?php _ex( 'Deactivate', 'removing-widget' ); ?> <span></span></span></h2>
   395 		</div>
   436 		</div>
   396 		<div class="widget-holder">
   437 		<div class="widget-holder">
   397 			<div class="sidebar-description">
   438 			<div class="sidebar-description">
   398 				<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>
   439 				<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>
   399 			</div>
   440 			</div>
   400 			<div id="widget-list">
   441 			<div id="widget-list">
   401 				<?php wp_list_widgets(); ?>
   442 				<?php wp_list_widgets(); ?>
   402 			</div>
   443 			</div>
   403 			<br class='clear' />
   444 			<br class='clear' />
   409 
   450 
   410 $theme_sidebars = array();
   451 $theme_sidebars = array();
   411 foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
   452 foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
   412 	if ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) {
   453 	if ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) {
   413 		$wrap_class = 'widgets-holder-wrap';
   454 		$wrap_class = 'widgets-holder-wrap';
   414 		if ( !empty( $registered_sidebar['class'] ) )
   455 		if ( ! empty( $registered_sidebar['class'] ) ) {
   415 			$wrap_class .= ' ' . $registered_sidebar['class'];
   456 			$wrap_class .= ' ' . $registered_sidebar['class'];
       
   457 		}
   416 
   458 
   417 		$is_inactive_widgets = 'wp_inactive_widgets' == $registered_sidebar['id'];
   459 		$is_inactive_widgets = 'wp_inactive_widgets' == $registered_sidebar['id'];
   418 		?>
   460 		?>
   419 		<div class="<?php echo esc_attr( $wrap_class ); ?>">
   461 		<div class="<?php echo esc_attr( $wrap_class ); ?>">
   420 			<div class="widget-holder inactive">
   462 			<div class="widget-holder inactive">
   425 					<form action="" method="post">
   467 					<form action="" method="post">
   426 						<p>
   468 						<p>
   427 							<?php
   469 							<?php
   428 							$attributes = array( 'id' => 'inactive-widgets-control-remove' );
   470 							$attributes = array( 'id' => 'inactive-widgets-control-remove' );
   429 
   471 
   430 							if ( empty($sidebars_widgets['wp_inactive_widgets']) ) {
   472 							if ( empty( $sidebars_widgets['wp_inactive_widgets'] ) ) {
   431 								$attributes['disabled'] = '';
   473 								$attributes['disabled'] = '';
   432 							}
   474 							}
   433 
   475 
   434 							submit_button( __( 'Clear Inactive Widgets' ), 'delete', 'removeinactivewidgets', false, $attributes );
   476 							submit_button( __( 'Clear Inactive Widgets' ), 'delete', 'removeinactivewidgets', false, $attributes );
   435 							?>
   477 							?>
   445 			<?php } ?>
   487 			<?php } ?>
   446 		</div>
   488 		</div>
   447 		<?php
   489 		<?php
   448 
   490 
   449 	} else {
   491 	} else {
   450 		$theme_sidebars[$sidebar] = $registered_sidebar;
   492 		$theme_sidebars[ $sidebar ] = $registered_sidebar;
   451 	}
   493 	}
   452 }
   494 }
   453 
   495 
   454 ?>
   496 ?>
   455 </div>
   497 </div>
   456 </div>
   498 </div>
   457 <?php
   499 <?php
   458 
   500 
   459 $i = $split = 0;
   501 $i                    = $split = 0;
   460 $single_sidebar_class = '';
   502 $single_sidebar_class = '';
   461 $sidebars_count = count( $theme_sidebars );
   503 $sidebars_count       = count( $theme_sidebars );
   462 
   504 
   463 if ( $sidebars_count > 1 ) {
   505 if ( $sidebars_count > 1 ) {
   464 	$split = ceil( $sidebars_count / 2 );
   506 	$split = ceil( $sidebars_count / 2 );
   465 } else {
   507 } else {
   466 	$single_sidebar_class = ' single-sidebar';
   508 	$single_sidebar_class = ' single-sidebar';
   472 <div class="sidebars-column-1">
   514 <div class="sidebars-column-1">
   473 <?php
   515 <?php
   474 
   516 
   475 foreach ( $theme_sidebars as $sidebar => $registered_sidebar ) {
   517 foreach ( $theme_sidebars as $sidebar => $registered_sidebar ) {
   476 	$wrap_class = 'widgets-holder-wrap';
   518 	$wrap_class = 'widgets-holder-wrap';
   477 	if ( !empty( $registered_sidebar['class'] ) )
   519 	if ( ! empty( $registered_sidebar['class'] ) ) {
   478 		$wrap_class .= ' sidebar-' . $registered_sidebar['class'];
   520 		$wrap_class .= ' sidebar-' . $registered_sidebar['class'];
   479 
   521 	}
   480 	if ( $i > 0 )
   522 
       
   523 	if ( $i > 0 ) {
   481 		$wrap_class .= ' closed';
   524 		$wrap_class .= ' closed';
       
   525 	}
   482 
   526 
   483 	if ( $split && $i == $split ) {
   527 	if ( $split && $i == $split ) {
   484 		?>
   528 		?>
   485 		</div><div class="sidebars-column-2">
   529 		</div><div class="sidebars-column-2">
   486 		<?php
   530 		<?php