WordPress.org

Make WordPress Core

Ticket #16001: 16001.2.diff

File 16001.2.diff, 19.1 KB (added by wonderboymusic, 5 years ago)
  • wp-includes/user.php

     
    650650}
    651651
    652652/**
     653 * WordPress Pending User Query class.
     654 *
     655 * @since 3.6.0
     656 */
     657class WP_Pending_User_Query extends WP_User_Query {
     658
     659        public function prepare_query() {
     660                global $wpdb;
     661
     662                $qv =& $this->query_vars;
     663                $this->query_fields = "{$wpdb->signups}.*";
     664
     665                $this->query_from = "FROM {$wpdb->signups}";
     666                $this->query_where = "WHERE 1=1 AND active != 1";
     667
     668                // sorting
     669                if ( in_array( $qv['orderby'], array( 'nicename', 'email' ) ) ) {
     670                        $orderby = 'user_' . $qv['orderby'];
     671                } elseif ( in_array( $qv['orderby'], array( 'user_email', 'registered' ) ) ) {
     672                        $orderby = $qv['orderby'];
     673                } else {
     674                        $orderby = 'user_login';
     675                }
     676
     677                $qv['order'] = strtoupper( $qv['order'] );
     678                $order = 'ASC' == $qv['order'] ? 'ASC' : 'DESC';
     679                $this->query_orderby = "ORDER BY $orderby $order";
     680
     681                // limit
     682                if ( $qv['number'] ) {
     683                        if ( $qv['offset'] )
     684                                $this->query_limit = $wpdb->prepare( "LIMIT %d, %d", $qv['offset'], $qv['number'] );
     685                        else
     686                                $this->query_limit = $wpdb->prepare( "LIMIT %d", $qv['number'] );
     687                }
     688
     689                $search = trim( $qv['search'] );
     690                if ( $search ) {
     691                        $leading_wild = ( ltrim( $search, '*' ) != $search );
     692                        $trailing_wild = ( rtrim( $search, '*' ) != $search );
     693
     694                        $wild = false;
     695                        if ( $leading_wild && $trailing_wild )
     696                                $wild = 'both';
     697                        elseif ( $leading_wild )
     698                                $wild = 'leading';
     699                        elseif ( $trailing_wild )
     700                                $wild = 'trailing';
     701
     702                        if ( $wild )
     703                                $search = trim($search, '*');
     704
     705                        if ( false !== strpos( $search, '@') )
     706                                $search_columns = array( 'user_email' );
     707                        else
     708                                $search_columns = array( 'user_login' );
     709
     710                        $this->query_where .= $this->get_search_sql( $search, $search_columns, $wild );
     711                }
     712
     713                $blog_id = absint( $qv['blog_id'] );
     714
     715                do_action_ref_array( 'pre_user_query', array( $this ) );
     716        }
     717
     718        /**
     719         * Execute the query, with the current variables
     720         *
     721         * @since 3.6.0
     722         */
     723        public function query() {
     724                global $wpdb;
     725
     726                $this->results = $wpdb->get_results( "SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit" );
     727
     728                if ( ! $this->results )
     729                        return;
     730
     731                if ( $this->query_vars['count_total'] )
     732                        $this->total_users = $wpdb->get_var( "SELECT COUNT(*) $this->query_from $this->query_where" );
     733        }
     734}
     735
     736/**
    653737 * Retrieve list of users matching criteria.
    654738 *
    655739 * @since 3.1.0
  • wp-includes/ms-functions.php

     
    128128 * @return int
    129129 */
    130130function get_user_count() {
    131         return get_site_option( 'user_count' );
     131        $option = get_site_option( 'user_count' );
     132        if ( is_numeric( $option ) )
     133                return (int) $option;
     134
     135        return 0;
    132136}
    133137
    134138/**
     139 * The number of pending users in your installation.
     140 *
     141 * The count is cached and updated twice daily. This is not a live count.
     142 *
     143 * @since 3.6
     144 *
     145 * @return int
     146 */
     147function get_pending_user_count() {
     148        $option = get_site_option( 'pending_user_count' );
     149        if ( is_numeric( $option ) )
     150                return (int) $option;
     151
     152        return 0;
     153}
     154
     155/**
    135156 * The number of active sites on your installation.
    136157 *
    137158 * The count is cached and updated twice daily. This is not a live count.
     
    926947}
    927948
    928949/**
     950 * Active user automatically after looking up via user_login
     951 *
     952 * @since 3.6.0
     953 *
     954 * @uses wpmu_activate_signup()
     955 *
     956 * @global wpdb $wpdb
     957 *
     958 * @param string $user_login
     959 * @return array An array containing information about the activated user and/or blog
     960 */
     961function wp_activate_by_user_login( $user_login ) {
     962        global $wpdb;
     963
     964        $key = $wpdb->get_var( $wpdb->prepare( "SELECT activation_key FROM {$wpdb->signups} WHERE active != 1 AND user_login = %s", $user_login ) );
     965        if ( $key )
     966            return wpmu_activate_signup( $key );
     967}
     968
     969/**
     970 * Lookup signup and, when valid, resend the signup notification
     971 *
     972 * @since 3.6.0
     973 *
     974 * @uses wpmu_signup_user_notification()
     975 *
     976 * @global wpdb $wpdb
     977 *
     978 * @param string $user_login
     979 * @return bool
     980 */
     981function wp_resend_by_user_login( $user_login ) {
     982        global $wpdb;
     983
     984        $user = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->signups} WHERE active !=1 AND user_login = %s", $user_login ) );
     985
     986        if ( $user )
     987            return wpmu_signup_user_notification( $user->user_login, $user->user_email, $user->activation_key, $user->meta );
     988}
     989
     990/**
    929991 * Create a site.
    930992 *
    931993 * This function runs when a user self-registers a new site as well
     
    19251987function wp_update_network_counts() {
    19261988        global $wpdb;
    19271989
    1928         $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(blog_id) as c FROM $wpdb->blogs WHERE site_id = %d AND spam = '0' AND deleted = '0' and archived = '0'", $wpdb->siteid) );
     1990        $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(blog_id) as c FROM $wpdb->blogs WHERE site_id = %d AND spam = '0' AND deleted = '0' and archived = '0'", $wpdb->siteid ) );
    19291991        update_site_option( 'blog_count', $count );
    19301992
    19311993        $count = $wpdb->get_var( "SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0'" );
    19321994        update_site_option( 'user_count', $count );
     1995
     1996        $count = $wpdb->get_var( "SELECT COUNT(user_login) AS c FROM $wpdb->signups WHERE active != 1" );
     1997        update_site_option( 'pending_user_count', $count );
    19331998}
    19341999
    19352000/**
  • wp-admin/includes/class-wp-ms-users-list-table.php

     
    5858
    5959                $mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];
    6060
    61                 // Query the user IDs for this page
    62                 $wp_user_search = new WP_User_Query( $args );
     61                if ( 'pending' === $role )
     62                        $wp_user_search = new WP_Pending_User_Query( $args ); // Query for pending users
     63                else
     64                        $wp_user_search = new WP_User_Query( $args ); // Query the user IDs for this page
    6365
    6466                $this->items = $wp_user_search->get_results();
    6567
     
    7072        }
    7173
    7274        function get_bulk_actions() {
     75                global $role;
     76
    7377                $actions = array();
    74                 if ( current_user_can( 'delete_users' ) )
    75                         $actions['delete'] = __( 'Delete' );
    76                 $actions['spam'] = _x( 'Mark as Spam', 'user' );
    77                 $actions['notspam'] = _x( 'Not Spam', 'user' );
    7878
     79                if ( $role == 'pending' ) {
     80                        if ( current_user_can( 'delete_users' ) )
     81                                $actions['deletesignup'] = __( 'Delete' );
     82
     83                        $actions['activate'] = _x( 'Activate', 'user' );
     84                        $actions['resend'] = __( 'Resend Email', 'user' );
     85                } else {
     86                        if ( current_user_can( 'delete_users' ) )
     87                                $actions['delete'] = __( 'Delete' );
     88
     89                        $actions['spam'] = _x( 'Mark as Spam', 'user' );
     90                        $actions['notspam'] = _x( 'Not Spam', 'user' );
     91                }
     92
    7993                return $actions;
    8094        }
    8195
     
    89103                $total_users = get_user_count();
    90104                $super_admins = get_super_admins();
    91105                $total_admins = count( $super_admins );
     106                $total_pendings = get_pending_user_count();
    92107
    93                 $current_role = false;
    94                 $class = $role != 'super' ? ' class="current"' : '';
     108                $class = in_array( $role, array( 'super', 'pending' ) ) ? '' : ' class="current"';
    95109                $role_links = array();
    96                 $role_links['all'] = "<a href='" . network_admin_url('users.php') . "'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';
     110                $role_links['all'] = "<a href='" . network_admin_url( 'users.php' ) . "'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';
    97111                $class = $role == 'super' ? ' class="current"' : '';
    98                 $role_links['super'] = "<a href='" . network_admin_url('users.php?role=super') . "'$class>" . sprintf( _n( 'Super Admin <span class="count">(%s)</span>', 'Super Admins <span class="count">(%s)</span>', $total_admins ), number_format_i18n( $total_admins ) ) . '</a>';
     112                $role_links['super'] = "<a href='" . network_admin_url( 'users.php?role=super' ) . "'$class>" . sprintf( _n( 'Super Admin <span class="count">(%s)</span>', 'Super Admins <span class="count">(%s)</span>', $total_admins ), number_format_i18n( $total_admins ) ) . '</a>';
     113                $class = $role == 'pending' ? ' class="current"' : '';
     114                $role_links['pending'] = "<a href='" . network_admin_url( 'users.php?role=pending' ) . "'$class>" . sprintf( _n( 'Pending Confirmation <span class="count">(%s)</span>', 'Pending Confirmation <span class="count">(%s)</span>', $total_pendings ), number_format_i18n( $total_pendings ) ) . '</a>';
    99115
    100116                return $role_links;
    101117        }
     
    110126        }
    111127
    112128        function get_columns() {
     129                global $role;
     130
    113131                $users_columns = array(
    114132                        'cb'         => '<input type="checkbox" />',
    115133                        'username'   => __( 'Username' ),
    116                         'name'       => __( 'Name' ),
    117134                        'email'      => __( 'E-mail' ),
    118135                        'registered' => _x( 'Registered', 'user' ),
    119                         'blogs'      => __( 'Sites' )
    120136                );
    121                 $users_columns = apply_filters( 'wpmu_users_columns', $users_columns );
    122137
    123                 return $users_columns;
     138                if ( 'pending' !== $role ) {
     139                        $users_columns['name'] = __( 'Name' );
     140                        $users_columns['blogs'] = __( 'Sites' );
     141                }
     142
     143                return apply_filters( 'wpmu_users_columns', $users_columns );
    124144        }
    125145
    126146        function get_sortable_columns() {
    127                 return array(
     147                global $role;
     148
     149                $sortables = array(
    128150                        'username'   => 'login',
    129                         'name'       => 'name',
    130151                        'email'      => 'email',
    131152                        'registered' => 'id',
    132153                );
     154
     155                if ( 'pending' !== $role )
     156                        $sortables['name'] = 'name';
     157
     158                return $sortables;
    133159        }
    134160
    135161        function display_rows() {
    136                 global $current_site, $mode;
     162                global $current_site, $mode, $role;
    137163
    138164                $alt = '';
    139165                $super_admins = get_super_admins();
     
    142168
    143169                        $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );
    144170
    145                         foreach ( $status_list as $status => $col ) {
    146                                 if ( $user->$status )
    147                                         $alt .= " $col";
     171                        if ( 'pending' === $role ) {
     172                                $user->ID = $user->user_login;
     173                                $user->user_registered = $user->registered;
     174                        } else {
     175                                foreach ( $status_list as $status => $col )
     176                                        if ( $user->$status )
     177                                                $alt .= " $col";
    148178                        }
    149179
    150180                        ?>
     
    173203
    174204                                        case 'username':
    175205                                                $avatar = get_avatar( $user->user_email, 32 );
    176                                                 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user->ID ) ) );
     206                                                if ( get_current_user_id() == $user->ID ) {
     207                                                        $edit_link = esc_url( self_admin_url( 'profile.php' ) );
     208                                                } else {
     209                                                        $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user->ID ) ) );
     210                                                }
    177211
     212                                                $activate_link = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'users.php', 'activatesignup' ) . '&amp;action=activatesignup&amp;user_login=' . $user->user_login ) ) );
     213                                                $resend_link = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'users.php', 'resendsignup' ) . '&amp;action=resendsignup&amp;user_login=' . $user->user_login ) ) );
     214
    178215                                                echo "<td $attributes>"; ?>
    179                                                         <?php echo $avatar; ?><strong><a href="<?php echo $edit_link; ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php
     216                                                        <?php echo $avatar; ?><strong><?php
     217
     218                                                        if ( $role == 'pending' ): ?>
     219                                                                <?php echo stripslashes( $user->user_login ); ?>
     220                                                        <?php else: ?>
     221                                                                <a href="<?php echo $edit_link; ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a>
     222                                                        <?php endif;
     223
    180224                                                        if ( in_array( $user->user_login, $super_admins ) )
    181225                                                                echo ' - ' . __( 'Super Admin' );
    182226                                                        ?></strong>
    183227                                                        <br/>
    184228                                                        <?php
    185229                                                                $actions = array();
    186                                                                 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
    187230
     231                                                                if ( 'pending' === $role ) {
     232                                                                        $actions['activate'] = '<a href="' . $activate_link . '">' . __( 'Activate' ) . '</a>';
     233                                                                        $actions['resend'] = '<a href="' . $resend_link . '">' . __( 'Resend Email' ) . '</a>';
     234                                                                } else {
     235                                                                        $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
     236                                                                }
     237
    188238                                                                if ( current_user_can( 'delete_user', $user->ID ) && ! in_array( $user->user_login, $super_admins ) ) {
    189                                                                         $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'users.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
     239                                                                        if ( 'pending' === $role ) {
     240                                                                                $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deletesignup' ) . '&amp;action=deletesignup&amp;user_login=' . $user->user_login ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
     241                                                                        } else {
     242                                                                                $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'users.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
     243                                                                        }
    190244                                                                }
    191245
    192246                                                                $actions = apply_filters( 'ms_user_row_actions', $actions, $user );
  • wp-admin/network/users.php

     
    1616if ( ! current_user_can( 'manage_network_users' ) )
    1717        wp_die( __( 'You do not have permission to access this page.' ) );
    1818
     19function confirm_delete_signups( $signups ) {
     20        if ( ! is_array( $signups ) )
     21                return false;
     22        ?>
     23        <h2><?php esc_html_e( 'Users' ); ?></h2>
     24        <p><?php _e( 'Transfer or delete posts before deleting users.' ); ?></p>
     25        <form action="users.php?action=dodeletesignup" method="post">
     26        <input type="hidden" name="dodeletesignup" />
     27        <?php wp_nonce_field( 'ms-signups-delete' ); ?>
     28        <ul>
     29        <?php
     30        foreach ( $signups as $delete_signup ) {
     31                echo "<li><input type='hidden' name='user[]' value='{$delete_signup}'/>{$delete_signup}</li>\n";
     32        }
     33        ?>
     34        </ul>
     35        <?php submit_button( __( 'Confirm Deletion' ), 'delete' ); ?>
     36        </form>
     37        <?php
     38        return true;
     39}
     40
    1941function confirm_delete_users( $users ) {
    2042        $current_user = wp_get_current_user();
    21         if ( !is_array( $users ) )
     43        if ( ! is_array( $users ) )
    2244                return false;
    2345
    2446        screen_icon();
     
    91113
    92114        switch ( $_GET['action'] ) {
    93115                case 'deleteuser':
    94                         if ( ! current_user_can( 'manage_network_users' ) )
    95                                 wp_die( __( 'You do not have permission to access this page.' ) );
    96 
    97116                        check_admin_referer( 'deleteuser' );
    98117
    99118                        $id = intval( $_GET['id'] );
     
    113132                break;
    114133
    115134                case 'allusers':
    116                         if ( !current_user_can( 'manage_network_users' ) )
    117                                 wp_die( __( 'You do not have permission to access this page.' ) );
    118 
    119135                        if ( ( isset( $_POST['action']) || isset($_POST['action2'] ) ) && isset( $_POST['allusers'] ) ) {
    120136                                check_admin_referer( 'bulk-users-network' );
    121137
     
    123139                                $userfunction = '';
    124140
    125141                                foreach ( (array) $_POST['allusers'] as $key => $val ) {
    126                                         if ( !empty( $val ) ) {
     142                                        if ( ! empty( $val ) ) {
    127143                                                switch ( $doaction ) {
    128144                                                        case 'delete':
    129145                                                                if ( ! current_user_can( 'delete_users' ) )
     
    160176
    161177                                                                update_user_status( $val, 'spam', '0' );
    162178                                                        break;
     179
     180                                                        case 'activate':
     181                                                                $userfunction = 'all_activate';
     182                                                                wp_activate_by_user_login( $val );
     183                                                        break;
     184
     185                                                        case 'resend':
     186                                                                $userfunction = 'all_resend';
     187                                                                wp_resend_by_user_login( $val );
     188                                                        break;
     189
     190                                                        case 'deletesignup':
     191                                                                if ( ! current_user_can( 'delete_users' ) )
     192                                                                        wp_die( __( 'You do not have permission to access this page.' ) );
     193
     194                                                                $title = __( 'Users' );
     195                                                                $parent_file = 'users.php';
     196                                                                require_once( '../admin-header.php' );
     197                                                                echo '<div class="wrap">';
     198                                                                confirm_delete_signups( $_POST['allusers'] );
     199                                                                echo '</div>';
     200                                                                require_once( '../admin-footer.php' );
     201                                                                exit();
     202                                                        break;
    163203                                                }
    164204                                        }
    165205                                }
     
    177217
    178218                case 'dodelete':
    179219                        check_admin_referer( 'ms-users-delete' );
    180                         if ( ! ( current_user_can( 'manage_network_users' ) && current_user_can( 'delete_users' ) ) )
     220                        if ( ! current_user_can( 'delete_users' ) )
    181221                                wp_die( __( 'You do not have permission to access this page.' ) );
    182222
    183223                        if ( ! empty( $_POST['blog'] ) && is_array( $_POST['blog'] ) ) {
     
    210250                        wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => $deletefunction ), network_admin_url( 'users.php' ) ) );
    211251                        exit();
    212252                break;
     253
     254                case 'activatesignup':
     255                        check_admin_referer( 'activatesignup' );
     256
     257                        wp_activate_by_user_login( $_GET['user_login'] );
     258
     259                        wp_redirect( add_query_arg( array( 'role' => 'pending', 'updated' => 'true', 'action' => 'activate' ), network_admin_url( 'users.php' ) ) );
     260                        exit();
     261                break;
     262
     263                case 'resendsignup':
     264                        check_admin_referer( 'resendsignup' );
     265
     266                        wp_resend_by_user_login( $_GET['user_login'] );
     267
     268                        wp_redirect( add_query_arg( array( 'role' => 'pending', 'updated' => 'true', 'action' => 'resend' ), network_admin_url( 'users.php' ) ) );
     269                        exit();
     270                break;
     271
     272                case 'deletesignup':
     273                        check_admin_referer( 'deletesignup' );
     274
     275                        if ( ! empty( $_GET['user_login'] ) ) {
     276                                $title = __( 'Users' );
     277                                $parent_file = 'users.php';
     278                                require_once( '../admin-header.php' );
     279                                echo '<div class="wrap">';
     280                                confirm_delete_signups( array( $_GET['user_login'] ) );
     281                                echo '</div>';
     282                                require_once( '../admin-footer.php' );
     283                        } else {
     284                                wp_redirect( add_query_arg( array( 'role' => 'pending' ), network_admin_url( 'users.php' ) ) );
     285                        }
     286                        exit();
     287                break;
     288
     289                case 'dodeletesignup':
     290                        if ( ! current_user_can( 'delete_users' ) )
     291                                wp_die( __( 'You do not have permission to access this page.' ) );
     292
     293                        check_admin_referer( 'ms-signups-delete' );
     294
     295                        if ( ! empty( $_POST['user'] ) ) {
     296                                array_walk( $_POST['user'], array( &$wpdb, 'escape_by_ref' ) );
     297                                $wpdb->query( "DELETE FROM {$wpdb->signups} WHERE active != 1 AND user_login IN ('" . implode( "','", $_POST['user'] ) . "')" );
     298                        }
     299
     300                        if ( count( $_POST['user'] ) > 1 ) {
     301                                $delete_action = 'all_delete';
     302                        } else {
     303                                $delete_action = 'delete';
     304                        }
     305
     306                        wp_redirect( add_query_arg( array( 'role' => 'pending', 'updated' => 'true', 'action' => $delete_action ), network_admin_url( 'users.php' ) ) );
     307                        exit();
     308                break;
    213309        }
    214310}
    215311
     
    267363                        case 'add':
    268364                                _e( 'User added.' );
    269365                        break;
     366                        case 'activate':
     367                                _e( 'User activated.' );
     368                        break;
     369                        case 'resend':
     370                                _e( 'Activation instruction resent to user.');
     371                        break;
     372                        case 'all_activate':
     373                                _e( 'Users activated.' );
     374                        break;
     375                        case 'all_resend':
     376                                _e( 'Activation instruction resent to users.');
     377                        break;
    270378                }
    271379                ?>
    272380        </p></div>