PluginProbe
Property Hive / 1.4.47
Property Hive v1.4.47
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.47, at includes/class-ph-query.php

1,703 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 'rand' :
531 $args['orderby'] = 'rand';
532 break;
533 case 'date' :
534 $args['orderby'] = 'date';
535 $args['order'] = $order == 'ASC' ? 'ASC' : 'DESC';
536 break;
537 case 'price' :
538 $args['orderby'] = 'meta_value_num';
539 $args['order'] = $order == 'ASC' ? 'ASC' : 'DESC';
540 if (
541 ( isset($_REQUEST['department']) && $_REQUEST['department'] == 'commercial' ) ||
542 ( !isset($_REQUEST['department']) && get_option( 'propertyhive_primary_department' ) == 'commercial' )
543 )
544 {
545 $args['meta_key'] = '_price_from_actual';
546 }
547 else
548 {
549 $args['meta_key'] = '_price_actual';
550 }
551 break;
552 case 'floor_area' :
553 $args['orderby'] = 'meta_value_num';
554 $args['order'] = $order == 'ASC' ? 'ASC' : 'DESC';
555 $args['meta_key'] = '_floor_area_from_sqft';
556 break;
557 }
558
559 return apply_filters( 'propertyhive_get_search_results_ordering_args', $args );
560 }
561
562 /**
563 * Appends date queries to an array.
564 * @access public
565 * @param array $meta_query
566 * @return array
567 */
568 public function get_date_query() {
569
570 $date_query = array();
571
572 if ( isset( $_REQUEST['added_from'] ) && $_REQUEST['added_from'] != '' )
573 {
574 $date_query = array(
575 'column' => 'post_date_gmt',
576 'after' => sanitize_text_field( $_REQUEST['added_from'] )
577 );
578 }
579
580 if ( isset( $_REQUEST['added_from_hours'] ) && $_REQUEST['added_from_hours'] != '' )
581 {
582 $date_query = array(
583 'column' => 'post_date_gmt',
584 'after' => sanitize_text_field( $_REQUEST['added_from_hours'] ) . ' hours ago'
585 );
586 }
587
588 return array_filter( $date_query );
589 }
590
591 /**
592 * Appends meta queries to an array.
593 * @access public
594 * @param array $meta_query
595 * @return array
596 */
597 public function get_meta_query( $q = array() ) {
598
599 $meta_query = array();
600 if ( !empty($q) )
601 {
602 $meta_query = $q->get( 'meta_query' );
603 }
604
605 if ( ! is_array( $meta_query ) )
606 $meta_query = array();
607
608 $meta_query[] = $this->on_market_meta_query();
609 $meta_query[] = $this->department_meta_query($q);
610 $meta_query[] = $this->address_keyword_meta_query();
611 $meta_query[] = $this->country_meta_query();
612 $meta_query[] = $this->minimum_price_meta_query();
613 $meta_query[] = $this->maximum_price_meta_query();
614 $meta_query[] = $this->price_range_meta_query();
615 $meta_query[] = $this->minimum_rent_meta_query();
616 $meta_query[] = $this->maximum_rent_meta_query();
617 $meta_query[] = $this->rent_range_meta_query();
618 $meta_query[] = $this->bedrooms_meta_query();
619 $meta_query[] = $this->minimum_bedrooms_meta_query();
620 $meta_query[] = $this->maximum_bedrooms_meta_query();
621 $meta_query[] = $this->minimum_bathrooms_meta_query();
622 $meta_query[] = $this->maximum_bathrooms_meta_query();
623 $meta_query[] = $this->minimum_reception_rooms_meta_query();
624 $meta_query[] = $this->maximum_reception_rooms_meta_query();
625 $meta_query[] = $this->available_date_from_meta_query();
626 $meta_query[] = $this->minimum_floor_area_meta_query();
627 $meta_query[] = $this->maximum_floor_area_meta_query();
628 $meta_query[] = $this->minimum_maximum_floor_area_meta_query();
629 $meta_query[] = $this->floor_area_range_meta_query();
630 $meta_query[] = $this->commercial_for_sale_to_rent_meta_query();
631 $meta_query[] = $this->commercial_for_sale_meta_query();
632 $meta_query[] = $this->commercial_to_rent_meta_query();
633 $meta_query[] = $this->negotiator_meta_query();
634 $meta_query[] = $this->office_meta_query();
635
636 return array_filter( apply_filters( 'propertyhive_property_query_meta_query', $meta_query, $this ) );
637 }
638
639 /**
640 * Returns a meta query to handle property on market status
641 *
642 * @access public
643 * @param string $compare (default: 'IN')
644 * @return array
645 */
646 public function on_market_meta_query( ) {
647
648 $meta_query = array();
649
650 if ( !is_admin() )
651 {
652 $meta_query = array(
653 'key' => '_on_market',
654 'value' => 'yes',
655 'compare' => '='
656 );
657 }
658
659 return $meta_query;
660 }
661
662 /**
663 * Returns a meta query to handle property department
664 *
665 * @access public
666 * @return array
667 */
668 public function department_meta_query( $q ) {
669
670 $meta_query = array();
671
672 if ( isset( $_REQUEST['department'] ) && $_REQUEST['department'] != '' )
673 {
674 $meta_query = array(
675 'key' => '_department',
676 'value' => sanitize_text_field( $_REQUEST['department'] ),
677 'compare' => '='
678 );
679 }
680 else
681 {
682 // Need a department set if on search results page
683 if (!empty($q) && $q->is_post_type_archive( 'property' ))
684 {
685 if (get_option( 'propertyhive_primary_department' ) != '')
686 {
687 $department = get_option( 'propertyhive_primary_department' );
688 }
689 else
690 {
691 // No primary department set. Use first active one. Should never get to this scenario
692 $department = '';
693
694 $departments = ph_get_departments();
695
696 foreach ( $departments as $key => $value )
697 {
698 if ( get_option( 'propertyhive_active_departments_' . str_replace("residential-", "", $key) ) == 'yes' )
699 {
700 if ( $department == '' )
701 {
702 $department = $key;
703 }
704 }
705 }
706 }
707 $meta_query = array(
708 'key' => '_department',
709 'value' => $department,
710 'compare' => '='
711 );
712 }
713 }
714
715 return $meta_query;
716 }
717
718 /**
719 * Returns a meta query to handle searching for a keyword in the address
720 *
721 * @access public
722 * @param string $compare (default: 'IN')
723 * @return array
724 */
725 public function address_keyword_meta_query( ) {
726
727 $meta_query = array();
728
729 if ( isset( $_REQUEST['address_keyword'] ) && $_REQUEST['address_keyword'] != '' )
730 {
731 $_REQUEST['address_keyword'] = ph_clean( wp_unslash( $_REQUEST['address_keyword'] ) );
732
733 // Remove country code from end (i.e. ', UK')
734 $_REQUEST['address_keyword'] = preg_replace('/\,\s?[A-Z][A-Z]$/', '', $_REQUEST['address_keyword']);
735
736 $address_keywords = array( $_REQUEST['address_keyword'] );
737
738 if ( strpos( $_REQUEST['address_keyword'], ' ' ) !== FALSE )
739 {
740 $address_keywords[] = str_replace(" ", "-", ph_clean($_REQUEST['address_keyword']));
741 }
742 if ( strpos( $_REQUEST['address_keyword'], '-' ) !== FALSE )
743 {
744 $address_keywords[] = str_replace("-", " ", ph_clean($_REQUEST['address_keyword']));
745 }
746
747 $meta_query = array('relation' => 'OR');
748
749 $address_fields_to_query = array(
750 '_reference_number',
751 '_address_street',
752 '_address_two',
753 '_address_three',
754 '_address_four',
755 '_address_postcode'
756 );
757
758 $address_fields_to_query = apply_filters( 'propertyhive_address_fields_to_query', $address_fields_to_query );
759
760 foreach ( $address_keywords as $address_keyword )
761 {
762 foreach ( $address_fields_to_query as $address_field )
763 {
764 if ( $address_field == '_address_postcode' ) { continue; } // ignore postcode as that is handled differently afterwards
765
766 $meta_query[] = array(
767 'key' => $address_field,
768 'value' => $address_keyword,
769 'compare' => get_option( 'propertyhive_address_keyword_compare', '=' )
770 );
771 }
772 }
773 if ( in_array('_address_postcode', $address_fields_to_query) )
774 {
775 if ( strlen($_REQUEST['address_keyword']) <= 4 )
776 {
777 $meta_query[] = array(
778 'key' => '_address_postcode',
779 'value' => ph_clean( $_REQUEST['address_keyword'] ),
780 'compare' => '='
781 );
782 $meta_query[] = array(
783 'key' => '_address_postcode',
784 'value' => '^' . ph_clean( $_REQUEST['address_keyword'] ) . '[ ]',
785 'compare' => 'RLIKE'
786 );
787 }
788 else
789 {
790 $meta_query[] = array(
791 'key' => '_address_postcode',
792 'value' => ph_clean( $_REQUEST['address_keyword'] ),
793 'compare' => 'LIKE'
794 );
795 }
796 }
797 }
798
799 return $meta_query;
800 }
801
802 /**
803 * Returns a meta query to handle country
804 *
805 * @access public
806 * @return array
807 */
808 public function country_meta_query( ) {
809
810 $meta_query = array();
811
812 if ( isset( $_REQUEST['country'] ) && $_REQUEST['country'] != '' )
813 {
814 $meta_query = array(
815 'key' => '_address_country',
816 'value' => ph_clean( $_REQUEST['country'] )
817 );
818 }
819
820 return $meta_query;
821 }
822
823 /**
824 * Returns a meta query to handle minimum price
825 *
826 * @access public
827 * @return array
828 */
829 public function minimum_price_meta_query( ) {
830
831 $meta_query = array();
832
833 if (
834 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales' &&
835 isset( $_REQUEST['minimum_price'] ) && $_REQUEST['minimum_price'] != ''
836 )
837 {
838 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
839
840 $minimum_price = $_REQUEST['minimum_price'];
841 if ( $search_form_currency != 'GBP' )
842 {
843 // Convert $_REQUEST['minimum_price'] to GBP
844 $ph_countries = new PH_Countries();
845
846 $minimum_price = $ph_countries->convert_price_to_gbp( $minimum_price, $search_form_currency );
847 }
848
849 $meta_query = array(
850 'key' => '_price_actual',
851 'value' => ph_clean( floor( $minimum_price ) ),
852 'compare' => '>=',
853 'type' => 'NUMERIC'
854 );
855 }
856
857 return $meta_query;
858 }
859
860 /**
861 * Returns a meta query to handle maximum price
862 *
863 * @access public
864 * @return array
865 */
866 public function maximum_price_meta_query( ) {
867
868 $meta_query = array();
869
870 if (
871 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales' &&
872 isset( $_REQUEST['maximum_price'] ) && $_REQUEST['maximum_price'] != ''
873 )
874 {
875 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
876
877 $maximum_price = $_REQUEST['maximum_price'];
878 if ( $search_form_currency != 'GBP' )
879 {
880 // Convert $_REQUEST['maximum_price'] to GBP
881 $ph_countries = new PH_Countries();
882
883 $maximum_price = $ph_countries->convert_price_to_gbp( $maximum_price, $search_form_currency );
884 }
885
886 $meta_query = array(
887 'key' => '_price_actual',
888 'value' => ph_clean( ceil( $maximum_price ) ),
889 'compare' => '<=',
890 'type' => 'NUMERIC'
891 );
892 }
893
894 return $meta_query;
895 }
896
897 /**
898 * Returns a meta query to handle price range
899 *
900 * @access public
901 * @return array
902 */
903 public function price_range_meta_query( ) {
904
905 $meta_query = array();
906
907 if (
908 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales' &&
909 isset( $_REQUEST['price_range'] ) && $_REQUEST['price_range'] != ''
910 )
911 {
912 $explode_price_range = explode("-", ph_clean($_REQUEST['price_range']));
913
914 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
915
916 if ( isset($explode_price_range[0]) && $explode_price_range[0] != '' )
917 {
918 $minimum_price = $explode_price_range[0];
919
920 if ( $search_form_currency != 'GBP' )
921 {
922 // Convert $explode_price_range[0] to GBP
923 $ph_countries = new PH_Countries();
924
925 $minimum_price = $ph_countries->convert_price_to_gbp( $minimum_price, $search_form_currency );
926 }
927
928 $meta_query[] = array(
929 'key' => '_price_actual',
930 'value' => sanitize_text_field( floor( $minimum_price ) ),
931 'compare' => '>=',
932 'type' => 'NUMERIC'
933 );
934 }
935 if ( isset($explode_price_range[1]) && $explode_price_range[1] != '' )
936 {
937 $maximum_price = $explode_price_range[1];
938 if ( $search_form_currency != 'GBP' )
939 {
940 // Convert $explode_price_range[1] to GBP
941 $ph_countries = new PH_Countries();
942
943 $maximum_price = $ph_countries->convert_price_to_gbp( $maximum_price, $search_form_currency );
944 }
945
946 $meta_query[] = array(
947 'key' => '_price_actual',
948 'value' => sanitize_text_field( ceil( $maximum_price ) ),
949 'compare' => '<=',
950 'type' => 'NUMERIC'
951 );
952 }
953 }
954
955 return $meta_query;
956 }
957
958 /**
959 * Returns a meta query to handle minimum rent
960 *
961 * @access public
962 * @return array
963 */
964 public function minimum_rent_meta_query( ) {
965
966 $meta_query = array();
967
968 if (
969 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings' &&
970 isset( $_REQUEST['minimum_rent'] ) && $_REQUEST['minimum_rent'] != ''
971 )
972 {
973 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
974
975 $minimum_rent = $_REQUEST['minimum_rent'];
976 if ( $search_form_currency != 'GBP' )
977 {
978 // Convert $_REQUEST['minimum_rent'] to GBP
979 $ph_countries = new PH_Countries();
980
981 $minimum_rent = $ph_countries->convert_price_to_gbp( $minimum_rent, $search_form_currency );
982 }
983
984 $meta_query = array(
985 'key' => '_price_actual',
986 'value' => ph_clean( floor( $minimum_rent ) ),
987 'compare' => '>=',
988 'type' => 'NUMERIC'
989 );
990 }
991
992 return $meta_query;
993 }
994
995 /**
996 * Returns a meta query to handle maximum rent
997 *
998 * @access public
999 * @return array
1000 */
1001 public function maximum_rent_meta_query( ) {
1002
1003 $meta_query = array();
1004
1005 if (
1006 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings' &&
1007 isset( $_REQUEST['maximum_rent'] ) && $_REQUEST['maximum_rent'] != ''
1008 )
1009 {
1010 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
1011
1012 $maximum_rent = $_REQUEST['maximum_rent'];
1013 if ( $search_form_currency != 'GBP' )
1014 {
1015 // Convert $_REQUEST['maximum_rent'] to GBP
1016 $ph_countries = new PH_Countries();
1017
1018 $maximum_rent = $ph_countries->convert_price_to_gbp( $maximum_rent, $search_form_currency );
1019 }
1020
1021 $meta_query = array(
1022 'key' => '_price_actual',
1023 'value' => ph_clean( ceil( $maximum_rent ) ),
1024 'compare' => '<=',
1025 'type' => 'NUMERIC'
1026 );
1027 }
1028
1029 return $meta_query;
1030 }
1031
1032 /**
1033 * Returns a meta query to handle rent range
1034 *
1035 * @access public
1036 * @return array
1037 */
1038 public function rent_range_meta_query( ) {
1039
1040 $meta_query = array();
1041
1042 if (
1043 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings' &&
1044 isset( $_REQUEST['rent_range'] ) && $_REQUEST['rent_range'] != ''
1045 )
1046 {
1047 $explode_rent_range = explode("-", ph_clean($_REQUEST['rent_range']));
1048
1049 $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' );
1050
1051 if ( isset($explode_rent_range[0]) && $explode_rent_range[0] != '' )
1052 {
1053 $minimum_rent = $explode_rent_range[0];
1054 if ( $search_form_currency != 'GBP' )
1055 {
1056 // Convert $explode_rent_range[0] to GBP
1057 $ph_countries = new PH_Countries();
1058
1059 $minimum_rent = $ph_countries->convert_price_to_gbp( $minimum_rent, $search_form_currency );
1060 }
1061
1062 $meta_query[] = array(
1063 'key' => '_price_actual',
1064 'value' => sanitize_text_field( floor( $minimum_rent ) ),
1065 'compare' => '>=',
1066 'type' => 'NUMERIC'
1067 );
1068 }
1069 if ( isset($explode_rent_range[1]) && $explode_rent_range[1] != '' )
1070 {
1071 $maximum_rent = $explode_rent_range[1];
1072 if ( $search_form_currency != 'GBP' )
1073 {
1074 // Convert $explode_rent_range[1] to GBP
1075 $ph_countries = new PH_Countries();
1076
1077 $maximum_rent = $ph_countries->convert_price_to_gbp( $maximum_rent, $search_form_currency );
1078 }
1079
1080 $meta_query[] = array(
1081 'key' => '_price_actual',
1082 'value' => sanitize_text_field( ceil( $maximum_rent ) ),
1083 'compare' => '<=',
1084 'type' => 'NUMERIC'
1085 );
1086 }
1087 }
1088
1089 return $meta_query;
1090 }
1091
1092 /**
1093 * Returns a meta query to handle exact bedrooms
1094 *
1095 * @access public
1096 * @return array
1097 */
1098 public function bedrooms_meta_query( ) {
1099
1100 $meta_query = array();
1101
1102 if (
1103 (
1104 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1105 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1106 ) &&
1107 isset( $_REQUEST['bedrooms'] ) && $_REQUEST['bedrooms'] != ''
1108 )
1109 {
1110 $meta_query = array(
1111 'key' => '_bedrooms',
1112 'value' => ph_clean( $_REQUEST['bedrooms'] ),
1113 'compare' => '=',
1114 'type' => 'NUMERIC'
1115 );
1116 }
1117
1118 return $meta_query;
1119 }
1120
1121 /**
1122 * Returns a meta query to handle minimum bedrooms
1123 *
1124 * @access public
1125 * @return array
1126 */
1127 public function minimum_bedrooms_meta_query( ) {
1128
1129 $meta_query = array();
1130
1131 if (
1132 (
1133 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1134 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1135 ) &&
1136 isset( $_REQUEST['minimum_bedrooms'] ) && $_REQUEST['minimum_bedrooms'] != ''
1137 )
1138 {
1139 $meta_query = array(
1140 'key' => '_bedrooms',
1141 'value' => ph_clean( $_REQUEST['minimum_bedrooms'] ),
1142 'compare' => '>=',
1143 'type' => 'NUMERIC'
1144 );
1145 }
1146
1147 return $meta_query;
1148 }
1149
1150 /**
1151 * Returns a meta query to handle maximum bedrooms
1152 *
1153 * @access public
1154 * @return array
1155 */
1156 public function maximum_bedrooms_meta_query( ) {
1157
1158 $meta_query = array();
1159
1160 if (
1161 (
1162 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1163 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1164 ) &&
1165 isset( $_REQUEST['maximum_bedrooms'] ) && $_REQUEST['maximum_bedrooms'] != ''
1166 )
1167 {
1168 $meta_query = array(
1169 'key' => '_bedrooms',
1170 'value' => ph_clean( $_REQUEST['maximum_bedrooms'] ),
1171 'compare' => '<=',
1172 'type' => 'NUMERIC'
1173 );
1174 }
1175
1176 return $meta_query;
1177 }
1178
1179 /**
1180 * Returns a meta query to handle minimum bathrooms
1181 *
1182 * @access public
1183 * @return array
1184 */
1185 public function minimum_bathrooms_meta_query( ) {
1186
1187 $meta_query = array();
1188
1189 if (
1190 (
1191 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1192 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1193 ) &&
1194 isset( $_REQUEST['minimum_bathrooms'] ) && $_REQUEST['minimum_bathrooms'] != ''
1195 )
1196 {
1197 $meta_query = array(
1198 'key' => '_bathrooms',
1199 'value' => ph_clean( $_REQUEST['minimum_bathrooms'] ),
1200 'compare' => '>=',
1201 'type' => 'NUMERIC'
1202 );
1203 }
1204
1205 return $meta_query;
1206 }
1207
1208 /**
1209 * Returns a meta query to handle maximum bathrooms
1210 *
1211 * @access public
1212 * @return array
1213 */
1214 public function maximum_bathrooms_meta_query( ) {
1215
1216 $meta_query = array();
1217
1218 if (
1219 (
1220 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1221 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1222 ) &&
1223 isset( $_REQUEST['maximum_bathrooms'] ) && $_REQUEST['maximum_bathrooms'] != ''
1224 )
1225 {
1226 $meta_query = array(
1227 'key' => '_bathrooms',
1228 'value' => ph_clean( $_REQUEST['maximum_bathrooms'] ),
1229 'compare' => '<=',
1230 'type' => 'NUMERIC'
1231 );
1232 }
1233
1234 return $meta_query;
1235 }
1236
1237 /**
1238 * Returns a meta query to handle minimum reception rooms
1239 *
1240 * @access public
1241 * @return array
1242 */
1243 public function minimum_reception_rooms_meta_query( ) {
1244
1245 $meta_query = array();
1246
1247 if (
1248 (
1249 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1250 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1251 ) &&
1252 isset( $_REQUEST['minimum_reception_rooms'] ) && $_REQUEST['minimum_reception_rooms'] != ''
1253 )
1254 {
1255 $meta_query = array(
1256 'key' => '_reception_rooms',
1257 'value' => ph_clean( $_REQUEST['minimum_reception_rooms'] ),
1258 'compare' => '>=',
1259 'type' => 'NUMERIC'
1260 );
1261 }
1262
1263 return $meta_query;
1264 }
1265
1266 /**
1267 * Returns a meta query to handle maximum reception rooms
1268 *
1269 * @access public
1270 * @return array
1271 */
1272 public function maximum_reception_rooms_meta_query( ) {
1273
1274 $meta_query = array();
1275
1276 if (
1277 (
1278 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-sales') ||
1279 (isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings')
1280 ) &&
1281 isset( $_REQUEST['maximum_reception_rooms'] ) && $_REQUEST['maximum_reception_rooms'] != ''
1282 )
1283 {
1284 $meta_query = array(
1285 'key' => '_reception_rooms',
1286 'value' => ph_clean( $_REQUEST['maximum_reception_rooms'] ),
1287 'compare' => '<=',
1288 'type' => 'NUMERIC'
1289 );
1290 }
1291
1292 return $meta_query;
1293 }
1294
1295 /**
1296 * Returns a meta query to handle available date from
1297 *
1298 * @access public
1299 * @return array
1300 */
1301 public function available_date_from_meta_query( ) {
1302
1303 $meta_query = array();
1304
1305 if (
1306 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'residential-lettings' &&
1307 isset( $_REQUEST['available_date_from'] ) && $_REQUEST['available_date_from'] != ''
1308 )
1309 {
1310 $available_date = ph_clean($_REQUEST['available_date_from']);
1311 if ( strpos($available_date, '/') !== FALSE )
1312 {
1313 // it's been provided in the format dd/mm/yyyy
1314 $explode_available_date = explode("/", $available_date);
1315 if ( count($explode_available_date) == 3 )
1316 {
1317 $available_date = $explode_available_date[0] . '-' . $explode_available_date[1] . '-' . $explode_available_date[2];
1318 }
1319 }
1320 $meta_query = array(
1321 'key' => '_available_date',
1322 'value' => ph_clean( $available_date ),
1323 'compare' => '<=',
1324 );
1325 }
1326
1327 return $meta_query;
1328 }
1329
1330 /**
1331 * Returns a meta query to handle minimum floor area
1332 *
1333 * @access public
1334 * @return array
1335 */
1336 public function minimum_floor_area_meta_query( ) {
1337
1338 $meta_query = array();
1339
1340 if (
1341 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1342 isset( $_REQUEST['minimum_floor_area'] ) && $_REQUEST['minimum_floor_area'] != '' &&
1343 (
1344 !isset( $_REQUEST['maximum_floor_area'] ) ||
1345 ( isset( $_REQUEST['maximum_floor_area'] ) && $_REQUEST['maximum_floor_area'] == '' )
1346 )
1347 )
1348 {
1349 $meta_query = array(
1350 'key' => '_floor_area_from_sqft',
1351 'value' => ph_clean( $_REQUEST['minimum_floor_area'] ),
1352 'compare' => '>=',
1353 'type' => 'NUMERIC'
1354 );
1355 }
1356
1357 return $meta_query;
1358 }
1359
1360 /**
1361 * Returns a meta query to handle maximum floor area
1362 *
1363 * @access public
1364 * @return array
1365 */
1366 public function maximum_floor_area_meta_query( ) {
1367
1368 $meta_query = array();
1369
1370 if (
1371 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1372 isset( $_REQUEST['maximum_floor_area'] ) && $_REQUEST['maximum_floor_area'] != '' &&
1373 (
1374 !isset( $_REQUEST['minimum_floor_area'] ) ||
1375 ( isset( $_REQUEST['minimum_floor_area'] ) && $_REQUEST['minimum_floor_area'] == '' )
1376 )
1377 )
1378 {
1379 $meta_query = array(
1380 'key' => '_floor_area_to_sqft',
1381 'value' => ph_clean( $_REQUEST['maximum_floor_area'] ),
1382 'compare' => '<=',
1383 'type' => 'NUMERIC'
1384 );
1385 }
1386
1387 return $meta_query;
1388 }
1389
1390 /**
1391 * Returns a meta query to handle minimum AND maximum floor area
1392 *
1393 * @access public
1394 * @return array
1395 */
1396 public function minimum_maximum_floor_area_meta_query( ) {
1397
1398 $meta_query = array();
1399
1400 if (
1401 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1402 isset( $_REQUEST['minimum_floor_area'] ) && $_REQUEST['minimum_floor_area'] != '' &&
1403 isset( $_REQUEST['maximum_floor_area'] ) && $_REQUEST['maximum_floor_area'] != ''
1404 )
1405 {
1406 $meta_query[] = array(
1407 'key' => '_floor_area_from_sqft',
1408 'value' => ph_clean( $_REQUEST['maximum_floor_area'] ),
1409 'compare' => '<=',
1410 'type' => 'NUMERIC'
1411 );
1412 $meta_query[] = array(
1413 'key' => '_floor_area_to_sqft',
1414 'value' => ph_clean( $_REQUEST['minimum_floor_area'] ),
1415 'compare' => '>=',
1416 'type' => 'NUMERIC'
1417 );
1418 }
1419
1420 return $meta_query;
1421 }
1422
1423
1424 /**
1425 * Returns a meta query to handle floor area range
1426 *
1427 * @access public
1428 * @return array
1429 */
1430 public function floor_area_range_meta_query( ) {
1431
1432 $meta_query = array();
1433
1434 if (
1435 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1436 isset( $_REQUEST['floor_area_range'] ) && $_REQUEST['floor_area_range'] != ''
1437 )
1438 {
1439 $explode_floor_area_range = explode("-", ph_clean($_REQUEST['floor_area_range']));
1440
1441 if ( isset($explode_floor_area_range[0]) && $explode_floor_area_range[0] != '' )
1442 {
1443 $meta_query = array(
1444 'key' => '_floor_area_from_sqft',
1445 'value' => ph_clean( $explode_floor_area_range[0] ),
1446 'compare' => '>=',
1447 'type' => 'NUMERIC'
1448 );
1449 }
1450 if ( isset($explode_floor_area_range[1]) && $explode_floor_area_range[1] != '' )
1451 {
1452 $meta_query = array(
1453 'key' => '_floor_area_to_sqft',
1454 'value' => ph_clean( $explode_floor_area_range[1] ),
1455 'compare' => '<=',
1456 'type' => 'NUMERIC'
1457 );
1458 }
1459 }
1460
1461 return $meta_query;
1462 }
1463
1464 /**
1465 * Returns a meta query to handle commercial for sale or to rent
1466 *
1467 * @access public
1468 * @return array
1469 */
1470 public function commercial_for_sale_to_rent_meta_query( ) {
1471
1472 $meta_query = array();
1473
1474 if (
1475 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1476 isset( $_REQUEST['commercial_for_sale_to_rent'] ) && $_REQUEST['commercial_for_sale_to_rent'] == 'for_sale'
1477 )
1478 {
1479 $meta_query = array(
1480 'key' => '_for_sale',
1481 'value' => 'yes',
1482 'compare' => '=',
1483 );
1484 }
1485
1486 if (
1487 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1488 isset( $_REQUEST['commercial_for_sale_to_rent'] ) && $_REQUEST['commercial_for_sale_to_rent'] == 'to_rent'
1489 )
1490 {
1491 $meta_query = array(
1492 'key' => '_to_rent',
1493 'value' => 'yes',
1494 'compare' => '=',
1495 );
1496 }
1497
1498 return $meta_query;
1499 }
1500
1501 /**
1502 * Returns a meta query to handle commercial for sale
1503 *
1504 * @access public
1505 * @return array
1506 */
1507 public function commercial_for_sale_meta_query( ) {
1508
1509 $meta_query = array();
1510
1511 if (
1512 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1513 isset( $_REQUEST['commercial_for_sale'] ) && $_REQUEST['commercial_for_sale'] == '1'
1514 )
1515 {
1516 $meta_query = array(
1517 'key' => '_for_sale',
1518 'value' => 'yes',
1519 'compare' => '=',
1520 );
1521 }
1522
1523 return $meta_query;
1524 }
1525
1526 /**
1527 * Returns a meta query to handle commercial to rent
1528 *
1529 * @access public
1530 * @return array
1531 */
1532 public function commercial_to_rent_meta_query( ) {
1533
1534 $meta_query = array();
1535
1536 if (
1537 isset( $_REQUEST['department'] ) && $_REQUEST['department'] == 'commercial' &&
1538 isset( $_REQUEST['commercial_to_rent'] ) && $_REQUEST['commercial_to_rent'] == '1'
1539 )
1540 {
1541 $meta_query = array(
1542 'key' => '_to_rent',
1543 'value' => 'yes',
1544 'compare' => '=',
1545 );
1546 }
1547
1548 return $meta_query;
1549 }
1550
1551 /**
1552 * Returns a meta query to handle property negotiator
1553 *
1554 * @access public
1555 * @return array
1556 */
1557 public function negotiator_meta_query( ) {
1558
1559 $meta_query = array();
1560
1561 if ( isset( $_REQUEST['negotiator_id'] ) && $_REQUEST['negotiator_id'] != '' )
1562 {
1563 $meta_query = array(
1564 'key' => '_negotiator_id',
1565 'value' => (int)$_REQUEST['negotiator_id'],
1566 'compare' => '='
1567 );
1568 }
1569
1570 return $meta_query;
1571 }
1572
1573 /**
1574 * Returns a meta query to handle property office
1575 *
1576 * @access public
1577 * @param string $compare (default: 'IN')
1578 * @return array
1579 */
1580 public function office_meta_query( ) {
1581
1582 $meta_query = array();
1583
1584 if ( isset( $_REQUEST['officeID'] ) && $_REQUEST['officeID'] != '' )
1585 {
1586 $meta_query = array(
1587 'key' => '_office_id',
1588 'value' => (int)$_REQUEST['officeID'],
1589 'compare' => '='
1590 );
1591 }
1592
1593 return $meta_query;
1594 }
1595
1596 /**
1597 * Appends taxonomy queries to an array.
1598 * @access public
1599 * @param array $tax_query
1600 * @return array
1601 */
1602 public function get_tax_query( $tax_query = array() ) {
1603 if ( ! is_array( $tax_query ) )
1604 $tax_query = array();
1605
1606 if ( isset($_REQUEST) && !empty($_REQUEST) )
1607 {
1608 foreach ( $_REQUEST as $key => $value )
1609 {
1610 if ( taxonomy_exists($key) && isset( $_REQUEST[$key] ) && !empty($_REQUEST[$key]) && $this->taxonomy_allowed_for_department( $key ) )
1611 {
1612 $tax_query[] = array(
1613 'taxonomy' => $key,
1614 'terms' => ph_clean( (is_array($value)) ? $value : array( $value ) )
1615 );
1616 }
1617 }
1618 }
1619
1620 return array_filter( apply_filters( 'propertyhive_property_query_tax_query', $tax_query, $this ) );
1621 }
1622
1623 private function taxonomy_allowed_for_department( $taxonomy )
1624 {
1625 if ( isset( $_REQUEST['department'] ) && $_REQUEST['department'] != '' )
1626 {
1627 $department = ph_clean($_REQUEST['department']);
1628 }
1629 else
1630 {
1631 $department = get_option( 'propertyhive_primary_department', 'residential-sales' );
1632 }
1633
1634 switch ( $department )
1635 {
1636 case 'residential-sales':
1637 {
1638 if ( in_array( $taxonomy, array('commercial_property_type', 'commercial_tenure', 'furnished') ) )
1639 {
1640 return false;
1641 }
1642 break;
1643 }
1644 case 'residential-lettings':
1645 {
1646 if ( in_array( $taxonomy, array('commercial_property_type', 'commercial_tenure', 'tenure', 'sale_by', 'price_qualifier') ) )
1647 {
1648 return false;
1649 }
1650 break;
1651 }
1652 case 'commercial':
1653 {
1654 if ( in_array( $taxonomy, array('property_type', 'tenure', 'parking', 'outside_space', 'furnished') ) )
1655 {
1656 return false;
1657 }
1658 break;
1659 }
1660 }
1661
1662
1663 return true;
1664 }
1665
1666 /**
1667 * Layered Nav Init
1668 */
1669 public function layered_nav_init( ) {
1670
1671 }
1672
1673 /**
1674 * Layered Nav post filter
1675 *
1676 * @param array $filtered_posts
1677 * @return array
1678 */
1679 public function layered_nav_query( $filtered_posts ) {
1680
1681 }
1682
1683 /**
1684 * Price filter Init
1685 */
1686 public function price_filter_init() {
1687
1688 }
1689
1690 /**
1691 * Price Filter post filter
1692 *
1693 * @param array $filtered_posts
1694 * @return array
1695 */
1696 public function price_filter( $filtered_posts ) {
1697
1698 }
1699
1700 }
1701
1702 endif;
1703