access = $access; } /** * Everyone who gets the email. * * @param Profile $site Site. * @return array[] Items with email, name, user_id (0 for typed addresses) and source (viewer|user|address). */ public function resolve( Profile $site ) { $email = $site->email; $out = array(); $add = static function ( $address, $name, $user_id, $source ) use ( &$out ) { $key = strtolower( (string) $address ); if ( '' === $key || ! is_email( $address ) || isset( $out[ $key ] ) ) { return; } $out[ $key ] = array( 'email' => (string) $address, 'name' => (string) $name, 'user_id' => (int) $user_id, 'source' => $source, ); }; if ( ! empty( $email['to_viewers'] ) ) { foreach ( $this->viewer_ids( $site ) as $user_id ) { $user = get_userdata( $user_id ); if ( $user ) { $add( $user->user_email, $user->display_name, $user_id, 'viewer' ); } } } foreach ( isset( $email['user_ids'] ) ? (array) $email['user_ids'] : array() as $user_id ) { $user = get_userdata( (int) $user_id ); if ( $user ) { $add( $user->user_email, $user->display_name, (int) $user_id, 'user' ); } } foreach ( isset( $email['recipients'] ) ? (array) $email['recipients'] : array() as $address ) { $add( $address, '', 0, 'address' ); } return array_slice( array_values( $out ), 0, self::MAX_TOTAL ); } /** * Addresses only. * * @param Profile $site Site. * @return string[] */ public function addresses( Profile $site ) { return array_column( $this->resolve( $site ), 'email' ); } /** * Users who can view the site through a direct or role grant. * * @param Profile $site Site. * @return int[] */ public function viewer_ids( Profile $site ) { if ( ! $this->access || '' === $site->id ) { return array(); } $ids = $this->access->users_for_site( $site->id ); if ( $site->roles ) { $offset = 0; do { $page = get_users( array( 'role__in' => $site->roles, 'fields' => 'ID', 'number' => 500, 'offset' => $offset, 'orderby' => 'ID', 'order' => 'ASC', ) ); $ids = array_merge( $ids, array_map( 'intval', $page ) ); $offset += 500; $count = count( $page ); } while ( 500 === $count ); } $ids = array_values( array_unique( array_map( 'intval', $ids ) ) ); return array_values( array_filter( $ids, function ( $user_id ) use ( $site ) { return $this->access->can_view( $user_id, $site->id ); } ) ); } }