From 948522c5995a93f73a5288072480f5563fb0137c Mon Sep 17 00:00:00 2001 From: jose-gonzalez-motork <139996590+jose-gonzalez-motork@users.noreply.github.com> Date: Mon, 29 Dec 2025 10:53:04 +0100 Subject: [PATCH 1/5] Increase the max users limit --- includes/MslsAdmin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/MslsAdmin.php b/includes/MslsAdmin.php index 5120dfd0..4f9e6363 100644 --- a/includes/MslsAdmin.php +++ b/includes/MslsAdmin.php @@ -35,7 +35,7 @@ final class MslsAdmin extends MslsMain { * * @var int */ - public const MAX_REFERENCE_USERS = 100; + public const MAX_REFERENCE_USERS = 200; /** * @codeCoverageIgnore From 2b1229d19ed77abfc0874b2693d27af78b889b81 Mon Sep 17 00:00:00 2001 From: jose-gonzalez-motork <139996590+jose-gonzalez-motork@users.noreply.github.com> Date: Mon, 29 Dec 2025 17:10:35 +0100 Subject: [PATCH 2/5] Update TestMslsAdmin.php --- tests/phpunit/TestMslsAdmin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/TestMslsAdmin.php b/tests/phpunit/TestMslsAdmin.php index bd410c78..f92801d1 100644 --- a/tests/phpunit/TestMslsAdmin.php +++ b/tests/phpunit/TestMslsAdmin.php @@ -138,7 +138,7 @@ static function ( $errno, $errstr ) { $this->expectException( \Exception::class ); $this->expectExceptionMessage( - '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!' + 'Multisite Language Switcher: Collection for reference user has been truncated because it exceeded the maximum of 200 users. Please, use the hook "msls_reference_users" to filter the result before!' ); $obj->reference_user(); From 203572e7363dc08965150b847a5cbf7ede06d484 Mon Sep 17 00:00:00 2001 From: jose-gonzalez-motork <139996590+jose-gonzalez-motork@users.noreply.github.com> Date: Mon, 29 Dec 2025 17:12:44 +0100 Subject: [PATCH 3/5] Update TestMslsAdmin.php Replace the number with the constant --- tests/phpunit/TestMslsAdmin.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/phpunit/TestMslsAdmin.php b/tests/phpunit/TestMslsAdmin.php index f92801d1..fdf3dbd4 100644 --- a/tests/phpunit/TestMslsAdmin.php +++ b/tests/phpunit/TestMslsAdmin.php @@ -138,7 +138,10 @@ static function ( $errno, $errstr ) { $this->expectException( \Exception::class ); $this->expectExceptionMessage( - 'Multisite Language Switcher: Collection for reference user has been truncated because it exceeded the maximum of 200 users. Please, use the hook "msls_reference_users" to filter the result before!' + sprintf( + '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!', + MslsAdmin::MAX_REFERENCE_USERS + ) ); $obj->reference_user(); From b94529849119be6f02c8a669e85aacc9c5b01131 Mon Sep 17 00:00:00 2001 From: Dennis Ploetner Date: Mon, 12 Jan 2026 16:24:45 +0100 Subject: [PATCH 4/5] New logic for max_users implemented --- includes/MslsAdmin.php | 26 ++++++------------- includes/MslsBlogCollection.php | 23 ++++++++++++++--- tests/phpunit/TestMslsAdmin.php | 33 ++---------------------- tests/phpunit/TestMslsBlogCollection.php | 23 +++++++++++++++++ 4 files changed, 52 insertions(+), 53 deletions(-) diff --git a/includes/MslsAdmin.php b/includes/MslsAdmin.php index 4f9e6363..637d3857 100644 --- a/includes/MslsAdmin.php +++ b/includes/MslsAdmin.php @@ -35,7 +35,7 @@ final class MslsAdmin extends MslsMain { * * @var int */ - public const MAX_REFERENCE_USERS = 200; + public const MAX_REFERENCE_USERS = 100; /** * @codeCoverageIgnore @@ -378,27 +378,17 @@ public function admin_display(): void { * Shows the select-form-field 'reference_user' */ public function reference_user(): void { - $users = array(); + $max_users = (int) apply_filters( 'msls_max_reference_users_count', self::MAX_REFERENCE_USERS ); - foreach ( (array) apply_filters( 'msls_reference_users', $this->collection->get_users() ) as $user ) { - $users[ $user->ID ] = $user->user_nicename; - } - - if ( count( $users ) > self::MAX_REFERENCE_USERS ) { - $users = array_slice( $users, 0, self::MAX_REFERENCE_USERS, true ); + $users_collection = $this->collection->get_users( array( 'ID', 'user_nicename' ), $max_users ); - /* translators: %s: maximum number of users */ - $format = __( - '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!', - 'multisite-language-switcher' - ); - - // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error - trigger_error( esc_html( sprintf( $format, strval( self::MAX_REFERENCE_USERS ) ) ) ); - } + $reference_users = (array) apply_filters( + 'msls_reference_users', + wp_list_pluck( $users_collection, 'user_nicename', 'ID' ) + ); // phpcs:ignore WordPress.Security.EscapeOutput - echo ( new Select( 'reference_user', $users, strval( $this->options->reference_user ) ) )->render(); + echo ( new Select( 'reference_user', $reference_users, strval( $this->options->reference_user ) ) )->render(); } /** diff --git a/includes/MslsBlogCollection.php b/includes/MslsBlogCollection.php index 5cdf86ad..7ac4db8f 100644 --- a/includes/MslsBlogCollection.php +++ b/includes/MslsBlogCollection.php @@ -301,20 +301,35 @@ public function get_filtered( bool $filter = false ): array { /** * Gets the registered users of the current blog * - * @param string $fields - * @param int|string $number + * @param string|string[] $fields + * @param int $number * * @return array */ - public function get_users( $fields = 'all', $number = '' ) { + public function get_users( $fields = 'all', int $number = 0 ): array { $args = array( 'blog_id' => $this->current_blog_id, 'orderby' => 'registered', 'fields' => $fields, - 'number' => $number, 'count_total' => false, ); + if ( $number > 1 ) { + $args['number'] = $number; + + $user_count = count_users(); + if ( isset( $user_count['total_users'] ) && $user_count['total_users'] > $number ) { + /* translators: %s: maximum number of users */ + $format = __( + 'Multisite Language Switcher: The user list has been limited to %d users.', + 'multisite-language-switcher' + ); + + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error + trigger_error( esc_html( sprintf( $format, strval( $number ) ) ) ); + } + } + $args = (array) apply_filters( 'msls_get_users', $args ); return get_users( $args ); diff --git a/tests/phpunit/TestMslsAdmin.php b/tests/phpunit/TestMslsAdmin.php index fdf3dbd4..318d618c 100644 --- a/tests/phpunit/TestMslsAdmin.php +++ b/tests/phpunit/TestMslsAdmin.php @@ -116,38 +116,9 @@ public function test_admin_display(): void { $obj->admin_display(); } - public function test_reference_user(): void { - $users = array(); - $too_much = MslsAdmin::MAX_REFERENCE_USERS + 1; - for ( $i = 1; $i <= $too_much; $i++ ) { - $users[] = (object) array( - 'ID' => $i, - 'user_nicename' => 'realloc', - ); - } - - $obj = $this->MslsAdminFactory( $users ); - - set_error_handler( - static function ( $errno, $errstr ) { - restore_error_handler(); - throw new \Exception( $errstr, $errno ); - }, - E_ALL - ); - - $this->expectException( \Exception::class ); - $this->expectExceptionMessage( - sprintf( - '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!', - MslsAdmin::MAX_REFERENCE_USERS - ) - ); - - $obj->reference_user(); - } - public function test_reference_user_over_max(): void { + $users = array( 1 => 'realloc' ); + Functions\expect( 'wp_list_pluck' )->once()->andReturn( $users ); $obj = $this->MslsAdminFactory(); $this->expectOutputRegex( '/^