File: /var/www/delta/wp-content/plugins/sitepress-multilingual-cms/classes/user/UsersByCapsRepository.php
<?php
namespace WPML\User;
use WPML\FP\Fns;
use WPML\FP\Lst;
use WPML\User\LanguagePairs\ILanguagePairs;
use function WPML\FP\pipe;
class UsersByCapsRepository {
	/** @var wpdb */
	private $wpdb;
	/** @var ILanguagePairs */
	private $languagePairs;
	public function __construct( \wpdb $wpdb, ILanguagePairs $languagePairs ) {
		$this->wpdb          = $wpdb;
		$this->languagePairs = $languagePairs;
	}
	/**
	 * @param string[] $ownedCaps
	 * @param string[] $excludeCaps
	 *
	 * @return array{
	 *     "ID": string,
	 *     "full_name": string,
	 *     "user_login": string,
	 *     "user_email": string,
	 *     "display_name": string,
	 *     "roles": string[],
	 *     "language_pairs": array{string:string[]}
	 *  }[]
	 */
	public function get( array $ownedCaps, array $excludeCaps = [] ) {
		$sql = "
			SELECT user_id
			FROM {$this->wpdb->usermeta}
			WHERE {$this->buildWhereCondition( $ownedCaps, $excludeCaps)}
		";
		$userIds = $this->wpdb->get_col( $sql );
		$buildUsers = pipe(
			Fns::map( 'get_userdata' ),
			Fns::filter( Fns::identity() ),
			Fns::map( function ( \WP_User $userData ) {
				return (object) [
					'ID'           => $userData->ID,
					'full_name'    => trim( $userData->first_name . ' ' . $userData->last_name ),
					'user_login'   => $userData->user_login,
					'user_email'   => $userData->user_email,
					'display_name' => $userData->display_name,
					'roles'        => $userData->roles
				];
			} ),
			Fns::map( function ( $user ) {
				$user->language_pairs = $this->languagePairs->get( $user->ID );
				return $user;
			} )
		);
		return $buildUsers( $userIds );
	}
	private function buildWhereCondition( array $ownedCaps, array $excludeCaps ) {
		$ownedCapsCondition = Lst::join( ' OR ', Fns::map( function ( $cap ) {
			return $this->wpdb->prepare('meta_value LIKE %s', '%' . $cap . '%' );
		}, $ownedCaps ) );
		if ( $excludeCaps ) {
			$excludeCapsCondition = ' AND ( ' . Lst::join( ' AND ', Fns::map( function ( $cap ) {
					return $this->wpdb->prepare('meta_value NOT LIKE %s', '%' . $cap . '%' );
				}, $excludeCaps ) ) . ' )';
		} else {
			$excludeCapsCondition = '';
		}
		return "meta_key = '{$this->wpdb->prefix}capabilities' AND ( $ownedCapsCondition ) $excludeCapsCondition";
	}
}