46
47
do_action( 'sidebar_admin_setup' );
48
$title = __( 'Widgets' );
49
$title = __( 'Widgets' );
49
50
$parent_file = 'themes.php';
51
get_current_screen()->add_help_tab( array(
53
'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
<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
'id' => 'removing-reusing',
60
'title' => __('Removing and Reusing'),
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
<p>' . __('Widgets may be used multiple times. You can give each widget a title, to display on your site, but it’s not required.') . '</p>
64
<p>' . __('Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop.') . '</p>'
66
get_current_screen()->add_help_tab( array(
67
'id' => 'missing-widgets',
68
'title' => __('Missing Widgets'),
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
'<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>'
52
get_current_screen()->add_help_tab(
55
'title' => __( 'Overview' ),
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>
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>',
61
get_current_screen()->add_help_tab(
63
'id' => 'removing-reusing',
64
'title' => __( 'Removing and Reusing' ),
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>
67
<p>' . __( 'Widgets may be used multiple times. You can give each widget a title, to display on your site, but it’s not required.' ) . '</p>
68
<p>' . __( 'Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop.' ) . '</p>',
71
get_current_screen()->add_help_tab(
73
'id' => 'missing-widgets',
74
'title' => __( 'Missing Widgets' ),
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>',
74
81
get_current_screen()->set_help_sidebar(
75
'<p><strong>' . __('For more information:') . '</strong></p>' .
76
'<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>'
82
'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
83
'<p>' . __( '<a href="https://codex.wordpress.org/Appearance_Widgets_Screen">Documentation on Widgets</a>' ) . '</p>' .
84
'<p>' . __( '<a href="https://wordpress.org/support/">Support Forums</a>' ) . '</p>'
80
87
if ( ! current_theme_supports( 'widgets' ) ) {
84
91
// These are the widgets grouped by sidebar
85
92
$sidebars_widgets = wp_get_sidebars_widgets();
87
if ( empty( $sidebars_widgets ) )
94
if ( empty( $sidebars_widgets ) ) {
88
95
$sidebars_widgets = wp_get_widget_defaults();
90
98
foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
91
if ( 'wp_inactive_widgets' == $sidebar_id )
99
if ( 'wp_inactive_widgets' == $sidebar_id ) {
94
103
if ( ! is_registered_sidebar( $sidebar_id ) ) {
95
104
if ( ! empty( $widgets ) ) { // register the inactive_widgets area as sidebar
96
register_sidebar(array(
97
'name' => __( 'Inactive Sidebar (not used)' ),
99
'class' => 'inactive-sidebar orphan-sidebar',
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.' ),
101
'before_widget' => '',
102
'after_widget' => '',
103
'before_title' => '',
107
'name' => __( 'Inactive Sidebar (not used)' ),
109
'class' => 'inactive-sidebar orphan-sidebar',
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.' ),
111
'before_widget' => '',
112
'after_widget' => '',
113
'before_title' => '',
107
118
unset( $sidebars_widgets[ $sidebar_id ] );
112
123
// register the inactive_widgets area as sidebar
113
register_sidebar(array(
114
'name' => __('Inactive Widgets'),
115
'id' => 'wp_inactive_widgets',
116
'class' => 'inactive-sidebar',
117
'description' => __( 'Drag widgets here to remove them from the sidebar but keep their settings.' ),
118
'before_widget' => '',
119
'after_widget' => '',
120
'before_title' => '',
126
'name' => __( 'Inactive Widgets' ),
127
'id' => 'wp_inactive_widgets',
128
'class' => 'inactive-sidebar',
129
'description' => __( 'Drag widgets here to remove them from the sidebar but keep their settings.' ),
130
'before_widget' => '',
131
'after_widget' => '',
132
'before_title' => '',
124
137
retrieve_widgets();
126
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
141
$widget_id = $_POST['widget-id'];
129
check_admin_referer("save-delete-widget-$widget_id");
142
check_admin_referer( "save-delete-widget-$widget_id" );
131
$number = isset($_POST['multi_number']) ? (int) $_POST['multi_number'] : '';
144
$number = isset( $_POST['multi_number'] ) ? (int) $_POST['multi_number'] : '';
133
146
foreach ( $_POST as $key => $val ) {
134
if ( is_array($val) && preg_match('/__i__|%i%/', key($val)) ) {
135
$_POST[$key] = array( $number => array_shift($val) );
147
if ( is_array( $val ) && preg_match( '/__i__|%i%/', key( $val ) ) ) {
148
$_POST[ $key ] = array( $number => array_shift( $val ) );
141
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;
144
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();
148
if ( isset($_POST['removewidget']) && $_POST['removewidget'] ) {
161
if ( isset( $_POST['removewidget'] ) && $_POST['removewidget'] ) {
150
if ( !in_array($widget_id, $sidebar, true) ) {
151
wp_redirect( admin_url('widgets.php?error=0') );
163
if ( ! in_array( $widget_id, $sidebar, true ) ) {
164
wp_redirect( admin_url( 'widgets.php?error=0' ) );
155
$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');
168
$sidebar = array_diff( $sidebar, array( $widget_id ) );
170
'sidebar' => $sidebar_id,
171
'widget-' . $id_base => array(),
172
'the-widget-id' => $widget_id,
173
'delete_widget' => '1',
159
177
* Fires immediately after a widget has been marked for deletion.
203
223
if ( $_POST['removeinactivewidgets'] ) {
204
224
foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {
205
$pieces = explode( '-', $widget_id );
225
$pieces = explode( '-', $widget_id );
206
226
$multi_number = array_pop( $pieces );
207
$id_base = implode( '-', $pieces );
208
$widget = get_option( 'widget_' . $id_base );
209
unset( $widget[$multi_number] );
227
$id_base = implode( '-', $pieces );
228
$widget = get_option( 'widget_' . $id_base );
229
unset( $widget[ $multi_number ] );
210
230
update_option( 'widget_' . $id_base, $widget );
211
unset( $sidebars_widgets['wp_inactive_widgets'][$key] );
231
unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] );
214
234
wp_set_sidebars_widgets( $sidebars_widgets );
221
241
// Output the widget form without js
222
if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {
242
if ( isset( $_GET['editwidget'] ) && $_GET['editwidget'] ) {
223
243
$widget_id = $_GET['editwidget'];
225
if ( isset($_GET['addnew']) ) {
245
if ( isset( $_GET['addnew'] ) ) {
226
246
// Default to the first sidebar
227
$keys = array_keys( $wp_registered_sidebars );
247
$keys = array_keys( $wp_registered_sidebars );
228
248
$sidebar = reset( $keys );
230
if ( isset($_GET['base']) && isset($_GET['num']) ) { // multi-widget
250
if ( isset( $_GET['base'] ) && isset( $_GET['num'] ) ) { // multi-widget
231
251
// Copy minimal info from an existing instance of this widget to a new instance
232
252
foreach ( $wp_registered_widget_controls as $control ) {
233
253
if ( $_GET['base'] === $control['id_base'] ) {
234
$control_callback = $control['callback'];
235
$multi_number = (int) $_GET['num'];
236
$control['params'][0]['number'] = -1;
237
$widget_id = $control['id'] = $control['id_base'] . '-' . $multi_number;
238
$wp_registered_widget_controls[$control['id']] = $control;
254
$control_callback = $control['callback'];
255
$multi_number = (int) $_GET['num'];
256
$control['params'][0]['number'] = -1;
257
$widget_id = $control['id'] = $control['id_base'] . '-' . $multi_number;
258
$wp_registered_widget_controls[ $control['id'] ] = $control;
245
if ( isset($wp_registered_widget_controls[$widget_id]) && !isset($control) ) {
246
$control = $wp_registered_widget_controls[$widget_id];
265
if ( isset( $wp_registered_widget_controls[ $widget_id ] ) && ! isset( $control ) ) {
266
$control = $wp_registered_widget_controls[ $widget_id ];
247
267
$control_callback = $control['callback'];
248
} 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']) );
253
$name = esc_html( strip_tags($control['name']) );
255
if ( !isset($sidebar) )
256
$sidebar = isset($_GET['sidebar']) ? $_GET['sidebar'] : 'wp_inactive_widgets';
258
if ( !isset($multi_number) )
259
$multi_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';
261
$id_base = isset($control['id_base']) ? $control['id_base'] : $control['id'];
268
} elseif ( ! isset( $wp_registered_widget_controls[ $widget_id ] ) && isset( $wp_registered_widgets[ $widget_id ] ) ) {
269
$name = esc_html( strip_tags( $wp_registered_widgets[ $widget_id ]['name'] ) );
272
if ( ! isset( $name ) ) {
273
$name = esc_html( strip_tags( $control['name'] ) );
276
if ( ! isset( $sidebar ) ) {
277
$sidebar = isset( $_GET['sidebar'] ) ? $_GET['sidebar'] : 'wp_inactive_widgets';
280
if ( ! isset( $multi_number ) ) {
281
$multi_number = isset( $control['params'][0]['number'] ) ? $control['params'][0]['number'] : '';
284
$id_base = isset( $control['id_base'] ) ? $control['id_base'] : $control['id'];
263
286
// Show the widget form.
264
$width = ' style="width:' . max($control['width'], 350) . 'px"';
265
$key = isset($_GET['key']) ? (int) $_GET['key'] : 0;
287
$width = ' style="width:' . max( $control['width'], 350 ) . 'px"';
288
$key = isset( $_GET['key'] ) ? (int) $_GET['key'] : 0;
267
290
require_once( ABSPATH . 'wp-admin/admin-header.php' ); ?>
268
291
<div class="wrap">
273
296
<form action="widgets.php" method="post">
274
297
<div class="widget-inside">
276
if ( is_callable( $control_callback ) )
299
if ( is_callable( $control_callback ) ) {
277
300
call_user_func_array( $control_callback, $control['params'] );
279
echo '<p>' . __('There are no options for this widget.') . "</p>\n"; ?>
302
echo '<p>' . __( 'There are no options for this widget.' ) . "</p>\n";
282
<p class="describe"><?php _e('Select both the sidebar for this widget and the position of the widget in that sidebar.'); ?></p>
307
<p class="describe"><?php _e( 'Select both the sidebar for this widget and the position of the widget in that sidebar.' ); ?></p>
283
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>
286
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
313
if ( 'wp_inactive_widgets' == $sbname || 'orphaned_widgets' == substr( $sbname, 0, 16 ) ) {
291
if ( !isset($sidebars_widgets[$sbname]) || !is_array($sidebars_widgets[$sbname]) ) {
293
$sidebars_widgets[$sbname] = array();
316
if ( ! isset( $sidebars_widgets[ $sbname ] ) || ! is_array( $sidebars_widgets[ $sbname ] ) ) {
318
$sidebars_widgets[ $sbname ] = array();
295
$j = count($sidebars_widgets[$sbname]);
296
if ( isset($_GET['addnew']) || !in_array($widget_id, $sidebars_widgets[$sbname], true) )
320
$j = count( $sidebars_widgets[ $sbname ] );
321
if ( isset( $_GET['addnew'] ) || ! in_array( $widget_id, $sidebars_widgets[ $sbname ], true ) ) {
300
326
echo "\t\t<select name='{$sbname}_position'>\n";
301
echo "\t\t<option value=''>" . __('— Select —') . "</option>\n";
327
echo "\t\t<option value=''>" . __( '— Select —' ) . "</option>\n";
302
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
330
$selected = selected( $i, $key + 1, false );
305
332
echo "\t\t<option value='$i'$selected> $i </option>\n";
307
334
echo "\t\t</select>\n";
309
336
echo "</td></tr>\n";
314
342
<div class="widget-control-actions">
316
if ( isset($_GET['addnew']) ) { ?>
317
<a href="widgets.php" class="button alignleft"><?php _e('Cancel'); ?></a>
344
if ( isset( $_GET['addnew'] ) ) {
346
<a href="widgets.php" class="button alignleft"><?php _e( 'Cancel' ); ?></a>
320
349
submit_button( __( 'Delete' ), 'alignleft', 'removewidget', false );
322
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); ?>" />
324
<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr($id_base); ?>" />
325
<input type="hidden" name="multi_number" class="multi_number" value="<?php echo esc_attr($multi_number); ?>" />
326
<?php wp_nonce_field("save-delete-widget-$widget_id"); ?>
351
submit_button( __( 'Save Widget' ), 'primary alignright', 'savewidget', false );
353
<input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr( $widget_id ); ?>" />
354
<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr( $id_base ); ?>" />
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
357
<br class="clear" />
333
363
require_once( ABSPATH . 'wp-admin/admin-footer.php' );
337
367
$messages = array(
368
__( 'Changes saved.' ),
342
__('Error while saving.'),
343
__('Error in displaying the widget settings form.')
372
__( 'Error while saving.' ),
373
__( 'Error in displaying the widget settings form.' ),
346
require_once( ABSPATH . 'wp-admin/admin-header.php' ); ?>
376
require_once( ABSPATH . 'wp-admin/admin-header.php' );
348
379
<div class="wrap">
349
<h1 class="wp-heading-inline"><?php
380
<h1 class="wp-heading-inline">
350
382
echo esc_html( $title );
354
387
if ( current_user_can( 'customize' ) ) {
356
389
' <a class="page-title-action hide-if-no-customize" href="%1$s">%2$s</a>',
357
esc_url( add_query_arg(
359
array( 'autofocus' => array( 'panel' => 'widgets' ) ),
360
'return' => urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) )
362
admin_url( 'customize.php' )
393
array( 'autofocus' => array( 'panel' => 'widgets' ) ),
394
'return' => urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ),
396
admin_url( 'customize.php' )
364
399
__( 'Manage with Live Preview' )
403
$nonce = wp_create_nonce( 'widgets-access' );
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>
369
409
<hr class="wp-header-end">
371
<?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>
411
<?php if ( isset( $_GET['message'] ) && isset( $messages[ $_GET['message'] ] ) ) { ?>
412
<div id="message" class="updated notice is-dismissible"><p><?php echo $messages[ $_GET['message'] ]; ?></p></div>
374
<?php if ( isset($_GET['error']) && isset($errors[$_GET['error']]) ) { ?>
375
<div id="message" class="error"><p><?php echo $errors[$_GET['error']]; ?></p></div>
414
<?php if ( isset( $_GET['error'] ) && isset( $errors[ $_GET['error'] ] ) ) { ?>
415
<div id="message" class="error"><p><?php echo $errors[ $_GET['error'] ]; ?></p></div>