Ticket #37392: 37392.3.diff
File 37392.3.diff, 6.6 KB (added by , 5 years ago) |
---|
-
src/wp-admin/includes/class-wp-ms-sites-list-table.php
From e9a38db42d13a7f8a0499e51efda6e024432809d Mon Sep 17 00:00:00 2001 From: Paul Biron <paul@sparrowhawkcomputing.com> Date: Mon, 23 Sep 2019 09:59:49 -0600 Subject: [PATCH] Multisite "Sites" screen: Add links to filter websites by status. --- .../includes/class-wp-ms-sites-list-table.php | 50 +++++++++++++++++++ src/wp-admin/network/sites.php | 2 + src/wp-includes/ms-blogs.php | 39 +++++++++++++++ tests/phpunit/tests/multisite.php | 42 ++++++++++++++++ 4 files changed, 133 insertions(+) diff --git a/src/wp-admin/includes/class-wp-ms-sites-list-table.php b/src/wp-admin/includes/class-wp-ms-sites-list-table.php index 519a57d8c4..5147139835 100644
a b class WP_MS_Sites_List_Table extends WP_List_Table { 160 160 $args['no_found_rows'] = false; 161 161 } 162 162 163 // Take into account the role the user has selected. 164 $status = isset( $_REQUEST['status'] ) ? wp_unslash( trim( $_REQUEST['status'] ) ) : ''; 165 if ( in_array( $status, array( 'public', 'archived', 'mature', 'spam', 'deleted' ), true ) ) { 166 $args[ $status ] = 1; 167 } 168 163 169 /** 164 170 * Filters the arguments for the site query in the sites list table. 165 171 * … … class WP_MS_Sites_List_Table extends WP_List_Table { 201 207 _e( 'No sites found.' ); 202 208 } 203 209 210 /** 211 * Gets links to filter sites by status. 212 * 213 * @since 5.3.0 214 * 215 * @return array 216 * 217 */ 218 protected function get_views() { 219 $counts = wp_count_sites(); 220 221 $statuses = array( 222 'all' => _n_noop( 'All <span class="count">(%s)</span>', 'All <span class="count">(%1$s)</span>' ), 223 'public' => _n_noop( 'Public <span class="count">(%s)</span>', 'Public <span class="count">(%1$s)</span>' ), 224 'archived' => _n_noop( 'Archived <span class="count">(%1$s)</span>', 'Archived <span class="count">(%1$s)</span>' ), 225 'mature' => _n_noop( 'Mature <span class="count">(%1$s)</span>', 'Mature <span class="count">(%1$s)</span>' ), 226 'spam' => _n_noop( 'Spam <span class="count">(%1$s)</span>', 'Spam <span class="count">(%1$s)</span>' ), 227 'deleted' => _n_noop( 'Deleted <span class="count">(%1$s)</span>', 'Deleted <span class="count">(%1$s)</span>' ), 228 ); 229 230 $view_links = array(); 231 $requested_status = isset( $_REQUEST['status'] ) ? wp_unslash( trim( $_REQUEST['status'] ) ) : ''; 232 $url = 'sites.php'; 233 234 foreach ( $statuses as $status => $label_count ) { 235 $current_link_attributes = $requested_status === $status || ( $requested_status === '' && 'all' === $status ) 236 ? ' class="current" aria-current="page"' 237 : ''; 238 if ( (int) $counts[ $status ] > 0 ) { 239 $label = sprintf( translate_nooped_plural( $label_count, $counts[ $status ] ), number_format_i18n( $counts[ $status ] ) ); 240 $full_url = 'all' === $status ? $url : add_query_arg( 'status', $status, $url ); 241 242 $view_links[ $status ] = sprintf( 243 '<a href="%1$s"%2$s>%3$s</a>', 244 esc_url( $full_url ), 245 $current_link_attributes, 246 $label 247 ); 248 } 249 } 250 251 return $view_links; 252 } 253 204 254 /** 205 255 * @return array 206 256 */ -
src/wp-admin/network/sites.php
diff --git a/src/wp-admin/network/sites.php b/src/wp-admin/network/sites.php index 227f37e289..52b4146c39 100644
a b if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) { 369 369 370 370 <hr class="wp-header-end"> 371 371 372 <?php $wp_list_table->views(); ?> 373 372 374 <?php echo $msg; ?> 373 375 374 376 <form method="get" id="ms-search" class="wp-clearfix"> -
src/wp-includes/ms-blogs.php
diff --git a/src/wp-includes/ms-blogs.php b/src/wp-includes/ms-blogs.php index 02a55692dc..2874f7e1f0 100644
a b function _update_posts_count_on_transition_post_status( $new_status, $old_status 853 853 854 854 update_posts_count(); 855 855 } 856 857 /** 858 * Count number of sites grouped by site status. 859 * 860 * @since 5.3.0 861 * 862 * @param int $network_id The network to get counts for. Default is the current network id. 863 * @return array Includes a grand total 'all' and an array of counts indexed by 864 * status strings: public, archived, mature, spam, deleted. 865 */ 866 function wp_count_sites( $network_id = null ) { 867 if ( empty( $network_id ) ) { 868 $network_id = get_current_network_id(); 869 } 870 871 $counts = array(); 872 $args = array( 873 'network_id' => $network_id, 874 'number' => 1, 875 'fields' => 'ids', 876 'no_found_rows' => false, 877 ); 878 879 $q = new WP_Site_Query( $args ); 880 $counts['all'] = $q->found_sites; 881 882 $_args = $args; 883 $statuses = array( 'public', 'archived', 'mature', 'spam', 'deleted' ); 884 885 foreach ( $statuses as $status ) { 886 $_args = $args; 887 $_args[ $status ] = 1; 888 889 $q = new WP_Site_Query( $_args ); 890 $counts[ $status ] = $q->found_sites; 891 } 892 893 return $counts; 894 } -
tests/phpunit/tests/multisite.php
diff --git a/tests/phpunit/tests/multisite.php b/tests/phpunit/tests/multisite.php index 4d25ade892..1f50d3ab4a 100644
a b if ( is_multisite() ) : 34 34 $reg_blog = $wpdb->get_col( $wpdb->prepare( "SELECT email FROM {$wpdb->registration_log} WHERE {$wpdb->registration_log}.blog_id = 1 AND IP LIKE %s", $ip ) ); 35 35 $this->assertEquals( $user->user_email, $reg_blog[ count( $reg_blog ) - 1 ] ); 36 36 } 37 38 /** 39 * @ticket 37392 40 */ 41 function test_wp_count_sites() { 42 // create a random number of sites with each status. 43 $site_ids = array( 44 'public' => self::factory()->blog->create_many( 45 random_int( 0, 5 ), 46 array( 'meta' => array( 'public' => 1 ) ) 47 ), 48 'archived' => self::factory()->blog->create_many( 49 random_int( 0, 5 ), 50 array( 'meta' => array( 'archived' => 1 ) ) 51 ), 52 'mature' => self::factory()->blog->create_many( 53 random_int( 0, 5 ), 54 array( 'meta' => array( 'mature' => 1 ) ) 55 ), 56 'spam' => self::factory()->blog->create_many( 57 random_int( 0, 5 ), 58 array( 'meta' => array( 'spam' => 1 ) ) 59 ), 60 'deleted' => self::factory()->blog->create_many( 61 random_int( 0, 5 ), 62 array( 'meta' => array( 'deleted' => 1 ) ) 63 ), 64 ); 65 66 $counts = wp_count_sites(); 67 68 $counts_by_status = array_map( 'count', $site_ids ); 69 $expected = array_merge( 70 array( 'all' => array_sum( $counts_by_status ) ), 71 $counts_by_status 72 ); 73 // add 1 to all & public for the main site. 74 $expected['all'] += 1; 75 $expected['public'] += 1; 76 77 $this->assertEquals( $expected, $counts ); 78 } 37 79 } 38 80 39 81 endif;