Skip to content

Commit da0bf0f

Browse files
authored
Merge branch 'master' into dependabot/npm_and_yarn/master/wordpress/scripts-31.2.0
2 parents 619432e + fb4afb7 commit da0bf0f

File tree

4 files changed

+65
-57
lines changed

4 files changed

+65
-57
lines changed

includes/MslsAdmin.php

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -382,27 +382,17 @@ public function admin_display(): void {
382382
* Shows the select-form-field 'reference_user'
383383
*/
384384
public function reference_user(): void {
385-
$users = array();
385+
$max_users = (int) apply_filters( 'msls_max_reference_users_count', self::MAX_REFERENCE_USERS );
386386

387-
foreach ( (array) apply_filters( 'msls_reference_users', $this->collection->get_users() ) as $user ) {
388-
$users[ $user->ID ] = $user->user_nicename;
389-
}
390-
391-
if ( count( $users ) > self::MAX_REFERENCE_USERS ) {
392-
$users = array_slice( $users, 0, self::MAX_REFERENCE_USERS, true );
387+
$users_collection = $this->collection->get_users( array( 'ID', 'user_nicename' ), $max_users );
393388

394-
/* translators: %s: maximum number of users */
395-
$format = __(
396-
'Multisite Language Switcher: Collection for reference user has been truncated because it exceeded the maximum of %d users. Please, use the hook "msls_reference_users" to filter the result before!',
397-
'multisite-language-switcher'
398-
);
399-
400-
// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
401-
trigger_error( esc_html( sprintf( $format, strval( self::MAX_REFERENCE_USERS ) ) ) );
402-
}
389+
$reference_users = (array) apply_filters(
390+
'msls_reference_users',
391+
wp_list_pluck( $users_collection, 'user_nicename', 'ID' )
392+
);
403393

404394
// phpcs:ignore WordPress.Security.EscapeOutput
405-
echo ( new Select( 'reference_user', $users, strval( $this->options->reference_user ) ) )->render();
395+
echo ( new Select( 'reference_user', $reference_users, strval( $this->options->reference_user ) ) )->render();
406396
}
407397

408398
/**

includes/MslsBlogCollection.php

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,9 @@ public static function get_configured_blog_description( int $blog_id, $descripti
130130
* @return object[]|\stdClass[]
131131
*/
132132
public function get_blogs_of_reference_user( MslsOptions $options ) {
133-
$reference_user = $options->has_value( 'reference_user' ) ? $options->reference_user : current(
134-
$this->get_users(
135-
'ID',
136-
1
137-
)
138-
);
133+
$reference_user = $options->has_value( 'reference_user' ) ?
134+
$options->reference_user :
135+
current( $this->get_users( 'ID', 1 ) );
139136

140137
$blogs = get_blogs_of_user( $reference_user );
141138
foreach ( $blogs as $key => $blog ) {
@@ -305,20 +302,34 @@ public function get_filtered( bool $filter = false ): array {
305302
/**
306303
* Gets the registered users of the current blog
307304
*
308-
* @param string $fields
309-
* @param int|string $number
305+
* @param string|string[] $fields
306+
* @param int $number
310307
*
311308
* @return array<string, int>
312309
*/
313-
public function get_users( $fields = 'all', $number = '' ) {
310+
public function get_users( $fields = 'all', int $number = MslsAdmin::MAX_REFERENCE_USERS ): array {
314311
$args = array(
315312
'blog_id' => $this->current_blog_id,
316313
'orderby' => 'registered',
317314
'fields' => $fields,
318-
'number' => $number,
315+
'number' => $number > 0 ? $number : MslsAdmin::MAX_REFERENCE_USERS,
319316
'count_total' => false,
320317
);
321318

319+
if ( $number !== 1 ) { // Check total users only if not fetching a single user
320+
$user_count = count_users();
321+
if ( isset( $user_count['total_users'] ) && $user_count['total_users'] > $number ) {
322+
/* translators: %s: maximum number of users */
323+
$format = __(
324+
'Multisite Language Switcher: The user list has been limited to %d users.',
325+
'multisite-language-switcher'
326+
);
327+
328+
// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
329+
trigger_error( esc_html( sprintf( $format, strval( $number ) ) ) );
330+
}
331+
}
332+
322333
$args = (array) apply_filters( 'msls_get_users', $args );
323334

324335
return get_users( $args );

tests/phpunit/TestMslsAdmin.php

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -116,35 +116,9 @@ public function test_admin_display(): void {
116116
$obj->admin_display();
117117
}
118118

119-
public function test_reference_user(): void {
120-
$users = array();
121-
$too_much = MslsAdmin::MAX_REFERENCE_USERS + 1;
122-
for ( $i = 1; $i <= $too_much; $i++ ) {
123-
$users[] = (object) array(
124-
'ID' => $i,
125-
'user_nicename' => 'realloc',
126-
);
127-
}
128-
129-
$obj = $this->MslsAdminFactory( $users );
130-
131-
set_error_handler(
132-
static function ( $errno, $errstr ) {
133-
restore_error_handler();
134-
throw new \Exception( $errstr, $errno );
135-
},
136-
E_ALL
137-
);
138-
139-
$this->expectException( \Exception::class );
140-
$this->expectExceptionMessage(
141-
'Multisite Language Switcher: Collection for reference user has been truncated because it exceeded the maximum of 100 users. Please, use the hook "msls_reference_users" to filter the result before!'
142-
);
143-
144-
$obj->reference_user();
145-
}
146-
147119
public function test_reference_user_over_max(): void {
120+
$users = array( 1 => 'realloc' );
121+
Functions\expect( 'wp_list_pluck' )->once()->andReturn( $users );
148122
$obj = $this->MslsAdminFactory();
149123

150124
$this->expectOutputRegex( '/^<select id="reference_user" name="msls\[reference_user\]">.*$/' );

tests/phpunit/TestMslsBlogCollection.php

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99

1010
final class TestMslsBlogCollection extends MslsUnitTestCase {
1111

12+
const TOTAL_USERS = 3210;
13+
1214
protected function setUp(): void {
1315
parent::setUp(); // TODO: Change the autogenerated stub
1416

17+
Functions\when( 'count_users' )->justReturn( array( 'total_users' => self::TOTAL_USERS ) );
18+
1519
$options = \Mockery::mock( MslsOptions::class );
1620
$options->shouldReceive( 'get_order' )->andReturn( 'description' );
1721
$options->shouldReceive( 'is_excluded' )->andReturn( false );
@@ -191,12 +195,41 @@ public function test_get_filtered(): void {
191195
$this->assertIsArray( $obj->get_filtered( true ) );
192196
}
193197

194-
public function test_get_users(): void {
198+
public function test_get_users_single(): void {
199+
Functions\expect( 'get_site_option' )->once()->andReturn( array() );
200+
201+
$obj = new MslsBlogCollection();
202+
203+
$this->assertIsArray( $obj->get_users( array( 'ID' ), 1 ) );
204+
}
205+
206+
public function test_get_users_massive(): void {
207+
Functions\expect( 'get_site_option' )->once()->andReturn( array() );
208+
209+
$obj = new MslsBlogCollection();
210+
211+
$this->assertIsArray( $obj->get_users( array( 'ID' ), self::TOTAL_USERS ) );
212+
}
213+
214+
public function test_get_users_max() {
195215
Functions\expect( 'get_site_option' )->once()->andReturn( array() );
196216

217+
$max_users = 100;
218+
197219
$obj = new MslsBlogCollection();
198220

199-
$this->assertIsArray( $obj->get_users() );
221+
set_error_handler(
222+
static function ( $errno, $errstr ) {
223+
restore_error_handler();
224+
throw new \Exception( $errstr, $errno );
225+
},
226+
E_ALL
227+
);
228+
229+
$this->expectException( \Exception::class );
230+
$this->expectExceptionMessage( "Multisite Language Switcher: The user list has been limited to {$max_users} users." );
231+
232+
$obj->get_users( 'all', $max_users );
200233
}
201234

202235
public function test_get_current_blog(): void {

0 commit comments

Comments
 (0)