Skip to:
Content

BuddyPress.org

Ticket #5367: 5367-trick.diff

File 5367-trick.diff, 9.0 KB (added by imath, 6 years ago)
  • bp-members/bp-members-admin.php

     
    146146                // Add a row action to users listing
    147147                add_filter( bp_core_do_network_admin() ? 'ms_user_row_actions' : 'user_row_actions', array( $this, 'row_actions' ), 10, 2 );
    148148
     149                /** Specific config *******************************************/
     150
     151                // Specific hooks in case BuddyPress is not activated on the network
     152                if ( is_multisite() && ! bp_is_network_activated() && bp_is_root_blog() && current_user_can( 'manage_network_users') ) {
     153                        add_action( 'load-users.php',     array( $this, 'list_table_globalize' ),         10    );
     154                        add_action( 'pre_user_query',     array( $this, 'list_table_append_members' ),    10, 1 );
     155                        add_action( 'bp_admin_init',      array( $this, 'list_table_set_members_count' ), 10    );
     156                        add_filter( 'views_users',        array( $this, 'list_table_filter_views' ),      10, 1 );
     157                        add_filter( 'bulk_actions-users', array( $this, 'list_table_bulk_actions' ),      10, 1 );
     158                }
     159
    149160        }
    150161
    151162        /**
     
    224235                        $query_args['wp_http_referer'] = urlencode( wp_unslash( $_REQUEST['wp_http_referer'] ) );
    225236                }
    226237
     238                $wordpress_url = $this->edit_url;
     239
     240                if ( is_multisite() && ! bp_is_network_activated() && ! is_user_member_of_blog( $user->ID, bp_get_root_blog_id() ) ) {
     241                        $wordpress_url = add_query_arg( $query_args, network_admin_url( 'user-edit.php' ) );
     242                }
     243
    227244                $community_url = add_query_arg( $query_args, $this->edit_profile_url );
    228                 $wordpress_url = add_query_arg( $query_args, $this->edit_url         );
     245                $wordpress_url = add_query_arg( $query_args, $wordpress_url          );
    229246
    230247                $bp_active = false;
    231248                $wp_active = ' nav-tab-active';
     
    677694                        'edit-profile' => '<a href="' . esc_url( $edit_profile ) . '">' . esc_html__( 'Profile', 'buddypress' ) . '</a>'
    678695                );
    679696
    680                 return array_merge( $new_edit_actions, $actions );
     697                $actions = array_merge( $new_edit_actions, $actions );
     698
     699                // Specific to handle the case when BuddyPress is not networked activated
     700                if ( ! empty( $user->is_bp_member ) && current_user_can( 'manage_network_users') ) {
     701                        // No need to remove this user from blog, he's not attached to this blog
     702                        unset( $actions['remove'] );
     703
     704                        $referer_args = array(
     705                                'wp_http_referer' => urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) )
     706                        );
     707                        $edit_args = array_merge( array( 'user_id' => $user->ID ), $referer_args );
     708                       
     709                        $edit_link = add_query_arg( $edit_args, network_admin_url( 'user-edit.php' ) );
     710
     711                        /**
     712                         * This might not be needed..
     713                         * @see https://buddypress.trac.wordpress.org/ticket/5365
     714                         */
     715                        if ( get_current_user_id() == $user->ID ) {
     716                                $edit_link =  network_admin_url( 'profile.php' );
     717                        }
     718
     719                        $actions['edit']   = '<a href="' . esc_url( $edit_link ) . '">' . esc_html__( 'Edit', 'buddypress' ) . '</a>';
     720 
     721                        if ( current_user_can( 'delete_user', $user->ID ) && ! in_array( $user->user_login, get_super_admins() ) ) {
     722                                $delete_args = array_merge( array( 'action' => 'deleteuser', 'id' => $user->ID ), $referer_args );
     723                                $actions['delete'] = '<a href="' . $delete = esc_url( wp_nonce_url( add_query_arg( $delete_args , network_admin_url( 'users.php' ) ), 'deleteuser' ) ) . '" class="delete">' . __( 'Delete', 'buddypress' ) . '</a>';
     724                        }
     725                }
     726
     727                return $actions;
    681728        }
     729
     730        /** Specific config : BuddyPress is not activated on the network **/
     731
     732        /**
     733         * Globalize the Users list table of the BuddyPress root blog
     734         *
     735         * @access public
     736         * @since BuddyPress (2.0.0)
     737         *
     738         * @global $wp_list_table Users List Table class.
     739         */
     740        public function list_table_globalize() {
     741                /**
     742                 * globalizing the list table will allow us
     743                 * to manipulate datas once the query has been run
     744                 */
     745                global $wp_list_table;
     746        }
     747
     748        /**
     749         * Edit the query in order to get all BuddyPress members
     750         *
     751         * @access public
     752         * @since BuddyPress (2.0.0)
     753         *
     754         * @global $wpdb db class.
     755         * @param  WP_User_Query $query WordPress User Query class.
     756         */
     757        public function list_table_append_members( $query = null ) {
     758                global $wpdb;
     759                $blog_prefix = $wpdb->get_blog_prefix( bp_get_root_blog_id() );
     760
     761                // Query parts organized in WP Meta Query arguments
     762                $meta_query_relation = array( 'relation' => 'AND' );
     763
     764                /**
     765                 * Specific to BuddyPress
     766                 * This will need to be refreshed to avoid the use of last_activity
     767                 * @see https://buddypress.trac.wordpress.org/ticket/5128
     768                 */
     769                $meta_query_bp = array(
     770                        array(
     771                                'key'     => 'last_activity',
     772                                'compare' => 'EXISTS'
     773                        ),
     774                        array(
     775                                'key'     => $blog_prefix . 'user_level',
     776                                'compare' => 'NOT EXISTS'
     777                        )
     778                );
     779
     780                // All users view
     781                if ( empty( $query->query_vars['role'] ) ) {
     782                       
     783                        // Easiest to rebuild the role query than to edit it
     784                        $meta_query_args = array(
     785                                array(
     786                                        'key'     =>  $blog_prefix . 'capabilities',
     787                                        'compare' => 'EXISTS'
     788                                ),
     789                        );
     790
     791                        //merging meta query parts
     792                        $meta_query_args = array_merge( $meta_query_relation, $meta_query_args, $meta_query_bp );
     793
     794                        $meta_query = new WP_Meta_Query( $meta_query_args );
     795                        $mq_sql = $meta_query->get_sql( 'user', $wpdb->users, 'ID' );
     796
     797                        // Rewriting the query parts to match our need
     798                        preg_match_all( '/AND(.*)[^\(]/', $mq_sql['where'], $matches );
     799
     800                        if ( ! empty( $matches[1][1] ) && ! empty( $matches[1][2] ) ) {
     801                                $mq_sql['where'] = str_replace( $matches[0][1], ' OR ( '. $matches[1][1], $mq_sql['where'] );
     802                                $mq_sql['where'] = str_replace( $matches[0][2], ' AND '. $matches[1][2] .' ) )', $mq_sql['where'] );
     803
     804                                // At this point we will get all members that are active in the community
     805                                $query->query_fields = "DISTINCT ". $query->query_fields;
     806                                $query->query_from   = "FROM {$wpdb->users}" . $mq_sql['join'];
     807                                // Ban/Unban is managed in the Network Admin
     808                            $query->query_where  = "WHERE {$wpdb->users}.user_status = 0" . $mq_sql['where'];
     809                        }
     810
     811                // Members view : listing BuddyPress members (not users of the blog)
     812                } else if ( 'members' == $query->query_vars['role'] ) {
     813
     814                        //merging specific meta query parts
     815                        $meta_query_args = array_merge( $meta_query_relation, $meta_query_bp );
     816
     817                        $meta_query = new WP_Meta_Query( $meta_query_args );
     818                        $mq_sql = $meta_query->get_sql( 'user', $wpdb->users, 'ID' );
     819
     820                        $query->query_from   = "FROM {$wpdb->users}" . $mq_sql['join'];
     821                        // Ban/Unban is managed in the Network Admin
     822                        $query->query_where  = "WHERE {$wpdb->users}.user_status = 0" . $mq_sql['where'];
     823                }
     824        }
     825
     826        /**
     827         * Count the BuddyPress members once only
     828         *
     829         * @access public
     830         * @since BuddyPress (2.0.0)
     831         *
     832         * @global $wpdb db class.
     833         */
     834        public function list_table_set_members_count() {
     835                global $wpdb;
     836
     837                $this->all_members = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->usermeta} WHERE meta_key='last_activity'" );
     838        }
     839
     840        /**
     841         * Count the BuddyPress members once only
     842         *
     843         * @access public
     844         * @since BuddyPress (2.0.0)
     845         *
     846         * @global $wp_list_table Users List Table class.
     847         * @param array $views the views to edit
     848         * @return array $views the edited views
     849         */
     850        public function list_table_filter_views( $views = array() ) {
     851                global $wp_list_table;
     852
     853                // Making sure members will show as they might have no role
     854                // on this blog
     855                foreach ( $wp_list_table->items as $key => $user_data ) {
     856                        if ( empty( $user_data->allcaps ) ) {
     857                                $user_data->allcaps           = array( 'read' => true );
     858                                $user_data->is_bp_member      = true;
     859                                $wp_list_table->items[ $key ] = $user_data;
     860                        }
     861                }
     862
     863                // Set the Members view link to current view
     864                $class = false;
     865                if ( !empty( $_GET['role'] ) && 'members' ==  $_GET['role'] ) {
     866                        $class =  ' class="current"';
     867                }
     868
     869                // We need the $all_count to adjust the BuddyPress members count
     870                $pattern = '/\<span class=\"count\"\>\((.?)\)\<\/span\>/';
     871                preg_match( $pattern, $views['all'], $all_count );
     872               
     873                if ( ! empty( $all_count[1] ) ) {
     874                        $views['all']     = preg_replace( '/\<span class=\"count\"\>\((.?)\)\<\/span\>/', '('. $this->all_members .')', $views['all'] );
     875                        $members = $this->all_members - absint( $all_count[1] );
     876                        $views['members'] = '<a href="' . add_query_arg( 'role', 'members', bp_get_admin_url( 'users.php' ) ) . '"' . $class . '>' . sprintf( _nx( 'Member <span class="count">(%s)</span>', 'Members <span class="count">(%s)</span>', $members, 'buddypress members', 'buddypress' ), number_format_i18n( $members ) ) . '</a>';
     877                }
     878
     879                return $views;
     880        }
     881
     882        /**
     883         * Reset the bulk actions to avoid the remove from blog action
     884         *
     885         * @access public
     886         * @since BuddyPress (2.0.0)
     887         *
     888         * @param array $bulk_actions the actions to edit
     889         * @return array $bulk_actions the edited actions
     890         */
     891        public function list_table_bulk_actions( $bulk_actions = array() ) {
     892                if( ( empty( $_GET['role'] ) || ( ! empty( $_GET['role'] ) && 'members' == $_GET['role'] ) )  && 'users' == get_current_screen()->id )
     893                        $bulk_actions = array();
     894                       
     895                return $bulk_actions;
     896        }
    682897}
    683898endif; // class_exists check
    684899