diff --git a/src/js/_enqueues/admin/common.js b/src/js/_enqueues/admin/common.js index 358948d306cf6..62af86c5d363b 100644 --- a/src/js/_enqueues/admin/common.js +++ b/src/js/_enqueues/admin/common.js @@ -2354,3 +2354,59 @@ $( function( $ ) { // Expose public methods. return pub; })(); + +/** + * Disable the submit button until all users radio buttons are checked. + * + * @since 7.0.0 + */ +(function(){ + const usersForm = document.querySelector( '.users-php .delete-and-reassign-users-form' ); + + // Check if the form exists and contains any radio buttons. + if ( ! usersForm || ! usersForm.querySelector( 'input[type="radio"]' ) ) { + return; + } + + const submitBtn = usersForm.querySelector( 'input[type="submit"]' ); + + // Disable the submit button until all users radio buttons are checked. + submitBtn.disabled = true; + + // Listen for changes on any radio input in the form. + usersForm.addEventListener('change', function() { + if ( ! usersForm.checkValidity() ) { + submitBtn.disabled = true; + return; + } + + // Check all radio groups for validity. + let allValid = true; + const radioGroups = usersForm.querySelectorAll( 'fieldset ul' ); + radioGroups.forEach( function( radioGroup ) { + const radios = radioGroup.querySelectorAll( 'input[type="radio"]' ); + let checkedRadio = null; + radios.forEach( function( radio ) { + if ( radio.checked ) { + checkedRadio = radio; + } + }); + + if ( checkedRadio && checkedRadio.value === 'reassign' ) { + const select = radioGroup.querySelector( 'select' ); + if ( select && select.value === '-1' ) { + allValid = false; + } + } + }); + + submitBtn.disabled = !allValid; + }); + + usersForm.querySelectorAll( 'select' ).forEach( function( selectElement ) { + selectElement.addEventListener( 'change', function( e ) { + const radio = e.target.closest( 'li' ).querySelector( 'input[type="radio"]' ); + radio.checked = e.target.value !== '-1'; + }); + }); +})(); diff --git a/src/wp-admin/includes/deprecated.php b/src/wp-admin/includes/deprecated.php index 2f9b034e55044..e1815b255b6d7 100644 --- a/src/wp-admin/includes/deprecated.php +++ b/src/wp-admin/includes/deprecated.php @@ -1589,3 +1589,14 @@ function image_attachment_fields_to_save( $post, $attachment ) { return $post; } + +/** + * Was used to add JavaScript to the delete users form. + * + * @since 3.5.0 + * @deprecated 6.9.0 + * @access private + */ +function delete_users_add_js() { + _deprecated_function( __FUNCTION__, '6.9.0' ); +} diff --git a/src/wp-admin/includes/ms.php b/src/wp-admin/includes/ms.php index 10ed2e27692e0..d23635e784126 100644 --- a/src/wp-admin/includes/ms.php +++ b/src/wp-admin/includes/ms.php @@ -860,12 +860,15 @@ function _thickbox_path_admin_subfolder() { * @return bool */ function confirm_delete_users( $users ) { + global $wpdb; + $current_user = wp_get_current_user(); if ( ! is_array( $users ) || empty( $users ) ) { return false; } + ?> -

+

@@ -873,17 +876,15 @@ function confirm_delete_users( $users ) {

-
+ ID ) . '">' . $current_user->user_login . ''; ?> '; @@ -986,7 +1033,7 @@ function confirm_delete_users( $users ) { @@ -996,7 +1043,7 @@ function confirm_delete_users( $users ) { 'confirm-users-deletion' ) ); ?>
- - '; - confirm_delete_users( $_POST['allusers'] ); + confirm_delete_users( $allusers ); echo ''; require_once ABSPATH . 'wp-admin/admin-footer.php'; diff --git a/src/wp-admin/users.php b/src/wp-admin/users.php index 60cf94b6ffdd2..025f16401ea54 100644 --- a/src/wp-admin/users.php +++ b/src/wp-admin/users.php @@ -208,12 +208,12 @@ continue; } - switch ( $_REQUEST['delete_option'] ) { + switch ( $_REQUEST['delete_option'][ $id ] ) { case 'delete': wp_delete_user( $id ); break; case 'reassign': - wp_delete_user( $id, $_REQUEST['reassign_user'] ); + wp_delete_user( $id, $_REQUEST['reassign_user'][ $id ] ); break; } @@ -301,40 +301,9 @@ $user_ids = array_diff( $user_ids, array( $current_user->ID ) ); } - /** - * Filters whether the users being deleted have additional content - * associated with them outside of the `post_author` and `link_owner` relationships. - * - * @since 5.2.0 - * - * @param bool $users_have_additional_content Whether the users have additional content. Default false. - * @param int[] $user_ids Array of IDs for users being deleted. - */ - $users_have_content = (bool) apply_filters( 'users_have_additional_content', false, $user_ids ); - - if ( $user_ids && ! $users_have_content ) { - if ( $wpdb->get_var( - "SELECT ID FROM {$wpdb->posts} - WHERE post_author IN( " . implode( ',', $user_ids ) . ' ) - LIMIT 1' - ) ) { - $users_have_content = true; - } elseif ( $wpdb->get_var( - "SELECT link_id FROM {$wpdb->links} - WHERE link_owner IN( " . implode( ',', $user_ids ) . ' ) - LIMIT 1' - ) ) { - $users_have_content = true; - } - } - - if ( $users_have_content ) { - add_action( 'admin_head', 'delete_users_add_js' ); - } - require_once ABSPATH . 'wp-admin/admin-header.php'; ?> -
+ @@ -361,6 +330,7 @@