Make WordPress Core

Ticket #45640: get_blogs_of_users.diff

File get_blogs_of_users.diff, 16.0 KB (added by maniu, 6 years ago)

get_blogs_of_user improvements

  • src/wp-admin/includes/dashboard.php

    diff --git src/wp-admin/includes/dashboard.php src/wp-admin/includes/dashboard.php
    index 5b13f686a1..2f3ba90bae 100644
    function wp_dashboard_quick_press( $error_msg = false ) { 
    504504                $post    = get_default_post_to_edit( 'post', true );
    505505                $user_id = get_current_user_id();
    506506                // Don't create an option if this is a super admin who does not belong to this site.
    507                 if ( in_array( get_current_blog_id(), array_keys( get_blogs_of_user( $user_id ) ) ) ) {
     507                if ( in_array( get_current_blog_id(), get_blogs_of_user( $user_id, false, array( 'fields' => 'ids' ) ) ) )
    508508                        update_user_option( $user_id, 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID
    509509                }
    510510        }
  • src/wp-admin/includes/ms.php

    diff --git src/wp-admin/includes/ms.php src/wp-admin/includes/ms.php
    index 8672946da5..6e75ebfe25 100644
    function wpmu_delete_user( $id ) { 
    165165         */
    166166        do_action( 'wpmu_delete_user', $id );
    167167
    168         $blogs = get_blogs_of_user( $id );
     168        $blogs_ids = get_blogs_of_user( $id, false, array( 'fields' => 'ids' ) );
    169169
    170         if ( ! empty( $blogs ) ) {
    171                 foreach ( $blogs as $blog ) {
    172                         switch_to_blog( $blog->userblog_id );
    173                         remove_user_from_blog( $id, $blog->userblog_id );
     170        if ( ! empty( $blogs_ids ) ) {
     171                foreach ( $blogs_ids as $blog_id ) {
     172                        switch_to_blog( $blog_id );
     173                        remove_user_from_blog( $id, $blog_id );
    174174
    175175                        $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id ) );
    176176                        foreach ( (array) $post_ids as $post_id ) {
    function _access_denied_splash() { 
    626626                return;
    627627        }
    628628
    629         $blogs = get_blogs_of_user( get_current_user_id() );
     629        /**
     630         * Filters arguments when getting user's blogs for access denied message.
     631         *
     632         * @param array $args An array of optional arguments used when getting blogs.
     633         */
     634        $args = apply_filters( 'access_denied_splash_get_blogs_of_user_args', array() );
     635        $blogs = get_blogs_of_user( get_current_user_id(), false, $args );
    630636
    631637        if ( wp_list_filter( $blogs, array( 'userblog_id' => get_current_blog_id() ) ) ) {
    632638                return;
    function choose_primary_blog() { 
    804810                <th scope="row"><label for="primary_blog"><?php _e( 'Primary Site' ); ?></label></th>
    805811                <td>
    806812                <?php
    807                 $all_blogs    = get_blogs_of_user( get_current_user_id() );
    808                 $primary_blog = get_user_meta( get_current_user_id(), 'primary_blog', true );
    809                 if ( count( $all_blogs ) > 1 ) {
     813                $all_blogs_ids = get_blogs_of_user( get_current_user_id(), false, array( 'fields' => 'ids' ) );
     814                $primary_blog  = get_user_meta( get_current_user_id(), 'primary_blog', true );
     815                if ( count( $all_blogs_ids ) > 1 ) {
    810816                        $found = false;
    811817                        ?>
    812818                        <select name="primary_blog" id="primary_blog">
  • src/wp-admin/network/users.php

    diff --git src/wp-admin/network/users.php src/wp-admin/network/users.php
    index 7f212329f6..a4f5c19d1b 100644
    if ( isset( $_GET['action'] ) ) { 
    7575                                                                }
    7676
    7777                                                                $userfunction = 'all_spam';
    78                                                                 $blogs        = get_blogs_of_user( $user_id, true );
    79                                                                 foreach ( (array) $blogs as $details ) {
    80                                                                         if ( $details->userblog_id != get_network()->site_id ) { // main blog not a spam !
    81                                                                                 update_blog_status( $details->userblog_id, 'spam', '1' );
     78                                                                $blogs_ids    = get_blogs_of_user( $user_id, 'all_ids' );
     79                                                                foreach ( (array) $blogs_ids as $blog_id ) {
     80                                                                        if ( $blog_id != get_network()->site_id ) { // main blog not a spam !
     81                                                                                update_blog_status( $blog_id, 'spam', '1' );
    8282                                                                        }
    8383                                                                }
    8484                                                                update_user_status( $user_id, 'spam', '1' );
    if ( isset( $_GET['action'] ) ) { 
    8686
    8787                                                        case 'notspam':
    8888                                                                $userfunction = 'all_notspam';
    89                                                                 $blogs        = get_blogs_of_user( $user_id, true );
     89                                                                $blogs_ids    = get_blogs_of_user( $user_id, 'all_ids' );
    9090                                                                foreach ( (array) $blogs as $details ) {
    91                                                                         update_blog_status( $details->userblog_id, 'spam', '0' );
     91                                                                        update_blog_status( $blog_id, 'spam', '0' );
    9292                                                                }
    9393
    9494                                                                update_user_status( $user_id, 'spam', '0' );
  • src/wp-admin/user-new.php

    diff --git src/wp-admin/user-new.php src/wp-admin/user-new.php
    index 48387b0373..14de89e1d7 100644
    if ( isset( $_REQUEST['action'] ) && 'adduser' == $_REQUEST['action'] ) { 
    6363        $redirect       = 'user-new.php';
    6464        $username       = $user_details->user_login;
    6565        $user_id        = $user_details->ID;
    66         if ( $username != null && array_key_exists( $blog_id, get_blogs_of_user( $user_id ) ) ) {
     66        if ( $username != null && in_array( $blog_id, get_blogs_of_user( $user_id, array( 'fields' => 'ids' ) ) ) ) {
    6767                $redirect = add_query_arg( array( 'update' => 'addexisting' ), 'user-new.php' );
    6868        } else {
    6969                if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) {
  • src/wp-includes/link-template.php

    diff --git src/wp-includes/link-template.php src/wp-includes/link-template.php
    index a56c9635ee..a6452f59e9 100644
    function set_url_scheme( $url, $scheme = null ) { 
    36003600function get_dashboard_url( $user_id = 0, $path = '', $scheme = 'admin' ) {
    36013601        $user_id = $user_id ? (int) $user_id : get_current_user_id();
    36023602
    3603         $blogs = get_blogs_of_user( $user_id );
    3604         if ( is_multisite() && ! user_can( $user_id, 'manage_network' ) && empty( $blogs ) ) {
     3603        $blogs_exist = get_blogs_of_user( $user_id, false, array( 'number' => 1, 'fields' => 'ids' ) );
     3604        if ( is_multisite() && ! user_can( $user_id, 'manage_network' ) && empty( $blogs_exist ) ) {
    36053605                $url = user_admin_url( $path, $scheme );
    36063606        } elseif ( ! is_multisite() ) {
    36073607                $url = admin_url( $path, $scheme );
    36083608        } else {
    36093609                $current_blog = get_current_blog_id();
    3610                 if ( $current_blog && ( user_can( $user_id, 'manage_network' ) || in_array( $current_blog, array_keys( $blogs ) ) ) ) {
     3610                $blogs_ids = get_blogs_of_user( $user_id, 'all_ids' );
     3611                if ( $current_blog  && ( user_can( $user_id, 'manage_network' ) || in_array( $current_blog, $blogs_ids ) ) ) {
    36113612                        $url = admin_url( $path, $scheme );
    36123613                } else {
    36133614                        $active = get_active_blog_for_user( $user_id );
  • src/wp-includes/ms-functions.php

    diff --git src/wp-includes/ms-functions.php src/wp-includes/ms-functions.php
    index eca785f201..f58b30ba8b 100644
    function get_sitestats() { 
    3838 * @return WP_Site|void The blog object
    3939 */
    4040function get_active_blog_for_user( $user_id ) {
    41         $blogs = get_blogs_of_user( $user_id );
    42         if ( empty( $blogs ) ) {
     41        $blogs_ids = get_blogs_of_user( $user_id, false, array( 'fields' => 'ids' ) );
     42        if ( empty( $blogs_ids ) ) {
    4343                return;
    4444        }
    4545
    4646        if ( ! is_multisite() ) {
    47                 return $blogs[ get_current_blog_id() ];
     47                return get_site( get_current_blog_id() );
    4848        }
    4949
    50         $primary_blog = get_user_meta( $user_id, 'primary_blog', true );
    51         $first_blog   = current( $blogs );
     50        $primary_blog  = get_user_meta( $user_id, 'primary_blog', true );
     51        $first_blog_id = current($blogs_ids);
    5252        if ( false !== $primary_blog ) {
    53                 if ( ! isset( $blogs[ $primary_blog ] ) ) {
    54                         update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id );
    55                         $primary = get_site( $first_blog->userblog_id );
     53                if ( ! in_array( $primary_blog, $blogs_ids ) ) {
     54                        update_user_meta( $user_id, 'primary_blog', $first_blog_id );
     55                        $primary = get_site( $first_blog_id );
    5656                } else {
    5757                        $primary = get_site( $primary_blog );
    5858                }
    5959        } else {
    6060                //TODO Review this call to add_user_to_blog too - to get here the user must have a role on this blog?
    61                 $result = add_user_to_blog( $first_blog->userblog_id, $user_id, 'subscriber' );
     61                $result = add_user_to_blog( $first_blog_id, $user_id, 'subscriber' );
    6262
    6363                if ( ! is_wp_error( $result ) ) {
    64                         update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id );
    65                         $primary = $first_blog;
     64                        update_user_meta( $user_id, 'primary_blog', $first_blog_id );
     65                        $primary = get_site( $first_blog_id );
    6666                }
    6767        }
    6868
    6969        if ( ( ! is_object( $primary ) ) || ( $primary->archived == 1 || $primary->spam == 1 || $primary->deleted == 1 ) ) {
    70                 $blogs = get_blogs_of_user( $user_id, true ); // if a user's primary blog is shut down, check their other blogs.
    71                 $ret   = false;
    72                 if ( is_array( $blogs ) && count( $blogs ) > 0 ) {
    73                         foreach ( (array) $blogs as $blog_id => $blog ) {
     70                $blogs_ids = get_blogs_of_user( $user_id, true, array( 'fields' => 'ids' ) ); // if a user's primary blog is shut down, check their other blogs.
     71                $ret       = false;
     72                if ( is_array( $blogs_ids ) && count( $blogs_ids ) > 0 ) {
     73                        foreach ( (array) $blogs_ids as $blog_id ) {
    7474                                if ( $blog->site_id != get_current_network_id() ) {
    7575                                        continue;
    7676                                }
    function remove_user_from_blog( $user_id, $blog_id = '', $reassign = '' ) { 
    250250        if ( $primary_blog == $blog_id ) {
    251251                $new_id     = '';
    252252                $new_domain = '';
    253                 $blogs      = get_blogs_of_user( $user_id );
    254                 foreach ( (array) $blogs as $blog ) {
    255                         if ( $blog->userblog_id == $blog_id ) {
     253                $user_blogs_ids = get_blogs_of_user($user_id, false, array( 'fields' => 'ids' ));
     254                foreach ( (array) $user_blogs_ids as $user_blog_id ) {
     255                        if ( $user_blog_id == $blog_id ) {
    256256                                continue;
    257257                        }
    258258                        $new_id     = $blog->userblog_id;
    function remove_user_from_blog( $user_id, $blog_id = '', $reassign = '' ) { 
    273273
    274274        $user->remove_all_caps();
    275275
    276         $blogs = get_blogs_of_user( $user_id );
     276        $blogs = get_blogs_of_user($user_id, false, array( 'fields' => 'ids' ));
    277277        if ( count( $blogs ) == 0 ) {
    278278                update_user_meta( $user_id, 'primary_blog', '' );
    279279                update_user_meta( $user_id, 'source_domain', '' );
    function get_current_site() { 
    17431743function get_most_recent_post_of_user( $user_id ) {
    17441744        global $wpdb;
    17451745
    1746         $user_blogs       = get_blogs_of_user( (int) $user_id );
     1746        $user_blogs_ids   = get_blogs_of_user( (int) $user_id, false, array( 'fields' => 'ids' ) );
    17471747        $most_recent_post = array();
    17481748
    17491749        // Walk through each blog and get the most recent post
    17501750        // published by $user_id
    1751         foreach ( (array) $user_blogs as $blog ) {
    1752                 $prefix      = $wpdb->get_blog_prefix( $blog->userblog_id );
     1751        foreach ( (array) $user_blogs_ids as $blog_id ) {
     1752                $prefix      = $wpdb->get_blog_prefix( $blog_id );
    17531753                $recent_post = $wpdb->get_row( $wpdb->prepare( "SELECT ID, post_date_gmt FROM {$prefix}posts WHERE post_author = %d AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1", $user_id ), ARRAY_A );
    17541754
    17551755                // Make sure we found a post
    function get_most_recent_post_of_user( $user_id ) { 
    17611761                        // most recent post.
    17621762                        if ( ! isset( $most_recent_post['post_gmt_ts'] ) || ( $post_gmt_ts > $most_recent_post['post_gmt_ts'] ) ) {
    17631763                                $most_recent_post = array(
    1764                                         'blog_id'       => $blog->userblog_id,
     1764                                        'blog_id'       => $blog_id,
    17651765                                        'post_id'       => $recent_post['ID'],
    17661766                                        'post_date_gmt' => $recent_post['post_date_gmt'],
    17671767                                        'post_gmt_ts'   => $post_gmt_ts,
  • src/wp-includes/user.php

    diff --git src/wp-includes/user.php src/wp-includes/user.php
    index 09be161e15..85ca2d54a6 100644
    function get_users( $args = array() ) { 
    597597 *
    598598 * @global wpdb $wpdb WordPress database abstraction object.
    599599 *
    600  * @param int  $user_id User ID
    601  * @param bool $all     Whether to retrieve all sites, or only sites that are not
    602  *                      marked as deleted, archived, or spam.
     600 * @param int         $user_id User ID
     601 * @param bool|string $all     Whether to retrieve all sites, or only sites that are not
     602 *                             marked as deleted, archived, or spam. Alternatively can
     603 *                             force function to return just ids of all sites by using
     604 *                             'all_ids' as value.
     605 * @param array       $args    An array of optional arguments that will be passed to
     606 *                            'get_sites' function.
    603607 * @return array A list of the user's sites. An empty array if the user doesn't exist
    604608 *               or belongs to no sites.
    605609 */
    606 function get_blogs_of_user( $user_id, $all = false ) {
     610function get_blogs_of_user( $user_id, $all = false, $args = false ) {
    607611        global $wpdb;
    608612
    609613        $user_id = (int) $user_id;
    function get_blogs_of_user( $user_id, $all = false ) { 
    621625         *
    622626         * @since 4.6.0
    623627         *
    624          * @param null|array $sites   An array of site objects of which the user is a member.
    625          * @param int        $user_id User ID.
    626          * @param bool       $all     Whether the returned array should contain all sites, including
    627          *                            those marked 'deleted', 'archived', or 'spam'. Default false.
     628         * @param null|array  $sites   An array of site objects of which the user is a member.
     629         * @param int         $user_id User ID.
     630         * @param bool|string $all     Whether the returned array should contain all sites, including
     631         *                             those marked 'deleted', 'archived', or 'spam'. Alternatively can
     632         *                             force function to return just ids of all sites by using
     633         *                             'all_ids' as value.
     634         * @param array        $args   An array of optional arguments that will be passed to
     635         *                             'get_sites' function.
    628636         */
    629         $sites = apply_filters( 'pre_get_blogs_of_user', null, $user_id, $all );
     637        $sites = apply_filters( 'pre_get_blogs_of_user', null, $user_id, $all, $args );
    630638
    631639        if ( null !== $sites ) {
    632640                return $sites;
    function get_blogs_of_user( $user_id, $all = false ) { 
    676684                $site_ids[] = (int) $site_id;
    677685        }
    678686
     687        if( $all === 'all_ids' )
     688                return $site_ids;
     689
    679690        $sites = array();
    680691
    681692        if ( ! empty( $site_ids ) ) {
    682                 $args = array(
     693                $default_args = array(
    683694                        'number'   => '',
    684695                        'site__in' => $site_ids,
    685696                );
    686697                if ( ! $all ) {
    687                         $args['archived'] = 0;
    688                         $args['spam']     = 0;
    689                         $args['deleted']  = 0;
     698                        $default_args['archived'] = 0;
     699                        $default_args['spam']     = 0;
     700                        $default_args['deleted']  = 0;
    690701                }
    691702
     703                $args = wp_parse_args( $args, $default_args );
     704                /**
     705                 * Filters the list of arguments that are passed to get_sites function.
     706                 *
     707                 * @param array       $args    An array of optional arguments that will be passed to
     708                 *                             'get_sites' function.
     709                 * @param int         $user_id User ID.
     710                 * @param bool|string $all     Whether the returned array should contain all sites, including
     711                 *                             those marked 'deleted', 'archived', or 'spam'. Alternatively can
     712                 *                             force function to return just ids of all sites by using
     713                 *                             'all_ids' as value.
     714                 */
     715                $args = apply_filters( 'get_blogs_of_user_get_sites_args', $args, $user_id, $all );
     716
    692717                $_sites = get_sites( $args );
    693718
    694                 foreach ( $_sites as $site ) {
    695                         $sites[ $site->id ] = (object) array(
    696                                 'userblog_id' => $site->id,
    697                                 'blogname'    => $site->blogname,
    698                                 'domain'      => $site->domain,
    699                                 'path'        => $site->path,
    700                                 'site_id'     => $site->network_id,
    701                                 'siteurl'     => $site->siteurl,
    702                                 'archived'    => $site->archived,
    703                                 'mature'      => $site->mature,
    704                                 'spam'        => $site->spam,
    705                                 'deleted'     => $site->deleted,
    706                         );
     719                if( isset( $args[ 'fields' ] ) && $args[ 'fields' ] === 'ids' ) {
     720                        return $_sites;
     721                } else {
     722                        foreach ( $_sites as $site ) {
     723                                $sites[ $site->id ] = (object) array(
     724                                        'userblog_id' => $site->id,
     725                                        'blogname'    => $site->blogname,
     726                                        'domain'      => $site->domain,
     727                                        'path'        => $site->path,
     728                                        'site_id'     => $site->network_id,
     729                                        'siteurl'     => $site->siteurl,
     730                                        'archived'    => $site->archived,
     731                                        'mature'      => $site->mature,
     732                                        'spam'        => $site->spam,
     733                                        'deleted'     => $site->deleted,
     734                                );
     735                        }
    707736                }
    708737        }
    709738
    function get_blogs_of_user( $user_id, $all = false ) { 
    717746         * @param bool  $all     Whether the returned sites array should contain all sites, including
    718747         *                       those marked 'deleted', 'archived', or 'spam'. Default false.
    719748         */
    720         return apply_filters( 'get_blogs_of_user', $sites, $user_id, $all );
     749        return apply_filters( 'get_blogs_of_user', $sites, $user_id, $all, $args );
    721750}
    722751
    723752/**