Skip to content

Commit 7ba408c

Browse files
committed
Widgets: add a button to delete all inactive widgets simultaneously for better UX.
Props cdog. Fixes #19159. git-svn-id: https://develop.svn.wordpress.org/trunk@35317 602fd350-edb4-49c9-b593-d223f7449a82
1 parent ba1177b commit 7ba408c

5 files changed

Lines changed: 111 additions & 3 deletions

File tree

src/wp-admin/admin-ajax.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
'hidden-columns', 'update-welcome-panel', 'menu-get-metabox', 'wp-link-ajax',
5757
'menu-locations-save', 'menu-quick-search', 'meta-box-order', 'get-permalink',
5858
'sample-permalink', 'inline-save', 'inline-save-tax', 'find_posts', 'widgets-order',
59-
'save-widget', 'set-post-thumbnail', 'date_format', 'time_format',
59+
'save-widget', 'delete-inactive-widgets', 'set-post-thumbnail', 'date_format', 'time_format',
6060
'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment',
6161
'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',
6262
'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 'get-revision-diffs',

src/wp-admin/css/widgets.css

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,8 @@ div#widgets-right .closed .widgets-sortables {
272272
margin-bottom: 0;
273273
}
274274

275-
.sidebar-name .spinner {
275+
.sidebar-name .spinner,
276+
.remove-inactive-widgets .spinner {
276277
float: none;
277278
position: relative;
278279
top: -2px;
@@ -348,6 +349,7 @@ div#widgets-right .closed .widgets-sortables {
348349

349350
.js .widgets-holder-wrap.closed .widget,
350351
.js .widgets-holder-wrap.closed .sidebar-description,
352+
.js .widgets-holder-wrap.closed .remove-inactive-widgets,
351353
.js .closed br.clear {
352354
display: none;
353355
}

src/wp-admin/includes/ajax-actions.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,41 @@ function wp_ajax_update_widget() {
19331933
$wp_customize->widgets->wp_ajax_update_widget();
19341934
}
19351935

1936+
/**
1937+
* Ajax handler for removing inactive widgets.
1938+
*
1939+
* @since 4.4.0
1940+
*/
1941+
function wp_ajax_delete_inactive_widgets() {
1942+
check_ajax_referer( 'remove-inactive-widgets', 'removeinactivewidgets' );
1943+
1944+
if ( ! current_user_can( 'edit_theme_options' ) ) {
1945+
wp_die( -1 );
1946+
}
1947+
1948+
unset( $_POST['removeinactivewidgets'], $_POST['action'] );
1949+
1950+
do_action( 'load-widgets.php' );
1951+
do_action( 'widgets.php' );
1952+
do_action( 'sidebar_admin_setup' );
1953+
1954+
$sidebars_widgets = wp_get_sidebars_widgets();
1955+
1956+
foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {
1957+
$pieces = explode( '-', $widget_id );
1958+
$multi_number = array_pop( $pieces );
1959+
$id_base = implode( '-', $pieces );
1960+
$widget = get_option( 'widget_' . $id_base );
1961+
unset( $widget[$multi_number] );
1962+
update_option( 'widget_' . $id_base, $widget );
1963+
unset( $sidebars_widgets['wp_inactive_widgets'][$key] );
1964+
}
1965+
1966+
wp_set_sidebars_widgets( $sidebars_widgets );
1967+
1968+
wp_die();
1969+
}
1970+
19361971
/**
19371972
* Ajax handler for uploading attachments
19381973
*

src/wp-admin/js/widgets.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ wpWidgets = {
8080
widget.removeClass( 'open' );
8181
wpWidgets.close( widget );
8282
e.preventDefault();
83+
} else if ( target.attr( 'id' ) === 'inactive-widgets-control-remove' ) {
84+
wpWidgets.removeInactiveWidgets();
85+
e.preventDefault();
8386
}
8487
});
8588

@@ -387,6 +390,7 @@ wpWidgets = {
387390
});
388391

389392
$.post( ajaxurl, data, function() {
393+
$( '#inactive-widgets-control-remove' ).prop( 'disabled' , ! $( '#wp_inactive_widgets .widget' ).length );
390394
$( '.spinner' ).removeClass( 'is-active' );
391395
});
392396
},
@@ -431,21 +435,49 @@ wpWidgets = {
431435
});
432436
} else {
433437
widget.remove();
438+
439+
if ( sidebarId === 'wp_inactive_widgets' ) {
440+
$( '#inactive-widgets-control-remove' ).prop( 'disabled' , ! $( '#wp_inactive_widgets .widget' ).length );
441+
}
434442
}
435443
} else {
436444
$( '.spinner' ).removeClass( 'is-active' );
437445
if ( r && r.length > 2 ) {
438446
$( 'div.widget-content', widget ).html( r );
439447
wpWidgets.appendTitle( widget );
440448
$document.trigger( 'widget-updated', [ widget ] );
449+
450+
if ( sidebarId === 'wp_inactive_widgets' ) {
451+
$( '#inactive-widgets-control-remove' ).prop( 'disabled' , ! $( '#wp_inactive_widgets .widget' ).length );
452+
}
441453
}
442454
}
455+
443456
if ( order ) {
444457
wpWidgets.saveOrder();
445458
}
446459
});
447460
},
448461

462+
removeInactiveWidgets : function() {
463+
var $element = $( '.remove-inactive-widgets' ), a, data;
464+
465+
$( '.spinner', $element ).addClass( 'is-active' );
466+
467+
a = {
468+
action : 'delete-inactive-widgets',
469+
removeinactivewidgets : $( '#_wpnonce_remove_inactive_widgets' ).val()
470+
};
471+
472+
data = $.param( a );
473+
474+
$.post( ajaxurl, data, function() {
475+
$( '#wp_inactive_widgets .widget' ).remove();
476+
$( '#inactive-widgets-control-remove' ).prop( 'disabled' , true );
477+
$( '.spinner', $element ).removeClass( 'is-active' );
478+
} );
479+
},
480+
449481
appendTitle : function(widget) {
450482
var title = $('input[id*="-title"]', widget).val() || '';
451483

src/wp-admin/widgets.php

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,28 @@
194194
exit;
195195
}
196196

197+
// Remove inactive widgets without js
198+
if ( isset( $_POST['removeinactivewidgets'] ) ) {
199+
check_admin_referer( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' );
200+
201+
if ( $_POST['removeinactivewidgets'] ) {
202+
foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {
203+
$pieces = explode( '-', $widget_id );
204+
$multi_number = array_pop( $pieces );
205+
$id_base = implode( '-', $pieces );
206+
$widget = get_option( 'widget_' . $id_base );
207+
unset( $widget[$multi_number] );
208+
update_option( 'widget_' . $id_base, $widget );
209+
unset( $sidebars_widgets['wp_inactive_widgets'][$key] );
210+
}
211+
212+
wp_set_sidebars_widgets( $sidebars_widgets );
213+
}
214+
215+
wp_redirect( admin_url( 'widgets.php?message=0' ) );
216+
exit;
217+
}
218+
197219
// Output the widget form without js
198220
if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {
199221
$widget_id = $_GET['editwidget'];
@@ -388,8 +410,25 @@
388410
<div class="<?php echo esc_attr( $wrap_class ); ?>">
389411
<div class="widget-holder inactive">
390412
<?php wp_list_widget_controls( $registered_sidebar['id'], $registered_sidebar['name'] ); ?>
391-
<div class="clear"></div>
413+
<div class="remove-inactive-widgets">
414+
<form action="" method="post">
415+
<p>
416+
<?php
417+
$attributes = array( 'id' => 'inactive-widgets-control-remove' );
418+
419+
if ( empty($sidebars_widgets['wp_inactive_widgets']) ) {
420+
$attributes['disabled'] = '';
421+
}
422+
423+
submit_button( __( 'Clear Inactive Widgets' ), 'delete', 'removeinactivewidgets', false, $attributes );
424+
?>
425+
<span class="spinner">
426+
</p>
427+
<?php wp_nonce_field( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' ); ?>
428+
</form>
429+
</div>
392430
</div>
431+
<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>
393432
</div>
394433
<?php
395434

0 commit comments

Comments
 (0)