WordPress.org

Make WordPress Core

Ticket #15871: caps.15871.2.diff

File caps.15871.2.diff, 6.1 KB (added by scribu, 3 years ago)

Introduce 'capability' arg to WP_User_Query

  • wp-includes/user.php

     
    377377                if ( !empty( $query ) ) { 
    378378                        $this->query_vars = wp_parse_args( $query, array( 
    379379                                'blog_id' => $GLOBALS['blog_id'], 
     380                                'capability' => '', 
    380381                                'role' => '', 
    381382                                'meta_key' => '', 
    382383                                'meta_value' => '', 
     
    403404         * @access private 
    404405         */ 
    405406        function prepare_query() { 
    406                 global $wpdb; 
     407                global $wpdb, $wp_roles; 
    407408 
    408409                $qv = &$this->query_vars; 
    409410 
     
    483484 
    484485                _parse_meta_query( $qv ); 
    485486 
     487                $capability = trim( $qv['capability'] ); 
    486488                $role = trim( $qv['role'] ); 
    487489                $blog_id = absint( $qv['blog_id'] ); 
    488490 
    489                 if ( $blog_id && ( $role || is_multisite() ) ) { 
    490                         $cap_meta_query = array(); 
    491                         $cap_meta_query['key'] = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities'; 
     491                if ( $blog_id ) { 
     492                        if ( $capability ) { 
     493                                foreach ( $wp_roles->role_objects as $role => $role_obj ) { 
     494                                        if ( !$role_obj->has_cap( $capability ) ) { 
     495                                                $qv['meta_query'][] = array( 
     496                                                        'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', 
     497                                                        'value' => '"' . $role . '"', 
     498                                                        'compare' => 'NOT LIKE', 
     499                                                ); 
     500                                        } 
     501                                } 
     502                        } elseif ( $role || is_multisite() ) { 
     503                                $cap_meta_query = array( 
     504                                        'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities' 
     505                                ); 
    492506 
    493                         if ( $role ) { 
    494                                 $cap_meta_query['value'] = '"' . $role . '"'; 
    495                                 $cap_meta_query['compare'] = 'like'; 
     507                                if ( $role ) { 
     508                                        $cap_meta_query['value'] = '"' . $role . '"'; 
     509                                        $cap_meta_query['compare'] = 'LIKE'; 
     510                                } 
     511 
     512                                $qv['meta_query'][] = $cap_meta_query; 
    496513                        } 
    497  
    498                         $qv['meta_query'][] = $cap_meta_query; 
    499514                } 
    500515 
    501516                if ( !empty( $qv['meta_query'] ) ) { 
     
    961976 * <li>id - Default is the value of the 'name' parameter. ID attribute of select element.</li> 
    962977 * <li>class - Class attribute of select element.</li> 
    963978 * <li>blog_id - ID of blog (Multisite only). Defaults to ID of current blog.</li> 
     979 * <li>users - Raw array of users.</li> 
    964980 * </ol> 
    965981 * 
    966982 * @since 2.3.0 
     
    970986 * @return string|null Null on display. String of HTML content on retrieve. 
    971987 */ 
    972988function wp_dropdown_users( $args = '' ) { 
    973         global $wpdb; 
    974989        $defaults = array( 
    975990                'show_option_all' => '', 'show_option_none' => '', 
    976991                'orderby' => 'display_name', 'order' => 'ASC', 
    977992                'include' => '', 'exclude' => '', 'multi' => 0, 
    978993                'show' => 'display_name', 'echo' => 1, 
    979                 'selected' => 0, 'name' => 'user', 'class' => '', 'blog_id' => $GLOBALS['blog_id'], 
    980                 'id' => '', 
     994                'selected' => 0, 'name' => 'user', 'class' => '', 'id' => '', 
     995                'blog_id' => $GLOBALS['blog_id'], 'users' => null 
    981996        ); 
    982997 
    983998        $defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0; 
     
    9851000        $r = wp_parse_args( $args, $defaults ); 
    9861001        extract( $r, EXTR_SKIP ); 
    9871002 
    988         $query_args = wp_array_slice_assoc( $r, array( 'blog_id', 'include', 'exclude', 'orderby', 'order' ) ); 
    989         $query_args['fields'] = array( 'ID', $show ); 
     1003        if ( is_null( $users ) ) { 
     1004                $query_args = wp_array_slice_assoc( $r, array( 'blog_id', 'include', 'exclude', 'orderby', 'order' ) ); 
     1005                $query_args['fields'] = array( 'ID', $show ); 
     1006                $users = get_users( $query_args ); 
     1007        } 
    9901008 
    991         $users = get_users( $query_args ); 
    992  
    9931009        $output = ''; 
    9941010        if ( !empty($users) ) { 
    9951011                $name = esc_attr( $name ); 
  • wp-admin/includes/class-wp-posts-list-table.php

     
    757757                                <?php touch_time( 1, 1, 4, 1 ); ?> 
    758758                        </div> 
    759759                        <br class="clear" /> 
    760  
    761760        <?php endif; // $bulk 
    762761 
    763762                if ( post_type_supports( $screen->post_type, 'author' ) ) : 
    764763                        $authors_dropdown = ''; 
    765764 
    766765                        if ( is_super_admin() || current_user_can( $post_type_object->cap->edit_others_posts ) ) : 
    767                                 $users_opt = array( 
    768                                         'name' => 'post_author', 
    769                                         'class'=> 'authors', 
    770                                         'multi' => 1, 
    771                                         'echo' => 0 
    772                                 ); 
    773                                 if ( $bulk ) 
    774                                         $users_opt['show_option_none'] = __( '&mdash; No Change &mdash;' ); 
    775                                 $authors_dropdown  = '<label>'; 
    776                                 $authors_dropdown .= '<span class="title">' . __( 'Author' ) . '</span>'; 
    777                                 $authors_dropdown .= wp_dropdown_users( $users_opt ); 
    778                                 $authors_dropdown .= '</label>'; 
     766                                $users = _get_potential_authors(); 
     767 
     768                                if ( count( $users ) > 1 ) :     
     769                                        $users_opt = array( 
     770                                                'users' => $users, 
     771                                                'name' => 'post_author', 
     772                                                'class'=> 'authors', 
     773                                                'multi' => 1, 
     774                                                'echo' => 0 
     775                                        ); 
     776                                        if ( $bulk ) 
     777                                                $users_opt['show_option_none'] = __( '&mdash; No Change &mdash;' ); 
     778                                        $authors_dropdown  = '<label>'; 
     779                                        $authors_dropdown .= '<span class="title">' . __( 'Author' ) . '</span>'; 
     780                                        $authors_dropdown .= wp_dropdown_users( $users_opt ); 
     781                                        $authors_dropdown .= '</label>'; 
     782                                endif; 
    779783                        endif; // authors 
    780784        ?> 
    781785 
  • wp-admin/includes/meta-boxes.php

     
    530530 */ 
    531531function post_author_meta_box($post) { 
    532532        global $user_ID; 
    533  
    534533?> 
    535534<label class="screen-reader-text" for="post_author_override"><?php _e('Author'); ?></label> 
    536535<?php 
    537536        wp_dropdown_users( array( 
     537                'users' => _get_potential_authors(), 
    538538                'name' => 'post_author_override', 
    539539                'selected' => empty($post->ID) ? $user_ID : $post->post_author 
    540540        ) ); 
  • wp-admin/includes/template.php

     
    21712171        return $button; 
    21722172} 
    21732173 
     2174// Get list of users for the author metabox and quick edit dropdowns 
     2175function _get_potential_authors() { 
     2176        global $post_type; 
     2177 
     2178        $post_type_obj = get_post_type_object( $post_type ); 
     2179 
     2180        return get_users( array( 
     2181                'fields' => array( 'ID', 'display_name' ), 
     2182                'capability' => $post_type_obj->cap->edit_posts, 
     2183                'orderby' => 'display_name', 
     2184                'order' => 'ASC' 
     2185        ) ); 
     2186} 
     2187