HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux wordpress-ubuntu-s-2vcpu-4gb-fra1-01 5.4.0-169-generic #187-Ubuntu SMP Thu Nov 23 14:52:28 UTC 2023 x86_64
User: root (0)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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";
	}
}