diff --git a/includes/MslsAdmin.php b/includes/MslsAdmin.php index 6b462741..17ffa52e 100644 --- a/includes/MslsAdmin.php +++ b/includes/MslsAdmin.php @@ -382,27 +382,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 188c8853..29f2d6bf 100644 --- a/includes/MslsBlogCollection.php +++ b/includes/MslsBlogCollection.php @@ -130,12 +130,9 @@ public static function get_configured_blog_description( int $blog_id, $descripti * @return object[]|\stdClass[] */ public function get_blogs_of_reference_user( MslsOptions $options ) { - $reference_user = $options->has_value( 'reference_user' ) ? $options->reference_user : current( - $this->get_users( - 'ID', - 1 - ) - ); + $reference_user = $options->has_value( 'reference_user' ) ? + $options->reference_user : + current( $this->get_users( 'ID', 1 ) ); $blogs = get_blogs_of_user( $reference_user ); foreach ( $blogs as $key => $blog ) { @@ -305,20 +302,34 @@ 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 = MslsAdmin::MAX_REFERENCE_USERS ): array { $args = array( 'blog_id' => $this->current_blog_id, 'orderby' => 'registered', 'fields' => $fields, - 'number' => $number, + 'number' => $number > 0 ? $number : MslsAdmin::MAX_REFERENCE_USERS, 'count_total' => false, ); + if ( $number !== 1 ) { // Check total users only if not fetching a single user + $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 bd410c78..318d618c 100644 --- a/tests/phpunit/TestMslsAdmin.php +++ b/tests/phpunit/TestMslsAdmin.php @@ -116,35 +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( - '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!' - ); - - $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( '/^