WPAS_Tickets_List::apply_ordering_criteria PHP Method

apply_ordering_criteria() public method

$wp_query->get('wpas_order_by_urgency') === true The query var 'wpas_order_by_urgency' will be set in the set_ordering_query_var() function called by the 'pre_get_posts' action hook.
Since: 3.3
public apply_ordering_criteria ( WP_Post[] $posts, WP_Query $query ) : WP_Post[]
$posts WP_Post[]
$query WP_Query
return WP_Post[]
    public function apply_ordering_criteria($posts, $query)
    {
        if ($query->get('wpas_order_by_urgency')) {
            /**
             * Hooks in WP_Query should never modify SQL based on context.
             * Instead they should modify based on a query_var so they can
             * be tested and side-effects are minimized.
             */
            /**
             * @var wpdb $wpdb
             *
             */
            global $wpdb;
            $sql = <<<SQL
SELECT 
\twpas_ticket.ID AS ticket_id,
\twpas_ticket.post_title AS ticket_title,
\twpas_reply.ID AS reply_id,
\twpas_reply.post_title AS reply_title,
\twpas_replies.reply_count AS reply_count,
\twpas_replies.latest_reply,
\twpas_ticket.post_author=wpas_reply.post_author AS client_replied_last
FROM 
\t{$wpdb->posts} AS wpas_ticket 
\tINNER JOIN {$wpdb->postmeta} AS wpas_postmeta ON wpas_ticket.ID=wpas_postmeta.post_id AND '_wpas_status'=wpas_postmeta.meta_key AND 'open'=CAST(wpas_postmeta.meta_value AS CHAR)
\tLEFT OUTER JOIN {$wpdb->posts} AS wpas_reply ON wpas_ticket.ID=wpas_reply.post_parent
\tLEFT OUTER JOIN (
\t\tSELECT
\t\t\tpost_parent AS ticket_id,
\t\t\tCOUNT(*) AS reply_count,
\t\t\tMAX(post_date) AS latest_reply
\t\tFROM
\t\t\t{$wpdb->posts}
\t\tWHERE 1=1
\t\t\tAND 'ticket_reply' = post_type
\t\tGROUP BY
\t\t\tpost_parent
\t) wpas_replies ON wpas_replies.ticket_id=wpas_reply.post_parent AND wpas_replies.latest_reply=wpas_reply.post_date 
WHERE 1=1
\tAND wpas_replies.latest_reply IS NOT NULL
\tAND 'ticket_reply'=wpas_reply.post_type
ORDER BY
\twpas_replies.latest_reply ASC
SQL;
            $no_replies = $client_replies = $agent_replies = array();
            foreach ($posts as $post) {
                $no_replies[$post->ID] = $post;
            }
            /**
             * The post order will be modifiedusing the following logic:
             *
             * 		Order 	- 	Ticket State
             *		-----   	-------------------------------------------
             * 		 1st   	- 	No reply - older since request made
             * 	 	 2nd 	- 	No reply - newer since request made
             * 	 	 3rd 	- 	Reply - older response since client replied
             * 	 	 4th 	- 	Reply - newer response since client replied
             * 	 	 5th 	- 	Reply - newer response since agent replied
             * 	 	 6th 	- 	Reply - older response since agent replied
             */
            foreach ($wpdb->get_results($sql) as $reply_post) {
                if (isset($no_replies[$reply_post->ticket_id])) {
                    if ($reply_post->client_replied_last) {
                        $client_replies[$reply_post->ticket_id] = $no_replies[$reply_post->ticket_id];
                    } else {
                        $agent_replies[$reply_post->ticket_id] = $no_replies[$reply_post->ticket_id];
                    }
                    unset($no_replies[$reply_post->ticket_id]);
                }
            }
            $posts = array_values($no_replies + $client_replies + array_reverse($agent_replies, true));
        }
        return $posts;
    }