<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[31656] trunk/src/wp-admin/network/users.php: Improve experience when deleting users from a multisite network.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/31656">31656</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/31656","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>jeremyfelt</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-03-07 04:39:13 +0000 (Sat, 07 Mar 2015)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Improve experience when deleting users from a multisite network.

When deleting a user who is not associated with any sites, the current messaging can be confusing as only users associated with at least one site actually appear on the confirmation page for deletion.

This experience can be improved by showing all users being deleted as well as their current site associations.

* If an empty array of users is passed, don't attempt to confirm deletion.
* If one user is passed, show a message crafted for a user of one.
* If multiple users are passed, show a message crafted for many.
* Show the pending results of all users to be deleted.
* Update messaging around the deletion/confirmation process to be less misleading.

Props Idealien, HarishChaudhari, DrewAPicture.

Fixes <a href="https://core.trac.wordpress.org/ticket/18132">#18132</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminnetworkusersphp">trunk/src/wp-admin/network/users.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminnetworkusersphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/network/users.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/network/users.php      2015-03-07 01:49:57 UTC (rev 31655)
+++ trunk/src/wp-admin/network/users.php        2015-03-07 04:39:13 UTC (rev 31656)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -18,34 +18,46 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> function confirm_delete_users( $users ) {
</span><span class="cx" style="display: block; padding: 0 10px">        $current_user = wp_get_current_user();
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( !is_array( $users ) )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! is_array( $users ) || empty( $users ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return false;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        }
</ins><span class="cx" style="display: block; padding: 0 10px">         ?>
</span><span class="cx" style="display: block; padding: 0 10px">        <h2><?php esc_html_e( 'Users' ); ?></h2>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        <p><?php _e( 'Transfer or delete content before deleting users.' ); ?></p>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       <?php if ( count( $users ) > 1 ) : ?>
+               <p><?php _e( 'You have chosen to delete the following users from all networks and sites.' ); ?></p>
+       <?php else : ?>
+               <p><?php _e( 'You have chosen to delete the user from all networks and sites.' ); ?></p>
+       <?php endif; ?>
+       
</ins><span class="cx" style="display: block; padding: 0 10px">         <form action="users.php?action=dodelete" method="post">
</span><span class="cx" style="display: block; padding: 0 10px">        <input type="hidden" name="dodelete" />
</span><span class="cx" style="display: block; padding: 0 10px">        <?php
</span><span class="cx" style="display: block; padding: 0 10px">        wp_nonce_field( 'ms-users-delete' );
</span><span class="cx" style="display: block; padding: 0 10px">        $site_admins = get_super_admins();
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $admin_out = '<option value="' . $current_user->ID . '">' . $current_user->user_login . '</option>';
-
-       foreach ( ( $allusers = (array) $_POST['allusers'] ) as $user_id ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $admin_out = '<option value="' . esc_attr( $current_user->ID ) . '">' . $current_user->user_login . '</option>'; ?>
+       <table class="form-table">
+       <?php foreach ( ( $allusers = (array) $_POST['allusers'] ) as $user_id ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( $user_id != '' && $user_id != '0' ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $delete_user = get_userdata( $user_id );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( ! current_user_can( 'delete_user', $delete_user->ID ) )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( ! current_user_can( 'delete_user', $delete_user->ID ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 wp_die( sprintf( __( 'Warning! User %s cannot be deleted.' ), $delete_user->user_login ) );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( in_array( $delete_user->user_login, $site_admins ) )
-                               wp_die( sprintf( __( 'Warning! User cannot be deleted. The user %s is a network administrator.' ), $delete_user->user_login ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( in_array( $delete_user->user_login, $site_admins ) ) {
+                               wp_die( sprintf( __( 'Warning! User cannot be deleted. The user %s is a network administrator.' ), '<em>' . $delete_user->user_login . '</em>' ) );
+                       }
+                       ?>
+                       <tr>
+                               <th scope="row"><?php echo $delete_user->user_login; ?>
+                                       <?php echo '<input type="hidden" name="user[]" value="' . esc_attr( $user_id ) . '" />' . "\n"; ?>
+                               </th>
+                       <?php $blogs = get_blogs_of_user( $user_id, true );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        echo "<input type='hidden' name='user[]' value='{$user_id}'/>\n";
-                       $blogs = get_blogs_of_user( $user_id, true );
-
-                       if ( !empty( $blogs ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( ! empty( $blogs ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ?>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                <br /><fieldset><p><legend><?php printf( __( "What should be done with content owned by %s?" ), '<em>' . $delete_user->user_login . '</em>' ); ?></legend></p>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         <td><fieldset><p><legend><?php printf( __( 'What should be done with content owned by %s?' ), '<em>' . $delete_user->user_login . '</em>' ); ?></legend></p>
</ins><span class="cx" style="display: block; padding: 0 10px">                                 <?php
</span><span class="cx" style="display: block; padding: 0 10px">                                foreach ( (array) $blogs as $key => $details ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        $blog_users = get_users( array( 'blog_id' => $details->userblog_id, 'fields' => array( 'ID', 'user_login' ) ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -55,11 +67,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                                $user_dropdown .= "<select name='blog[$user_id][$key]' id='reassign_user'>";
</span><span class="cx" style="display: block; padding: 0 10px">                                                $user_list = '';
</span><span class="cx" style="display: block; padding: 0 10px">                                                foreach ( $blog_users as $user ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                                        if ( ! in_array( $user->ID, $allusers ) )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                 if ( ! in_array( $user->ID, $allusers ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                                                 $user_list .= "<option value='{$user->ID}'>{$user->user_login}</option>";
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                        }
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                                if ( '' == $user_list )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                         if ( '' == $user_list ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                                         $user_list = $admin_out;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                }
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 $user_dropdown .= $user_list;
</span><span class="cx" style="display: block; padding: 0 10px">                                                $user_dropdown .= "</select>\n";
</span><span class="cx" style="display: block; padding: 0 10px">                                                ?>
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -73,14 +87,28 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                                <?php
</span><span class="cx" style="display: block; padding: 0 10px">                                        }
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                echo "</fieldset>";
-                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         echo "</fieldset></td></tr>";
+                       } else {
+                               ?>
+                               <td><fieldset><p><legend><?php _e( 'User has no sites or content and will be deleted.' ); ?></legend></p>
+                       <?php } ?>
+                       </tr>
+               <?php
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        ?>
+       </table>
+       <?php
</ins><span class="cx" style="display: block; padding: 0 10px">         /** This action is documented in wp-admin/users.php */
</span><span class="cx" style="display: block; padding: 0 10px">        do_action( 'delete_user_form', $current_user );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if ( count( $users ) > 1 ) : ?>
+               <p><?php _e( 'Once you hit &#8220;Confirm Deletion&#8221;, these users will be permanently removed.' ); ?></p>
+       <?php else : ?>
+               <p><?php _e( 'Once you hit &#8220;Confirm Deletion&#8221;, the user will be permanently removed.' ); ?></p>
+       <?php endif;
+       
</ins><span class="cx" style="display: block; padding: 0 10px">         submit_button( __('Confirm Deletion'), 'delete' );
</span><span class="cx" style="display: block; padding: 0 10px">        ?>
</span><span class="cx" style="display: block; padding: 0 10px">        </form>
</span></span></pre>
</div>
</div>

</body>
</html>