View difference between Paste ID: rZfTs9mt and eBKWVxja
SHOW: | | - or go back to the newest paste.
1
class MapView_QuasiDistanceOrdering {
2
	/**
3
	 * Set up a listener to potentially re-order location based search results.
4
	 */
5
	public function __construct() {
6
		add_action( 'tribe_events_before_view', array( $this, 'listen' ) );
7
	}
8
9
	/**
10
	 * We can only reorder by distance if the query results contain distance/geodata
11
	 * for each result.
12
	 *
13
	 * @param $template
14
	 */
15
	public function listen( $template ) {
16
		global $wp_query;
17
18
		if ( empty( $wp_query->posts ) ) return;
19
		if ( ! $this->are_distances_assigned() ) return;
20
21
		$this->quick_sort( $wp_query->posts );
22
	}
23
24
	/**
25
	 * Examine one of the posts in the query results to check if distance info
26
	 * has been assigned.
27
	 *
28
	 * @return bool
29
	 */
30
	protected function are_distances_assigned() {
31
		global $wp_query;
32
		$posts_copy = $wp_query->posts;
33
		$test_post = array_shift( $posts_copy );
34
		return isset( $test_post->distance );
35
	}
36
37
	/**
38
	 * Borrows quick sort implementation from previous incarnation
39
	 * of TribeEventsGeoLoc, in turn this borrows from the referenced
40
	 * answer on StackOverflow.
41
	 *
42
	 * @see http://stackoverflow.com/questions/1462503/sort-array-by-object-property-in-php
43
	 * @param $array
44
	 */
45
	protected function quick_sort( &$array ) {
46
		$cur           = 1;
47
		$stack[1]['l'] = 0;
48
		$stack[1]['r'] = count( $array ) - 1;
49
50
		do {
51
			$l = $stack[$cur]['l'];
52
			$r = $stack[$cur]['r'];
53
			$cur --;
54
55
			do {
56
				$i   = $l;
57
				$j   = $r;
58
				$tmp = $array[(int) ( ( $l + $r ) / 2 )];
59
60
				do {
61
					/* Divide... */
62
					while ( $array[$i]->distance < $tmp->distance ) {
63
						$i ++;
64
					}
65
66
					while ( $tmp->distance < $array[$j]->distance ) {
67
						$j --;
68
					}
69
70
					/* ...and conquer! */
71
					if ( $i <= $j ) {
72
						$w         = $array[$i];
73
						$array[$i] = $array[$j];
74
						$array[$j] = $w;
75
76
						$i ++;
77
						$j --;
78
					}
79
80
				} while ( $i <= $j );
81
82
				if ( $i < $r ) {
83
					$cur ++;
84
					$stack[$cur]['l'] = $i;
85
					$stack[$cur]['r'] = $r;
86
				}
87
				$r = $j;
88
89
			} while ( $l < $r );
90
91
		} while ( $cur != 0 );
92
	}
93
}
94
95
new MapView_QuasiDistanceOrdering;