PluginProbe
Property Hive / 1.4.49
Property Hive v1.4.49
2.3.1 2.3.0 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 1.4.46 1.4.47 1.4.48 1.4.49 1.4.5 1.4.50 1.4.51 1.4.52 1.4.53 1.4.54 1.4.55 1.4.56 1.4.57 1.4.58 1.4.59 1.4.6 1.4.60 1.4.61 All 261 releases
propertyhive / includes / class-ph-query.php

class-ph-query.php in Property Hive 1.4.49, at includes/class-ph-query.php

1,704 lines 50.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Contains the query functions for PropertyHive which alter the front-end post queries and loops.
4 *
5 * @class PH_Query
6 * @version 1.0.0
7 * @package PropertyHive/Classes
8 * @category Class
9 * @author PropertyHive
10 */
11
12 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
13
14 if ( ! class_exists( 'PH_Query' ) ) :
15
16 /**
17 * PH_Query Class
18 */
19 class PH_Query {
20
21 /** @public array Query vars to add to wp */
22 public $query_vars = array();
23
24 /** @public array Unfiltered property ids (before layered nav etc) */
25 public $unfiltered_property_ids = array();
26
27 /** @public array Filtered property ids (after layered nav) */
28 public $filtered_property_ids = array();
29
30 /** @public array Filtered property ids (after layered nav, per taxonomy) */
31 public $filtered_property_ids_for_taxonomy = array();
32
33 /** @public array property IDs that match the layered nav + price filter */
34 public $post__in = array();
35
36 /** @public array The meta query for the page */
37 public $meta_query = '';
38
39 /** @public array Post IDs matching layered nav only */
40 public $layered_nav_post__in = array();
41
42 /** @public array Stores post IDs matching layered nav, so price filter can find max price in view */
43 public $layered_nav_property_ids = array();
44
45 /**
46 * Constructor for the query class. Hooks in methods.
47 *
48 * @access public
49 */
50 public function __construct() {
51
52 //add_action( 'init', array( $this, 'add_endpoints' ) );
53 add_action( 'init', array( $this, 'layered_nav_init' ) );
54 add_action( 'init', array( $this, 'price_filter_init' ) );
55
56 if ( ! is_admin() ) {
57 add_action( 'init', array( $this, 'get_errors' ) );
58 add_filter( 'query_vars', array( $this, 'add_query_vars'), 0 );
59 add_action( 'parse_request', array( $this, 'parse_request'), 0 );
60 add_filter( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
61 add_filter( 'the_posts', array( $this, 'the_posts' ), 11, 2 );
62 add_action( 'wp', array( $this, 'remove_property_query' ) );
63 add_action( 'wp', array( $this, 'remove_ordering_args' ) );
64 }
65
66 $this->init_query_vars();
67 }
68
69 /**
70 * Init query vars by loading options.
71 */
72 public function init_query_vars() {
73 // Query vars to add to WP
74 $this->query_vars = array(
75
76 );
77 }
78
79 /**
80 * Get any errors from querystring
81 */
82 public function get_errors() {
83 if ( ! empty( $_GET['ph_error'] ) && ( $error = sanitize_text_field( $_GET['ph_error'] ) ) && ! ph_has_notice( $error, 'error' ) )
84 ph_add_notice( $error, 'error' );
85 }
86
87 /**
88 * Add endpoints for query vars
89 */
90 public function add_endpoints() {
91 foreach ( $this->query_vars as $key => $var )
92 add_rewrite_endpoint( $var, EP_PAGES );
93 }
94
95 /**
96 * add_query_vars function.
97 *
98 * @access public
99 * @param array $vars
100 * @return array
101 */
102 public function add_query_vars( $vars ) {
103 foreach ( $this->query_vars as $key => $var )
104 $vars[] = $key;
105
106 return $vars;
107 }
108
109 /**
110 * Get query vars
111 * @return array()
112 */
113 public function get_query_vars() {
114 return $this->query_vars;
115 }
116
117 /**
118 * Parse the request and look for query vars - endpoints may not be supported
119 */
120 public function parse_request() {
121 global $wp;
122
123 // Map query vars to their keys, or get them if endpoints are not supported
124 foreach ( $this->query_vars as $key => $var ) {
125 if ( isset( $_GET[ $var ] ) ) {
126 $wp->query_vars[ $key ] = sanitize_text_field( wp_unslash( $_GET[ $var ] ) );
127 }
128
129 elseif ( isset( $wp->query_vars[ $var ] ) ) {
130 $wp->query_vars[ $key ] = $wp->query_vars[ $var ];
131 }
132 }
133 }
134
135 /**
136 * Hook into pre_get_posts to do the main property query
137 *
138 * @access public
139 * @param mixed $q query object
140 * @return void
141 */
142 public function pre_get_posts( $q ) {
143 // We only want to affect the main query
144 if ( ! $q->is_main_query() )
145 return;
146
147 // Fix for verbose page rules
148 if ( $GLOBALS['wp_rewrite']->use_verbose_page_rules && isset( $q->queried_object->ID ) && $q->queried_object->ID == ph_get_page_id( 'search_results' ) ) {
149 $q->set( 'post_type', 'property' );
150 $q->set( 'page', '' );
151 $q->set( 'pagename', '' );
152
153 // Fix conditional Functions
154 $q->is_archive = true;
155 $q->is_post_type_archive = true;
156 $q->is_singular = false;
157 $q->is_page = false;
158 }
159
160 // When orderby is set, WordPress shows posts. Get around that here.
161 if ( ($q->is_home() || $q->get( 'page_id' ) == get_option('page_on_front')) && 'page' == get_option('show_on_front') && get_option('page_on_front') == ph_get_page_id('search_results') )
162 {
163 $_query = wp_parse_args( $q->query );
164 if ( empty( $_query ) || ! array_diff( array_keys( $_query ), array( 'preview', 'page', 'paged', 'cpage', 'orderby' ) ) )
165 {
166
167 $q->is_page = true;
168 $q->is_home = false;
169 $q->set( 'page_id', (int) get_option('page_on_front') );
170 $q->set( 'post_type', 'property' );
171 }
172 }
173
174 // Special check for sites with the property search results on front page
175 if ( $q->is_page() && 'page' == get_option( 'show_on_front' ) && $q->get('page_id') == ph_get_page_id('search_results') ) {
176
177 // This is a front-page property listings
178 $q->set( 'post_type', 'property' );
179 $q->set( 'page_id', '' );
180 if ( isset( $q->query['paged'] ) )
181 $q->set( 'paged', $q->query['paged'] );
182
183 // Define a variable so we know this is the front page search results later on
184 define( 'SEARCH_RESULTS_IS_ON_FRONT', true );
185
186 // Get the actual WP page to avoid errors and let us use is_front_page()
187 // This is hacky but works. Awaiting http://core.trac.wordpress.org/ticket/21096
188 global $wp_post_types;
189
190 $search_results_page = get_post( ph_get_page_id('search_results') );
191 $q->is_page = true;
192
193 $wp_post_types['property']->ID = $search_results_page->ID;
194 $wp_post_types['property']->post_title = $search_results_page->post_title;
195 $wp_post_types['property']->post_name = $search_results_page->post_name;
196 $wp_post_types['property']->post_type = $search_results_page->post_type;
197 $wp_post_types['property']->ancestors = get_ancestors( $search_results_page->ID, $search_results_page->post_type );
198
199 // Fix conditional Functions like is_front_page
200 $q->is_singular = false;
201 $q->is_post_type_archive = true;
202 $q->is_archive = true;
203
204 // Fix WP SEO
205 if ( class_exists( 'WPSEO_Meta' ) ) {
206 add_filter( 'wpseo_metadesc', array( $this, 'wpseo_metadesc' ) );
207 add_filter( 'wpseo_metakey', array( $this, 'wpseo_metakey' ) );
208 }
209
210 } else {
211
212 // Only apply to property categories, the property post archive, the search results page, and property attribute taxonomies
213 if ( ! $q->is_post_type_archive( 'property' ) && ! $q->is_tax( get_object_taxonomies( 'property' ) ) )
214 return;
215
216 }
217
218 $this->property_query( $q );
219
220 if ( is_search() )
221 {
222 add_filter( 'posts_where', array( $this, 'search_post_excerpt' ) );
223 add_filter( 'wp', array( $this, 'remove_posts_where' ) );
224 }
225
226 add_filter( 'posts_where', array( $this, 'exclude_protected_properties' ) );
227
228 // We're on a property search page so queue the propertyhive_get_properties_in_view function
229 //add_action( 'wp', array( $this, 'get_properties_in_view' ), 2);
230
231 // And remove the pre_get_posts hook
232 $this->remove_property_query();
233 }
234
235 /**
236 * search_post_excerpt function.
237 *
238 * @access public
239 * @param string $where (default: '')
240 * @return string (modified where clause)
241 */
242 public function search_post_excerpt( $where = '' ) {
243 /*global $wp_the_query;
244
245 // If this is not a PH Query, do not modify the query
246 if ( empty( $wp_the_query->query_vars['ph_query'] ) || empty( $wp_the_query->query_vars['s'] ) )
247 return $where;
248
249 $where = preg_replace(
250 "/post_title\s+LIKE\s*(\'\%[^\%]+\%\')/",
251 "post_title LIKE $1) OR (post_excerpt LIKE $1", $where );*/
252
253 return $where;
254 }
255
256 /**
257 * Prevent password protected properties appearing in the loops
258 *
259 * @param string $where
260 * @return string
261 */
262 public function exclude_protected_properties( $where ) {
263 global $wpdb;
264 $where .= " AND {$wpdb->posts}.post_password = ''";
265 return $where;
266 }
267
268 /**
269 * wpseo_metadesc function.
270 * Hooked into wpseo_ hook already, so no need for function_exist
271 *
272 * @access public
273 * @return string
274 */
275 public function wpseo_metadesc() {
276 return WPSEO_Meta::get_value( 'metadesc', ph_get_page_id('search_results') );
277 }
278
279
280 /**
281 * wpseo_metakey function.
282 * Hooked into wpseo_ hook already, so no need for function_exist
283 *
284 * @access public
285 * @return string
286 */
287 public function wpseo_metakey() {
288 return WPSEO_Meta::get_value( 'metakey', ph_get_page_id('search_results') );
289 }
290
291
292 /**
293 * Hook into the_posts to do the main property query if needed - relevanssi compatibility
294 *
295 * @access public
296 * @param array $posts
297 * @param WP_Query|bool $query (default: false)
298 * @return array
299 */
300 public function the_posts( $posts, $query = false ) {
301
302 // Abort if there's no query
303 if ( ! $query )
304 return $posts;
305
306 // Abort if we're not filtering posts
307 if ( empty( $this->post__in ) )
308 return $posts;
309
310 // Abort if this query has already been done
311 if ( ! empty( $query->ph_query ) )
312 return $posts;
313
314 // Abort if this isn't a search query
315 if ( empty( $query->query_vars["s"] ) )
316 return $posts;
317
318 // Abort if we're not on a post type archive/property taxonomy
319 if ( ! $query->is_post_type_archive( 'property' ) && ! $query->is_tax( get_object_taxonomies( 'property' ) ) )
320 return $posts;
321
322 $filtered_posts = array();
323 $queried_post_ids = array();
324
325 foreach ( $posts as $post ) {
326 if ( in_array( $post->ID, $this->post__in ) ) {
327 $filtered_posts[] = $post;
328 $queried_post_ids[] = $post->ID;
329 }
330 }
331
332 $query->posts = $filtered_posts;
333 $query->post_count = count( $filtered_posts );
334
335 // Ensure filters are set
336 $this->unfiltered_property_ids = $queried_post_ids;
337 $this->filtered_property_ids = $queried_post_ids;
338
339 if ( sizeof( $this->layered_nav_post__in ) > 0 ) {
340 $this->layered_nav_property_ids = array_intersect( $this->unfiltered_property_ids, $this->layered_nav_post__in );
341 } else {
342 $this->layered_nav_property_ids = $this->unfiltered_property_ids;
343 }
344
345 return $filtered_posts;
346 }
347
348
349 /**
350 * Query the properties, applying sorting/ordering etc. This applies to the main wordpress loop
351 *
352 * @access public
353 * @param mixed $q
354 * @return void
355 */
356 public function property_query( $q ) {
357
358 // Meta query
359 $meta_query = $this->get_meta_query( $q );
360
361 // Tax query
362 $tax_query = $this->get_tax_query( $q->get( 'tax_query' ) );
363
364 // Date query
365 $date_query = $this->get_date_query();
366
367 // Ordering
368 $ordering = $this->get_search_results_ordering_args();
369
370 // Get a list of post id's which match the current filters set (in the layered nav and price filter)
371 $post__in = array();
372 //$post__in = array_unique( apply_filters( 'loop_shop_post_in', array() ) );
373
374 // Ordering query vars
375 $q->set( 'orderby', $ordering['orderby'] );
376 $q->set( 'order', $ordering['order'] );
377 if ( isset( $ordering['meta_key'] ) )
378 $q->set( 'meta_key', $ordering['meta_key'] );
379
380 // Query vars that affect posts shown
381 $q->set( 'meta_query', $meta_query );
382 $q->set( 'tax_query', $tax_query );
383 $q->set( 'date_query', $date_query );
384 $q->set( 'post__in', $post__in );
385 $q->set( 'posts_per_page', $q->get( 'posts_per_page' ) ? $q->get( 'posts_per_page' ) : apply_filters( 'loop_search_results_per_page', get_option( 'posts_per_page' ) ) );
386
387 // Set a special variable
388 $q->set( 'ph_query', true );
389
390 // Store variables
391 $this->post__in = $post__in;
392 $this->meta_query = $meta_query;
393 $this->tax_query = $tax_query;
394
395 do_action( 'propertyhive_property_query', $q, $this );
396 }
397
398
399 /**
400 * Remove the query
401 *
402 * @access public
403 * @return void
404 */
405 public function remove_property_query() {
406 remove_filter( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
407 }
408
409 /**
410 * Remove ordering queries
411 */
412 public function remove_ordering_args() {
413
414 }
415
416 /**
417 * Remove the posts_where filter
418 *
419 * @access public
420 * @return void
421 */
422 public function remove_posts_where() {
423 remove_filter( 'posts_where', array( $this, 'search_post_excerpt' ) );
424 }
425
426
427 /**
428 * Get an unpaginated list all property ID's (both filtered and unfiltered). Makes use of transients.
429 *
430 * @access public
431 * @return void
432 */
433 public function get_properties_in_view() {
434 global $wp_the_query;
435
436 $unfiltered_property_ids = array();
437
438 // Get main query
439 $current_wp_query = $wp_the_query->query;
440
441 // Get WP Query for current page (without 'paged')
442 unset( $current_wp_query['paged'] );
443
444 // Generate a transient name based on current query
445 $transient_name = 'ph_uf_pid_' . md5( http_build_query( $current_wp_query ) );
446 $transient_name = ( is_search() ) ? $transient_name . '_s' : $transient_name;
447
448 if ( false === ( $unfiltered_property_ids = get_transient( $transient_name ) ) ) {
449
450 // Get all visible posts, regardless of filters
451 $unfiltered_property_ids = get_posts(
452 array_merge(
453 $current_wp_query,
454 array(
455 'post_type' => 'property',
456 'numberposts' => -1,
457 'post_status' => 'publish',
458 'meta_query' => $this->meta_query,
459 'fields' => 'ids',
460 'no_found_rows' => true,
461 'update_post_meta_cache' => false,
462 'update_post_term_cache' => false
463 )
464 )
465 );
466
467 set_transient( $transient_name, $unfiltered_property_ids, YEAR_IN_SECONDS );
468 }
469
470 // Store the variable
471 $this->unfiltered_property_ids = $unfiltered_property_ids;
472
473 // Also store filtered posts ids...
474 if ( sizeof( $this->post__in ) > 0 )
475 $this->filtered_property_ids = array_intersect( $this->unfiltered_property_ids, $this->post__in );
476 else
477 $this->filtered_property_ids = $this->unfiltered_property_ids;
478
479 // And filtered post ids which just take layered nav into consideration (to find max price in the price widget)
480 if ( sizeof( $this->layered_nav_post__in ) > 0 )
481 $this->layered_nav_property_ids = array_intersect( $this->unfiltered_property_ids, $this->layered_nav_post__in );
482 else
483 $this->layered_nav_property_ids = $this->unfiltered_property_ids;
484 }
485
486
487 /**
488 * Returns an array of arguments for ordering properties based on the selected values
489 *
490 * @access public
491 * @return array
492 */
493 public function get_search_results_ordering_args( $orderby = '', $order = '' ) {
494 // Get ordering from query string unless defined
495 if ( ! $orderby ) {
496 $orderby_value = isset( $_GET['orderby'] ) ? sanitize_text_field( $_GET['orderby'] ) : apply_filters( 'propertyhive_default_search_results_orderby', get_option( 'propertyhive_default_search_results_orderby' ) );
497
498 // Get order + orderby args from string
499 $orderby_value = explode( '-', $orderby_value );
500 $orderby = esc_attr( $orderby_value[0] );
501 $order = ! empty( $orderby_value[1] ) ? $orderby_value[1] : $order;
502 }
503
504 $orderby = strtolower( $orderby );
505 $order = strtoupper( $order );
506
507 $args = array();
508
509 // default - menu_order
510 if (
511 ( isset($_REQUEST['department']) && $_REQUEST['department'] != 'commercial' ) ||
512 ( !isset($_REQUEST['department']) && get_option( 'propertyhive_primary_department' ) != 'commercial' )
513 )
514 {
515 $args['orderby'] = 'meta_value_num';
516 $args['order'] = $order == 'ASC' ? 'ASC' : 'DESC';
517 $args['meta_key'] = '_price_actual';
518 }
519 elseif (
520 ( isset($_REQUEST['department']) && $_REQUEST['department'] == 'commercial' ) ||
521 ( !isset($_REQUEST['department']) && get_option( 'propertyhive_primary_department' ) == 'commercial' )
522 )
523 {
524 $args['orderby'] = 'meta_value_num';
525 $args['order'] = $order == 'ASC' ? 'ASC' : 'DESC';
526 $args['meta_key'] = '_floor_area_from_sqft';
527 }
528
529 switch ( $orderby ) {
530 case 'price' :
531 $args['orderby'] = 'meta_value_num';
532 $args['order'] = $order == 'ASC' ? 'ASC' : 'DESC';
533 if (
534 ( isset($_REQUEST['department']) && $_REQUEST['department'] == 'commercial' ) ||
535 ( !isset($_REQUEST['department']) && get_option( 'propertyhive_primary_department' ) == 'commercial' )
536 )
537 {
538 $args['meta_key'] = '_price_from_actual';
539 }
540 else
541 {
542 $args['meta_key'] = '_price_actual';
543 }
544 break;
545 case 'floor_area' :
546 $args['orderby'] = 'meta_value_num';
547 $args['order'] = $order == 'ASC' ? 'ASC' : 'DESC';
548 $args['meta_key'] = '_floor_area_from_sqft';
549 break;
550 default :
551 {
552 if ( $orderby != '' )
553 {
554 $args['orderby'] = $orderby;
555 $args['order'] = $order == 'ASC' ? 'ASC' : 'DESC';
556 }
557 }
558 }
559
560 return apply_filters( 'propertyhive_get_search_results_ordering_args', $args );
561 }
562
563 /**
564 * Appends date queries to an array.
565 * @access public
566 * @param array $meta_query
567 * @return array
568 */
569 public function get_date_query() {
570
571 $date_query = array();
572
573 if ( isset( $_REQUEST['added_from'] ) && $_REQUEST['added_from'] != '' )
574 {
575 $date_query = array(
576 'column' => 'post_date_gmt',
577 'after' => sanitize_text_field( $_REQUEST['added_from'] )
578 );
579 }
580
581 if ( isset( $_REQUEST['added_from_hours'] ) && $_REQUEST['added_from_hours'] != '' )
582 {
583 $date_query = array(
584 'column' => 'post_date_gmt',
585 'after' => sanitize_text_field( $_REQUEST['added_from_hours'] ) . ' hours ago'
586 );
587 }
588
589 return array_filter( $date_query );
590 }
591
592 /**
593 * Appends meta queries to an array.
594 * @access public
595 * @param array $meta_query
596 * @return array
597 */
598 public function get_meta_query( $q = array() ) {
599
600 $meta_query = array();
601 if ( !empty($q) )
602 {
603 $meta_query = $q->get( 'meta_query' );
604 }
605
606 if ( ! is_array( $meta_query ) )
607 $meta_query = array();
608
609 $meta_query[] = $this->on_market_meta_query();
610 $meta_query[] = $this->department_meta_query($q);
611 $meta_query[] = $this->address_keyword_meta_query();
612 $meta_query[] = $this->country_meta_query();
613 $meta_query[] = $this->minimum_price_meta_query();
614 $meta_query[] = $this->maximum_price_meta_query();
615 $meta_query[] = $this->price_range_meta_query();
616 $meta_query[] = $this->minimum_rent_meta_query();
617 $meta_query[] = $this->maximum_rent_meta_query();
618 $meta_query[] = $this->rent_range_meta_query();
619 $meta_query[] = $this->bedrooms_meta_query();
620 $meta_query[] = $this->minimum_bedrooms_meta_query();
621 $meta_query[] = $this->maximum_bedrooms_meta_query();
622 $meta_query[] = $this->minimum_bathrooms_meta_query();
623 $meta_query[] = $this->maximum_bathrooms_meta_query();
624 $meta_query[] = $this->minimum_reception_rooms_meta_query();
625 $meta_query[] = $this->maximum_reception_rooms_meta_query();
626 $meta_query[] = $this->available_date_from_meta_query();
627 $meta_query[] = $this->minimum_floor_area_meta_query();
628 $meta_query[] = $this->maximum_floor_area_meta_query();
629 $meta_query[] = $this->minimum_maximum_floor_area_meta_query();
630 $meta_query[] = $this->floor_area_range_meta_query();
631 $meta_query[] = $this->commercial_for_sale_to_rent_meta_query();
632 $meta_query[] = $this->commercial_for_sale_meta_query();
633 $meta_query[] = $this->commercial_to_rent_meta_query();
634 $meta_query[] = $this->negotiator_meta_query();
635 $meta_query[] = $this->office_meta_query();
636
637 return array_filter( apply_filters( 'propertyhive_property_query_meta_query', $meta_query, $this ) );
638 }
639
640 /**
641 * Returns a meta query to handle property on market status
642 *
643 * @access public
644 * @param string $compare (default: 'IN')
645 * @return array
646 */
647 public function on_market_meta_query( ) {
648
649 $meta_query = array();
650
651 if ( !is_admin() )
652 {
653 $meta_query = array(
654 'key' => '_on_market',
655 'value' => 'yes',
656 'compare' => '='
657 );
658 }
659
660 return $meta_query;
661 }
662
663 /**
664 * Returns a meta query to handle property department
665 *
666 * @access public
667 * @return array
668 */
669 public function department_meta_query( $q ) {
670
671 $meta_query = array();
672
673 if ( isset( $_REQUEST['department'] ) && $_REQUEST['department'] != '' )
674 {
675 $meta_query = array(
676 'key' => '_department',
677 'value' => sanitize_text_field( $_REQUEST['department'] ),
678 'compare' => '='
679 );
680 }
681 else
682 {
683 // Need a department set if on search results page
684 if (!empty($q) && $q->is_post_type_archive( 'property' ))
685 {
686 if (get_option( 'propertyhive_primary_department' ) != '')
687 {
688 $department = get_option( 'propertyhive_primary_department' );
689 }
690 else
691 {
692 // No primary department set. Use first active one. Should never get to this scenario
693 $department = '';
694
695 $departments = ph_get_departments();
696
697 foreach ( $departments as $key => $value )
698 {
699 if ( get_option( 'propertyhive_active_departments_' . str_replace("residential-", "", $key) ) == 'yes' )
700 {
701 if ( $department == '' )
702 {
703 $department = $key;
704 }
705 }
706 }
707 }
708 $meta_query = array(
709 'key' => '_department',
710 'value' => $department,
711 'compare' => '='
712 );
713 }
714 }
715
716 return $meta_query;
717 }
718
719 /**
720 * Returns a meta query to handle searching for a keyword in the address
721 *
722 * @access public
723 * @param string $compare (default: 'IN')
724 * @return array
725 */
726 public function address_keyword_meta_query( ) {
727
728 $meta_query = array();
729
730 if ( isset( $_REQUEST['address_keyword'] ) && $_REQUEST['address_keyword'] != '' )
731 {
732 $_REQUEST['address_keyword'] = ph_clean( wp_unslash( $_REQUEST['address_keyword'] ) );
733
734 // Remove country code from end (i.e. ', UK')
735 $_REQUEST['address_keyword'] = preg_replace('/\,\s?[A-Z][A-Z]$/', '', $_REQUEST['address_keyword']);
736
737 $address_keywords = array( $_REQUEST['address_keyword'] );
738
739 if ( strpos( $_REQUEST['address_keyword'], ' ' ) !== FALSE )
740 {
741 $address_keywords[] = str_replace(" ", "-", ph_clean($_REQUEST['address_keyword']));
742 }
743 if ( strpos( $_REQUEST['address_keyword'], '-' ) !== FALSE )
744 {
745 $address_keywords[] = str_replace("-", " ", ph_clean($_REQUEST['address_keyword']));
746 }
747
748 $meta_query = array('relation' => 'OR');
749
750 $address_fields_to_query = array(
751 '_reference_number',
752 '_address_street',
753 '_address_two',
754 '_address_three',
755 '_address_four',
756 '_address_postcode'
757 );
758
759 $address_fields_to_query = apply_filters( 'propertyhive_address_fields_to_query', $address_fields_to_query );
760
761 foreach ( $address_keywords as $address_keyword )
762 {
763 foreach ( $address_fields_to_query as $address_field )
764 {
765 if ( $address_field == '_address_postcode' ) { continue; } // ignore postcode as that is handled differently afterwards
766
767 $meta_query[] = array(
768 'key' => $address_field,
769 'value' => $address_keyword,
770 'compare' => get_option( 'propertyhive_address_keyword_compare', '=' )
771 );
772 }
773 }
774 if ( in_array('_address_postcode', $address_fields_to_query) )
775 {
776 if ( strlen($_REQUEST['address_keyword']) <= 4 )
777 {
778 $meta_query[] = array(
779 'key' => '_address_postcode',
780 'value' => ph_clean( $_REQUEST['address_keyword'] ),
781 'compare' => '='
782 );
783 $meta_query[] = array(
784 'key' => '_address_postcode',
785 'value' => '^' . ph_clean( $_REQUEST['address_keyword'] ) . '[ ]',
786 'compare' => 'RLIKE'
787 );
788 }
789 else
790 {
791 $meta_query[] = array(
792 'key' => '_address_postcode',
793 'value' => ph_clean( $_REQUEST['address_keyword'] ),
794 'compare' => 'LIKE'
795 );
796 }
797 }
798 }
799
800 return $meta_query;
801 }
802
803 /**
804 * Returns a meta query to handle country
805 *
806 * @access public
807 * @return array
808 */
809 public function country_meta_query( ) {
810
811 $meta_query = array();
812
813 if ( isset( $_REQUEST['country'] ) && $_REQUEST['country'] != '' )
814 {
815 $meta_query = array(
816 'key' => '_address_country',
817 'value' => ph_clean( $_REQUEST['country'] )
818 );
819 }
820
821 return $meta_query;
822 }
823
824 /**
825 * Returns a meta query to handle minimum price
826 *
827 * @access public
828 * @return array
829 */
830 public function minimum_price_meta_query( ) {
831
832 $meta_query = array();
833
834 if (
835 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales' &&
836 isset( $_REQUEST['minimum_price'] ) && $_REQUEST['minimum_price'] != ''
837 )
838 {
839 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
840
841 $minimum_price = $_REQUEST['minimum_price'];
842 if ( $search_form_currency != 'GBP' )
843 {
844 // Convert $_REQUEST['minimum_price'] to GBP
845 $ph_countries = new PH_Countries();
846
847 $minimum_price = $ph_countries->convert_price_to_gbp( $minimum_price, $search_form_currency );
848 }
849
850 $meta_query = array(
851 'key' => '_price_actual',
852 'value' => ph_clean( floor( $minimum_price ) ),
853 'compare' => '>=',
854 'type' => 'NUMERIC'
855 );
856 }
857
858 return $meta_query;
859 }
860
861 /**
862 * Returns a meta query to handle maximum price
863 *
864 * @access public
865 * @return array
866 */
867 public function maximum_price_meta_query( ) {
868
869 $meta_query = array();
870
871 if (
872 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales' &&
873 isset( $_REQUEST['maximum_price'] ) && $_REQUEST['maximum_price'] != ''
874 )
875 {
876 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
877
878 $maximum_price = $_REQUEST['maximum_price'];
879 if ( $search_form_currency != 'GBP' )
880 {
881 // Convert $_REQUEST['maximum_price'] to GBP
882 $ph_countries = new PH_Countries();
883
884 $maximum_price = $ph_countries->convert_price_to_gbp( $maximum_price, $search_form_currency );
885 }
886
887 $meta_query = array(
888 'key' => '_price_actual',
889 'value' => ph_clean( ceil( $maximum_price ) ),
890 'compare' => '<=',
891 'type' => 'NUMERIC'
892 );
893 }
894
895 return $meta_query;
896 }
897
898 /**
899 * Returns a meta query to handle price range
900 *
901 * @access public
902 * @return array
903 */
904 public function price_range_meta_query( ) {
905
906 $meta_query = array();
907
908 if (
909 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales' &&
910 isset( $_REQUEST['price_range'] ) && $_REQUEST['price_range'] != ''
911 )
912 {
913 $explode_price_range = explode("-", ph_clean($_REQUEST['price_range']));
914
915 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
916
917 if ( isset($explode_price_range[0]) && $explode_price_range[0] != '' )
918 {
919 $minimum_price = $explode_price_range[0];
920
921 if ( $search_form_currency != 'GBP' )
922 {
923 // Convert $explode_price_range[0] to GBP
924 $ph_countries = new PH_Countries();
925
926 $minimum_price = $ph_countries->convert_price_to_gbp( $minimum_price, $search_form_currency );
927 }
928
929 $meta_query[] = array(
930 'key' => '_price_actual',
931 'value' => sanitize_text_field( floor( $minimum_price ) ),
932 'compare' => '>=',
933 'type' => 'NUMERIC'
934 );
935 }
936 if ( isset($explode_price_range[1]) && $explode_price_range[1] != '' )
937 {
938 $maximum_price = $explode_price_range[1];
939 if ( $search_form_currency != 'GBP' )
940 {
941 // Convert $explode_price_range[1] to GBP
942 $ph_countries = new PH_Countries();
943
944 $maximum_price = $ph_countries->convert_price_to_gbp( $maximum_price, $search_form_currency );
945 }
946
947 $meta_query[] = array(
948 'key' => '_price_actual',
949 'value' => sanitize_text_field( ceil( $maximum_price ) ),
950 'compare' => '<=',
951 'type' => 'NUMERIC'
952 );
953 }
954 }
955
956 return $meta_query;
957 }
958
959 /**
960 * Returns a meta query to handle minimum rent
961 *
962 * @access public
963 * @return array
964 */
965 public function minimum_rent_meta_query( ) {
966
967 $meta_query = array();
968
969 if (
970 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings' &&
971 isset( $_REQUEST['minimum_rent'] ) && $_REQUEST['minimum_rent'] != ''
972 )
973 {
974 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
975
976 $minimum_rent = $_REQUEST['minimum_rent'];
977 if ( $search_form_currency != 'GBP' )
978 {
979 // Convert $_REQUEST['minimum_rent'] to GBP
980 $ph_countries = new PH_Countries();
981
982 $minimum_rent = $ph_countries->convert_price_to_gbp( $minimum_rent, $search_form_currency );
983 }
984
985 $meta_query = array(
986 'key' => '_price_actual',
987 'value' => ph_clean( floor( $minimum_rent ) ),
988 'compare' => '>=',
989 'type' => 'NUMERIC'
990 );
991 }
992
993 return $meta_query;
994 }
995
996 /**
997 * Returns a meta query to handle maximum rent
998 *
999 * @access public
1000 * @return array
1001 */
1002 public function maximum_rent_meta_query( ) {
1003
1004 $meta_query = array();
1005
1006 if (
1007 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings' &&
1008 isset( $_REQUEST['maximum_rent'] ) && $_REQUEST['maximum_rent'] != ''
1009 )
1010 {
1011 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
1012
1013 $maximum_rent = $_REQUEST['maximum_rent'];
1014 if ( $search_form_currency != 'GBP' )
1015 {
1016 // Convert $_REQUEST['maximum_rent'] to GBP
1017 $ph_countries = new PH_Countries();
1018
1019 $maximum_rent = $ph_countries->convert_price_to_gbp( $maximum_rent, $search_form_currency );
1020 }
1021
1022 $meta_query = array(
1023 'key' => '_price_actual',
1024 'value' => ph_clean( ceil( $maximum_rent ) ),
1025 'compare' => '<=',
1026 'type' => 'NUMERIC'
1027 );
1028 }
1029
1030 return $meta_query;
1031 }
1032
1033 /**
1034 * Returns a meta query to handle rent range
1035 *
1036 * @access public
1037 * @return array
1038 */
1039 public function rent_range_meta_query( ) {
1040
1041 $meta_query = array();
1042
1043 if (
1044 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings' &&
1045 isset( $_REQUEST['rent_range'] ) && $_REQUEST['rent_range'] != ''
1046 )
1047 {
1048 $explode_rent_range = explode("-", ph_clean($_REQUEST['rent_range']));
1049
1050 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
1051
1052 if ( isset($explode_rent_range[0]) && $explode_rent_range[0] != '' )
1053 {
1054 $minimum_rent = $explode_rent_range[0];
1055 if ( $search_form_currency != 'GBP' )
1056 {
1057 // Convert $explode_rent_range[0] to GBP
1058 $ph_countries = new PH_Countries();
1059
1060 $minimum_rent = $ph_countries->convert_price_to_gbp( $minimum_rent, $search_form_currency );
1061 }
1062
1063 $meta_query[] = array(
1064 'key' => '_price_actual',
1065 'value' => sanitize_text_field( floor( $minimum_rent ) ),
1066 'compare' => '>=',
1067 'type' => 'NUMERIC'
1068 );
1069 }
1070 if ( isset($explode_rent_range[1]) && $explode_rent_range[1] != '' )
1071 {
1072 $maximum_rent = $explode_rent_range[1];
1073 if ( $search_form_currency != 'GBP' )
1074 {
1075 // Convert $explode_rent_range[1] to GBP
1076 $ph_countries = new PH_Countries();
1077
1078 $maximum_rent = $ph_countries->convert_price_to_gbp( $maximum_rent, $search_form_currency );
1079 }
1080
1081 $meta_query[] = array(
1082 'key' => '_price_actual',
1083 'value' => sanitize_text_field( ceil( $maximum_rent ) ),
1084 'compare' => '<=',
1085 'type' => 'NUMERIC'
1086 );
1087 }
1088 }
1089
1090 return $meta_query;
1091 }
1092
1093 /**
1094 * Returns a meta query to handle exact bedrooms
1095 *
1096 * @access public
1097 * @return array
1098 */
1099 public function bedrooms_meta_query( ) {
1100
1101 $meta_query = array();
1102
1103 if (
1104 (
1105 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1106 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1107 ) &&
1108 isset( $_REQUEST['bedrooms'] ) && $_REQUEST['bedrooms'] != ''
1109 )
1110 {
1111 $meta_query = array(
1112 'key' => '_bedrooms',
1113 'value' => ph_clean( $_REQUEST['bedrooms'] ),
1114 'compare' => '=',
1115 'type' => 'NUMERIC'
1116 );
1117 }
1118
1119 return $meta_query;
1120 }
1121
1122 /**
1123 * Returns a meta query to handle minimum bedrooms
1124 *
1125 * @access public
1126 * @return array
1127 */
1128 public function minimum_bedrooms_meta_query( ) {
1129
1130 $meta_query = array();
1131
1132 if (
1133 (
1134 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1135 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1136 ) &&
1137 isset( $_REQUEST['minimum_bedrooms'] ) && $_REQUEST['minimum_bedrooms'] != ''
1138 )
1139 {
1140 $meta_query = array(
1141 'key' => '_bedrooms',
1142 'value' => ph_clean( $_REQUEST['minimum_bedrooms'] ),
1143 'compare' => '>=',
1144 'type' => 'NUMERIC'
1145 );
1146 }
1147
1148 return $meta_query;
1149 }
1150
1151 /**
1152 * Returns a meta query to handle maximum bedrooms
1153 *
1154 * @access public
1155 * @return array
1156 */
1157 public function maximum_bedrooms_meta_query( ) {
1158
1159 $meta_query = array();
1160
1161 if (
1162 (
1163 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1164 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1165 ) &&
1166 isset( $_REQUEST['maximum_bedrooms'] ) && $_REQUEST['maximum_bedrooms'] != ''
1167 )
1168 {
1169 $meta_query = array(
1170 'key' => '_bedrooms',
1171 'value' => ph_clean( $_REQUEST['maximum_bedrooms'] ),
1172 'compare' => '<=',
1173 'type' => 'NUMERIC'
1174 );
1175 }
1176
1177 return $meta_query;
1178 }
1179
1180 /**
1181 * Returns a meta query to handle minimum bathrooms
1182 *
1183 * @access public
1184 * @return array
1185 */
1186 public function minimum_bathrooms_meta_query( ) {
1187
1188 $meta_query = array();
1189
1190 if (
1191 (
1192 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1193 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1194 ) &&
1195 isset( $_REQUEST['minimum_bathrooms'] ) && $_REQUEST['minimum_bathrooms'] != ''
1196 )
1197 {
1198 $meta_query = array(
1199 'key' => '_bathrooms',
1200 'value' => ph_clean( $_REQUEST['minimum_bathrooms'] ),
1201 'compare' => '>=',
1202 'type' => 'NUMERIC'
1203 );
1204 }
1205
1206 return $meta_query;
1207 }
1208
1209 /**
1210 * Returns a meta query to handle maximum bathrooms
1211 *
1212 * @access public
1213 * @return array
1214 */
1215 public function maximum_bathrooms_meta_query( ) {
1216
1217 $meta_query = array();
1218
1219 if (
1220 (
1221 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1222 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1223 ) &&
1224 isset( $_REQUEST['maximum_bathrooms'] ) && $_REQUEST['maximum_bathrooms'] != ''
1225 )
1226 {
1227 $meta_query = array(
1228 'key' => '_bathrooms',
1229 'value' => ph_clean( $_REQUEST['maximum_bathrooms'] ),
1230 'compare' => '<=',
1231 'type' => 'NUMERIC'
1232 );
1233 }
1234
1235 return $meta_query;
1236 }
1237
1238 /**
1239 * Returns a meta query to handle minimum reception rooms
1240 *
1241 * @access public
1242 * @return array
1243 */
1244 public function minimum_reception_rooms_meta_query( ) {
1245
1246 $meta_query = array();
1247
1248 if (
1249 (
1250 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1251 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1252 ) &&
1253 isset( $_REQUEST['minimum_reception_rooms'] ) && $_REQUEST['minimum_reception_rooms'] != ''
1254 )
1255 {
1256 $meta_query = array(
1257 'key' => '_reception_rooms',
1258 'value' => ph_clean( $_REQUEST['minimum_reception_rooms'] ),
1259 'compare' => '>=',
1260 'type' => 'NUMERIC'
1261 );
1262 }
1263
1264 return $meta_query;
1265 }
1266
1267 /**
1268 * Returns a meta query to handle maximum reception rooms
1269 *
1270 * @access public
1271 * @return array
1272 */
1273 public function maximum_reception_rooms_meta_query( ) {
1274
1275 $meta_query = array();
1276
1277 if (
1278 (
1279 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1280 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1281 ) &&
1282 isset( $_REQUEST['maximum_reception_rooms'] ) && $_REQUEST['maximum_reception_rooms'] != ''
1283 )
1284 {
1285 $meta_query = array(
1286 'key' => '_reception_rooms',
1287 'value' => ph_clean( $_REQUEST['maximum_reception_rooms'] ),
1288 'compare' => '<=',
1289 'type' => 'NUMERIC'
1290 );
1291 }
1292
1293 return $meta_query;
1294 }
1295
1296 /**
1297 * Returns a meta query to handle available date from
1298 *
1299 * @access public
1300 * @return array
1301 */
1302 public function available_date_from_meta_query( ) {
1303
1304 $meta_query = array();
1305
1306 if (
1307 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings' &&
1308 isset( $_REQUEST['available_date_from'] ) && $_REQUEST['available_date_from'] != ''
1309 )
1310 {
1311 $available_date = ph_clean($_REQUEST['available_date_from']);
1312 if ( strpos($available_date, '/') !== FALSE )
1313 {
1314 // it's been provided in the format dd/mm/yyyy
1315 $explode_available_date = explode("/", $available_date);
1316 if ( count($explode_available_date) == 3 )
1317 {
1318 $available_date = $explode_available_date[0] . '-' . $explode_available_date[1] . '-' . $explode_available_date[2];
1319 }
1320 }
1321 $meta_query = array(
1322 'key' => '_available_date',
1323 'value' => ph_clean( $available_date ),
1324 'compare' => '<=',
1325 );
1326 }
1327
1328 return $meta_query;
1329 }
1330
1331 /**
1332 * Returns a meta query to handle minimum floor area
1333 *
1334 * @access public
1335 * @return array
1336 */
1337 public function minimum_floor_area_meta_query( ) {
1338
1339 $meta_query = array();
1340
1341 if (
1342 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1343 isset( $_REQUEST['minimum_floor_area'] ) && $_REQUEST['minimum_floor_area'] != '' &&
1344 (
1345 !isset( $_REQUEST['maximum_floor_area'] ) ||
1346 ( isset( $_REQUEST['maximum_floor_area'] ) && $_REQUEST['maximum_floor_area'] == '' )
1347 )
1348 )
1349 {
1350 $meta_query = array(
1351 'key' => '_floor_area_from_sqft',
1352 'value' => ph_clean( $_REQUEST['minimum_floor_area'] ),
1353 'compare' => '>=',
1354 'type' => 'NUMERIC'
1355 );
1356 }
1357
1358 return $meta_query;
1359 }
1360
1361 /**
1362 * Returns a meta query to handle maximum floor area
1363 *
1364 * @access public
1365 * @return array
1366 */
1367 public function maximum_floor_area_meta_query( ) {
1368
1369 $meta_query = array();
1370
1371 if (
1372 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1373 isset( $_REQUEST['maximum_floor_area'] ) && $_REQUEST['maximum_floor_area'] != '' &&
1374 (
1375 !isset( $_REQUEST['minimum_floor_area'] ) ||
1376 ( isset( $_REQUEST['minimum_floor_area'] ) && $_REQUEST['minimum_floor_area'] == '' )
1377 )
1378 )
1379 {
1380 $meta_query = array(
1381 'key' => '_floor_area_to_sqft',
1382 'value' => ph_clean( $_REQUEST['maximum_floor_area'] ),
1383 'compare' => '<=',
1384 'type' => 'NUMERIC'
1385 );
1386 }
1387
1388 return $meta_query;
1389 }
1390
1391 /**
1392 * Returns a meta query to handle minimum AND maximum floor area
1393 *
1394 * @access public
1395 * @return array
1396 */
1397 public function minimum_maximum_floor_area_meta_query( ) {
1398
1399 $meta_query = array();
1400
1401 if (
1402 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1403 isset( $_REQUEST['minimum_floor_area'] ) && $_REQUEST['minimum_floor_area'] != '' &&
1404 isset( $_REQUEST['maximum_floor_area'] ) && $_REQUEST['maximum_floor_area'] != ''
1405 )
1406 {
1407 $meta_query[] = array(
1408 'key' => '_floor_area_from_sqft',
1409 'value' => ph_clean( $_REQUEST['maximum_floor_area'] ),
1410 'compare' => '<=',
1411 'type' => 'NUMERIC'
1412 );
1413 $meta_query[] = array(
1414 'key' => '_floor_area_to_sqft',
1415 'value' => ph_clean( $_REQUEST['minimum_floor_area'] ),
1416 'compare' => '>=',
1417 'type' => 'NUMERIC'
1418 );
1419 }
1420
1421 return $meta_query;
1422 }
1423
1424
1425 /**
1426 * Returns a meta query to handle floor area range
1427 *
1428 * @access public
1429 * @return array
1430 */
1431 public function floor_area_range_meta_query( ) {
1432
1433 $meta_query = array();
1434
1435 if (
1436 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1437 isset( $_REQUEST['floor_area_range'] ) && $_REQUEST['floor_area_range'] != ''
1438 )
1439 {
1440 $explode_floor_area_range = explode("-", ph_clean($_REQUEST['floor_area_range']));
1441
1442 if ( isset($explode_floor_area_range[0]) && $explode_floor_area_range[0] != '' )
1443 {
1444 $meta_query = array(
1445 'key' => '_floor_area_from_sqft',
1446 'value' => ph_clean( $explode_floor_area_range[0] ),
1447 'compare' => '>=',
1448 'type' => 'NUMERIC'
1449 );
1450 }
1451 if ( isset($explode_floor_area_range[1]) && $explode_floor_area_range[1] != '' )
1452 {
1453 $meta_query = array(
1454 'key' => '_floor_area_to_sqft',
1455 'value' => ph_clean( $explode_floor_area_range[1] ),
1456 'compare' => '<=',
1457 'type' => 'NUMERIC'
1458 );
1459 }
1460 }
1461
1462 return $meta_query;
1463 }
1464
1465 /**
1466 * Returns a meta query to handle commercial for sale or to rent
1467 *
1468 * @access public
1469 * @return array
1470 */
1471 public function commercial_for_sale_to_rent_meta_query( ) {
1472
1473 $meta_query = array();
1474
1475 if (
1476 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1477 isset( $_REQUEST['commercial_for_sale_to_rent'] ) && $_REQUEST['commercial_for_sale_to_rent'] == 'for_sale'
1478 )
1479 {
1480 $meta_query = array(
1481 'key' => '_for_sale',
1482 'value' => 'yes',
1483 'compare' => '=',
1484 );
1485 }
1486
1487 if (
1488 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1489 isset( $_REQUEST['commercial_for_sale_to_rent'] ) && $_REQUEST['commercial_for_sale_to_rent'] == 'to_rent'
1490 )
1491 {
1492 $meta_query = array(
1493 'key' => '_to_rent',
1494 'value' => 'yes',
1495 'compare' => '=',
1496 );
1497 }
1498
1499 return $meta_query;
1500 }
1501
1502 /**
1503 * Returns a meta query to handle commercial for sale
1504 *
1505 * @access public
1506 * @return array
1507 */
1508 public function commercial_for_sale_meta_query( ) {
1509
1510 $meta_query = array();
1511
1512 if (
1513 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1514 isset( $_REQUEST['commercial_for_sale'] ) && $_REQUEST['commercial_for_sale'] == '1'
1515 )
1516 {
1517 $meta_query = array(
1518 'key' => '_for_sale',
1519 'value' => 'yes',
1520 'compare' => '=',
1521 );
1522 }
1523
1524 return $meta_query;
1525 }
1526
1527 /**
1528 * Returns a meta query to handle commercial to rent
1529 *
1530 * @access public
1531 * @return array
1532 */
1533 public function commercial_to_rent_meta_query( ) {
1534
1535 $meta_query = array();
1536
1537 if (
1538 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1539 isset( $_REQUEST['commercial_to_rent'] ) && $_REQUEST['commercial_to_rent'] == '1'
1540 )
1541 {
1542 $meta_query = array(
1543 'key' => '_to_rent',
1544 'value' => 'yes',
1545 'compare' => '=',
1546 );
1547 }
1548
1549 return $meta_query;
1550 }
1551
1552 /**
1553 * Returns a meta query to handle property negotiator
1554 *
1555 * @access public
1556 * @return array
1557 */
1558 public function negotiator_meta_query( ) {
1559
1560 $meta_query = array();
1561
1562 if ( isset( $_REQUEST['negotiator_id'] ) && $_REQUEST['negotiator_id'] != '' )
1563 {
1564 $meta_query = array(
1565 'key' => '_negotiator_id',
1566 'value' => (int)$_REQUEST['negotiator_id'],
1567 'compare' => '='
1568 );
1569 }
1570
1571 return $meta_query;
1572 }
1573
1574 /**
1575 * Returns a meta query to handle property office
1576 *
1577 * @access public
1578 * @param string $compare (default: 'IN')
1579 * @return array
1580 */
1581 public function office_meta_query( ) {
1582
1583 $meta_query = array();
1584
1585 if ( isset( $_REQUEST['officeID'] ) && $_REQUEST['officeID'] != '' )
1586 {
1587 $meta_query = array(
1588 'key' => '_office_id',
1589 'value' => (int)$_REQUEST['officeID'],
1590 'compare' => '='
1591 );
1592 }
1593
1594 return $meta_query;
1595 }
1596
1597 /**
1598 * Appends taxonomy queries to an array.
1599 * @access public
1600 * @param array $tax_query
1601 * @return array
1602 */
1603 public function get_tax_query( $tax_query = array() ) {
1604 if ( ! is_array( $tax_query ) )
1605 $tax_query = array();
1606
1607 if ( isset($_REQUEST) && !empty($_REQUEST) )
1608 {
1609 foreach ( $_REQUEST as $key => $value )
1610 {
1611 if ( taxonomy_exists($key) && isset( $_REQUEST[$key] ) && !empty($_REQUEST[$key]) && $this->taxonomy_allowed_for_department( $key ) )
1612 {
1613 $tax_query[] = array(
1614 'taxonomy' => $key,
1615 'terms' => ph_clean( (is_array($value)) ? $value : array( $value ) )
1616 );
1617 }
1618 }
1619 }
1620
1621 return array_filter( apply_filters( 'propertyhive_property_query_tax_query', $tax_query, $this ) );
1622 }
1623
1624 private function taxonomy_allowed_for_department( $taxonomy )
1625 {
1626 if ( isset( $_REQUEST['department'] ) && $_REQUEST['department'] != '' )
1627 {
1628 $department = ph_clean($_REQUEST['department']);
1629 }
1630 else
1631 {
1632 $department = get_option( 'propertyhive_primary_department', 'residential-sales' );
1633 }
1634
1635 switch ( $department )
1636 {
1637 case 'residential-sales':
1638 {
1639 if ( in_array( $taxonomy, array('commercial_property_type', 'commercial_tenure', 'furnished') ) )
1640 {
1641 return false;
1642 }
1643 break;
1644 }
1645 case 'residential-lettings':
1646 {
1647 if ( in_array( $taxonomy, array('commercial_property_type', 'commercial_tenure', 'tenure', 'sale_by', 'price_qualifier') ) )
1648 {
1649 return false;
1650 }
1651 break;
1652 }
1653 case 'commercial':
1654 {
1655 if ( in_array( $taxonomy, array('property_type', 'tenure', 'parking', 'outside_space', 'furnished') ) )
1656 {
1657 return false;
1658 }
1659 break;
1660 }
1661 }
1662
1663
1664 return true;
1665 }
1666
1667 /**
1668 * Layered Nav Init
1669 */
1670 public function layered_nav_init( ) {
1671
1672 }
1673
1674 /**
1675 * Layered Nav post filter
1676 *
1677 * @param array $filtered_posts
1678 * @return array
1679 */
1680 public function layered_nav_query( $filtered_posts ) {
1681
1682 }
1683
1684 /**
1685 * Price filter Init
1686 */
1687 public function price_filter_init() {
1688
1689 }
1690
1691 /**
1692 * Price Filter post filter
1693 *
1694 * @param array $filtered_posts
1695 * @return array
1696 */
1697 public function price_filter( $filtered_posts ) {
1698
1699 }
1700
1701 }
1702
1703 endif;
1704