__CLASS__ . '::properties', 'recent_properties' => __CLASS__ . '::recent_properties', 'featured_properties' => __CLASS__ . '::featured_properties', 'similar_properties' => __CLASS__ . '::similar_properties', 'property_search_form' => __CLASS__ . '::property_search_form', 'property_map' => __CLASS__ . '::property_map', 'property_static_map' => __CLASS__ . '::property_static_map', 'property_street_view' => __CLASS__ . '::property_street_view', 'property_office_details' => __CLASS__ . '::property_office_details', 'office_map' => __CLASS__ . '::office_map', 'applicant_registration_form' => __CLASS__ . '::applicant_registration_form', 'propertyhive_my_account' => __CLASS__ . '::my_account', 'propertyhive_login_form' => __CLASS__ . '::login_form', 'propertyhive_reset_password_form' => __CLASS__ . '::reset_password_form', ); foreach ( $shortcodes as $shortcode => $function ) { add_shortcode( apply_filters( "{$shortcode}_shortcode_tag", $shortcode ), $function ); } } /** * Shortcode Wrapper * * @param mixed $function * @param array $atts (default: array()) * @return string */ public static function shortcode_wrapper( $function, $atts = array(), $wrapper = array( 'class' => 'propertyhive', 'before' => null, 'after' => null ) ) { ob_start(); $before = empty( $wrapper['before'] ) ? '
' : $wrapper['before']; $after = empty( $wrapper['after'] ) ? '
' : $wrapper['after']; echo $before; call_user_func( $function, $atts ); echo $after; return ob_get_clean(); } /** * Output property search form * * @param array $atts * @return string */ public static function property_search_form( $atts ) { $atts = shortcode_atts( array( 'id' => 'shortcode', 'default_department' => '' ), $atts, 'property_search_form' ); $form_controls = ph_get_search_form_fields(); $form_controls = apply_filters( 'propertyhive_search_form_fields_' . $atts['id'], $form_controls, $atts ); $form_controls = apply_filters( 'propertyhive_search_form_fields', $form_controls, $atts ); // We 100% need department so make sure it exists. If it doesn't, set a hidden field if ( !isset($form_controls['department']) ) { $original_form_controls = ph_get_search_form_fields(); $original_department = $original_form_controls['department']; $original_department['type'] = 'hidden'; $form_controls['department'] = $original_department; } $form_controls = apply_filters( 'propertyhive_search_form_fields_after_' . $atts['id'], $form_controls, $atts ); $form_controls = apply_filters( 'propertyhive_search_form_fields_after', $form_controls, $atts ); if ( isset($atts['default_department']) && in_array($atts['default_department'], array_keys( ph_get_departments() )) && ( !isset($_REQUEST['department']) ) ) { $form_controls['department']['value'] = $atts['default_department']; } ob_start(); ph_get_template( 'global/search-form.php', array( 'form_controls' => $form_controls, 'id' => $atts['id'] ) ); return ob_get_clean(); } /** * List multiple properties shortcode * * @param array $atts * @return string */ public static function properties( $atts ) { global $propertyhive_loop; $atts = shortcode_atts( array( 'columns' => '2', 'orderby' => 'meta_value_num', 'order' => 'desc', 'meta_key' => '_price_actual', 'ids' => '', 'exclude' => '', 'department' => '', // residential-sales / residential-lettings / commercial / any custom department 'minimum_price' => '', 'maximum_price' => '', 'bedrooms' => '', 'minimum_bedrooms' => '', 'keyword' => '', 'address_keyword' => '', 'country' => '', 'country_not' => '', 'availability_id' => '', 'marketing_flag' => '', // Deprecated. Use marketing_flag_id instead 'marketing_flag_id' => '', // Should be marketing_flag_id. Might deprecate this in the future 'property_type_id' => '', 'sale_by_id' => '', 'location_id' => '', 'office_id' => '', 'negotiator_id' => '', 'commercial_for_sale' => '', 'commercial_to_rent' => '', 'posts_per_page' => 10, 'no_results_output' => '', 'pagination' => '', 'show_order' => '', 'show_result_count' => '', 'carousel' => '', ), $atts, 'properties' ); if ( isset($atts['carousel']) && !empty($atts['carousel']) ) { $params = array( 'items' => 1, 'controlsPosition' => 'bottom', 'gutter' => 20, 'mouseDrag' => true, 'nav' => false, 'navPosition' => 'bottom', 'controlsText' => array("Prev", "Next"), 'responsive' => array( 640 => array( 'items' => (int)$atts['columns'] ) ) ); $params = apply_filters( 'propertyhive_carousel_params', $params ); $params = apply_filters( 'propertyhive_properties_carousel_params', $params ); wp_localize_script( 'propertyhive_carousel', 'propertyhive_carousel_params', $params ); wp_enqueue_style( 'tiny_slider_css' ); wp_enqueue_script( 'tiny_slider' ); wp_enqueue_script( 'propertyhive_carousel' ); } $meta_query = array( array( 'key' => '_on_market', 'value' => 'yes', ) ); if ( isset($atts['department']) && in_array($atts['department'], array_keys( ph_get_departments() )) ) { $departments = explode(",", $atts['department']); $departments = array_map('trim', $departments); $departments = array_filter($departments); $meta_query[] = array( 'key' => '_department', 'value' => $departments, 'compare' => 'IN' ); } if ( isset($atts['bedrooms']) && $atts['bedrooms'] != '' && is_numeric($atts['bedrooms']) ) { $meta_query[] = array( 'key' => '_bedrooms', 'value' => sanitize_text_field( $atts['bedrooms'] ), 'compare' => '=', 'type' => 'NUMERIC' ); } if ( isset($atts['minimum_bedrooms']) && $atts['minimum_bedrooms'] != '' && is_numeric($atts['minimum_bedrooms']) ) { $meta_query[] = array( 'key' => '_bedrooms', 'value' => sanitize_text_field( $atts['minimum_bedrooms'] ), 'compare' => '>=', 'type' => 'NUMERIC' ); } $base_department = $atts['department']; if ( $atts['department'] !== '' && !in_array($atts['department'], array_keys( ph_get_departments( true ) )) ) { $base_department = ph_get_custom_department_based_on($base_department); } if ( isset($atts['department']) && ( $base_department == 'residential-sales' || $base_department == 'residential-lettings' ) && isset($atts['minimum_price']) && $atts['minimum_price'] != '' ) { $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' ); $minimum_price = $atts['minimum_price']; if ( $search_form_currency != 'GBP' ) { // Convert $atts['minimum_price'] to GBP $ph_countries = new PH_Countries(); $minimum_price = $ph_countries->convert_price_to_gbp( $minimum_price, $search_form_currency ); } $meta_query[] = array( 'key' => '_price_actual', 'value' => sanitize_text_field( floor( $minimum_price ) ), 'compare' => '>=', 'type' => 'NUMERIC' ); } if ( isset($atts['department']) && ( $base_department == 'residential-sales' || $base_department == 'residential-lettings' ) && isset($atts['maximum_price']) && $atts['maximum_price'] != '' ) { $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' ); $maximum_price = $atts['maximum_price']; if ( $search_form_currency != 'GBP' ) { // Convert $atts['maximum_price'] to GBP $ph_countries = new PH_Countries(); $maximum_price = $ph_countries->convert_price_to_gbp( $maximum_price, $search_form_currency ); } $meta_query[] = array( 'key' => '_price_actual', 'value' => sanitize_text_field( ceil( $maximum_price ) ), 'compare' => '<=', 'type' => 'NUMERIC' ); } if ( isset($atts['address_keyword']) && $atts['address_keyword'] != '' ) { $atts['address_keyword'] = ph_clean( trim( $atts['address_keyword'] ) ); $address_keywords = array( $atts['address_keyword'] ); if ( strpos( $atts['address_keyword'], ' ' ) !== FALSE ) { $address_keywords[] = str_replace(" ", "-", $atts['address_keyword']); } if ( strpos( $atts['address_keyword'], '-' ) !== FALSE ) { $address_keywords[] = str_replace("-", " ", $atts['address_keyword']); } if ( strpos( $atts['address_keyword'], '.' ) !== FALSE ) { $address_keywords[] = str_replace(".", "", $atts['address_keyword']); } if ( stripos( $atts['address_keyword'], 'st ' ) !== FALSE ) { $address_keywords[] = str_ireplace("st ", "st. ", $atts['address_keyword']); } if ( strpos( $atts['address_keyword'], '\'' ) !== FALSE ) { $address_keywords[] = str_replace("'", "", $atts['address_keyword']); } $sub_meta_query = array('relation' => 'OR'); $address_keyword_compare = get_option( 'propertyhive_address_keyword_compare', '=' ); if ( $address_keyword_compare == 'polygon' ) { $address_keyword_compare = apply_filters('propertyhive_shortcode_address_keyword_compare', '='); } foreach ( $address_keywords as $address_keyword ) { $sub_meta_query[] = array( 'key' => '_reference_number', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_street', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_two', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_three', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_four', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); } if ( strlen($atts['address_keyword']) <= 4 ) { $sub_meta_query[] = array( 'key' => '_address_postcode', 'value' => sanitize_text_field( $atts['address_keyword'] ), 'compare' => '=' ); // Run regex match where given keyword is at the start of the postcode ^ // followed by one or zero letters (for WC2E-style postcodes) [a-zA-Z]? // then a single space [ ] $sub_meta_query[] = array( 'key' => '_address_postcode', 'value' => sanitize_text_field( $atts['address_keyword'] ) . '[a-zA-Z]?[ ]', 'compare' => 'RLIKE' ); } else { $sub_meta_query[] = array( 'key' => '_address_postcode', 'value' => sanitize_text_field( $atts['address_keyword'] ), 'compare' => 'LIKE' ); } $meta_query[] = $sub_meta_query; } if ( isset($atts['keyword']) && $atts['keyword'] != '' ) { $atts['keyword'] = sanitize_text_field( trim( $atts['keyword'] ) ); $original_keyword = isset($_REQUEST['keyword']) ? $_REQUEST['keyword'] : ''; $_REQUEST['keyword'] = $atts['keyword']; add_filter( 'posts_where', array( PH()->query, 'keyword_excerpt_where' ), 10, 2 ); $keywords = array( $atts['keyword'] ); if ( strpos( $atts['keyword'], ' ' ) !== FALSE ) { $keywords[] = str_replace(" ", "-", $atts['keyword']); } if ( strpos( $atts['keyword'], '-' ) !== FALSE ) { $keywords[] = str_replace("-", " ", $atts['keyword']); } if ( strpos( $atts['keyword'], '.' ) !== FALSE ) { $keywords[] = str_replace(".", "", $atts['keyword']); } if ( stripos( $atts['keyword'], 'st ' ) !== FALSE ) { $keywords[] = str_ireplace("st ", "st. ", $atts['keyword']); } if ( strpos( $atts['keyword'], '\'' ) !== FALSE ) { $keywords[] = str_replace("'", "", $atts['keyword']); } $sub_meta_query = array('relation' => 'OR'); $address_keyword_compare = get_option( 'propertyhive_address_keyword_compare', '=' ); if ( $address_keyword_compare == 'polygon' ) { $address_keyword_compare = apply_filters('propertyhive_shortcode_address_keyword_compare', '='); } foreach ( $keywords as $keyword ) { $sub_meta_query[] = array( 'key' => '_reference_number', 'value' => $keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_street', 'value' => $keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_two', 'value' => $keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_three', 'value' => $keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_four', 'value' => $keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_features_concatenated', 'value' => $keyword, 'compare' => 'LIKE' ); $sub_meta_query[] = array( 'key' => '_descriptions_concatenated', 'value' => $keyword, 'compare' => 'LIKE' ); } if ( strlen($atts['keyword']) <= 4 ) { $sub_meta_query[] = array( 'key' => '_address_postcode', 'value' => sanitize_text_field( $atts['keyword'] ), 'compare' => '=' ); // Run regex match where given keyword is at the start of the postcode ^ // followed by one or zero letters (for WC2E-style postcodes) [a-zA-Z]? // then a single space [ ] $sub_meta_query[] = array( 'key' => '_address_postcode', 'value' => sanitize_text_field( $atts['keyword'] ) . '[a-zA-Z]?[ ]', 'compare' => 'RLIKE' ); } else { $sub_meta_query[] = array( 'key' => '_address_postcode', 'value' => sanitize_text_field( $atts['keyword'] ), 'compare' => 'LIKE' ); } $meta_query[] = $sub_meta_query; $_REQUEST['keyword'] = $original_keyword; // reset back in case it's used elsewhere } if ( isset($atts['country']) && $atts['country'] != '' ) { $meta_query[] = array( 'key' => '_address_country', 'value' => sanitize_text_field( $atts['country'] ), 'compare' => '=', ); } if ( isset($atts['country_not']) && $atts['country_not'] != '' ) { $meta_query[] = array( 'key' => '_address_country', 'value' => sanitize_text_field( $atts['country_not'] ), 'compare' => '!=', ); } if ( isset($atts['office_id']) && $atts['office_id'] != '' ) { $meta_query[] = array( 'key' => '_office_id', 'value' => explode(",", $atts['office_id']), 'compare' => 'IN', ); } if ( isset($atts['negotiator_id']) && $atts['negotiator_id'] != '' ) { $meta_query[] = array( 'key' => '_negotiator_id', 'value' => explode(",", $atts['negotiator_id']), 'compare' => 'IN', ); } if ( isset($atts['commercial_for_sale']) && $atts['commercial_for_sale'] != '' ) { $meta_query[] = array( 'key' => '_for_sale', 'value' => 'yes', 'compare' => '=', ); } if ( isset($atts['commercial_to_rent']) && $atts['commercial_to_rent'] != '' ) { $meta_query[] = array( 'key' => '_to_rent', 'value' => 'yes', 'compare' => '=', ); } $tax_query = array(); if ( isset($atts['availability_id']) && $atts['availability_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'availability', 'terms' => explode(",", $atts['availability_id']), 'compare' => 'IN', ); } // Fallback for deprecated marketing_flag if ( isset($atts['marketing_flag']) && $atts['marketing_flag'] != '' ) { $atts['marketing_flag_id'] = $atts['marketing_flag']; } if ( isset($atts['marketing_flag_id']) && $atts['marketing_flag_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'marketing_flag', 'terms' => explode(",", $atts['marketing_flag_id']), 'compare' => 'IN', ); } if ( isset($atts['property_type_id']) && $atts['property_type_id'] != '' ) { // Change field to check when department is specified as commercial, or if commercial is the only active department if ( ( isset($atts['department']) && $base_department == 'commercial' ) || ( !isset($atts['department']) && get_option( 'propertyhive_active_departments_sales' ) != 'yes' && get_option( 'propertyhive_active_departments_lettings' ) != 'yes' && get_option( 'propertyhive_active_departments_commercial' ) == 'yes' ) ) { $tax_query[] = array( 'taxonomy' => 'commercial_property_type', 'terms' => explode(",", $atts['property_type_id']), 'compare' => 'IN', ); } else { $tax_query[] = array( 'taxonomy' => 'property_type', 'terms' => explode(",", $atts['property_type_id']), 'compare' => 'IN', ); } } if ( isset($atts['location_id']) && $atts['location_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'location', 'terms' => explode(",", $atts['location_id']), 'compare' => 'IN', ); } if ( isset($atts['sale_by_id']) && $atts['sale_by_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'sale_by', 'terms' => explode(",", $atts['sale_by_id']), 'compare' => 'IN', ); } // Change default meta key when department is specified as commercial, or if commercial is the only active department if ( ( isset($atts['department']) && $base_department == 'commercial' ) || ( get_option( 'propertyhive_active_departments_sales' ) != 'yes' && get_option( 'propertyhive_active_departments_lettings' ) != 'yes' && get_option( 'propertyhive_active_departments_commercial' ) == 'yes' ) ) { $atts['meta_key'] = '_floor_area_from_sqft'; } // Get which page we're currently viewing from the URL $paged = max( 1, get_query_var( 'paged' ) ); $args = array( 'post_type' => 'property', 'post_status' => ( ( is_user_logged_in() && current_user_can( 'manage_propertyhive' ) ) ? array('publish', 'private') : 'publish' ), 'ignore_sticky_posts' => 1, 'orderby' => $atts['orderby'], 'order' => $atts['order'], 'posts_per_page' => $atts['posts_per_page'], 'paged' => $paged, 'meta_query' => $meta_query, 'tax_query' => $tax_query, 'has_password' => false, ); if ( ! empty( $atts['meta_key'] ) ) { $args['meta_key'] = $atts['meta_key']; } if ( ! empty( $atts['ids'] ) ) { $include_ids = array_map( 'absint', explode( ',', $atts['ids'] ) ); $include_ids = array_filter( $include_ids ); if ( ! empty( $include_ids ) ) { $args['post__in'] = $include_ids; } } if ( ! empty( $atts['exclude'] ) ) { $exclude_ids = array_map( 'absint', explode( ',', $atts['exclude'] ) ); $exclude_ids = array_filter( $exclude_ids ); if ( ! empty( $exclude_ids ) ) { $args['post__not_in'] = $exclude_ids; } } if ( isset($atts['orderby']) && $atts['orderby'] == 'date' ) { $args['orderby'] = 'meta_value'; $args['meta_key'] = '_on_market_change_date'; } $args['orderby'] .= ' post_title'; ob_start(); do_action('propertyhive_shortcode_properties_before_catalog_ordering', $atts); if ( isset($atts['show_order']) && $atts['show_order'] != '' ) { list( $args, $orderby ) = self::get_show_order_args( $atts, $args ); propertyhive_catalog_ordering( $atts['department'], $orderby ); } do_action('propertyhive_shortcode_properties_after_catalog_ordering', $atts); $args = apply_filters( 'propertyhive_properties_query', $args, $atts ); $args = apply_filters( 'propertyhive_shortcode_properties_query', $args, $atts ); $properties = new WP_Query( $args ); if ( isset($atts['show_result_count']) && $atts['show_result_count'] != '' ) { $total_posts = $properties->found_posts; $first = ( $atts['posts_per_page'] * $paged ) - $atts['posts_per_page'] + 1; $last = min( $total_posts, $atts['posts_per_page'] * $paged ); propertyhive_result_count( $paged, $atts['posts_per_page'], $total_posts, $first, $last); } do_action('propertyhive_shortcode_properties_after_result_count', $atts); $propertyhive_loop['columns'] = (int)$atts['columns']; if ( $properties->have_posts() ) : ?> have_posts() ) : $properties->the_post(); ?>

max_num_pages ); } wp_reset_postdata(); $shortcode_output = ob_get_clean(); return apply_filters( 'propertyhive_properties_shortcode_output', '
' . $shortcode_output . '
', $shortcode_output ); } /** * Recent Properties shortcode * * @access public * @param array $atts * @return string */ public static function recent_properties( $atts ) { global $propertyhive_loop; $atts = shortcode_atts( array( 'per_page' => '12', 'columns' => '4', 'department' => '', 'minimum_price' => '', 'office_id' => '', 'negotiator_id' => '', 'availability_id' => '', 'marketing_flag_id' => '', 'property_type_id' => '', 'sale_by_id' => '', 'location_id' => '', 'commercial_for_sale' => '', 'commercial_to_rent' => '', 'exclude' => '', 'orderby' => 'date', 'order' => 'desc', 'no_results_output' => '', 'pagination' => '', 'show_order' => '', 'show_result_count' => '', 'carousel' => '', ), $atts, 'recent_properties' ); if ( isset($atts['carousel']) && !empty($atts['carousel']) ) { $params = array( 'items' => 1, 'controlsPosition' => 'bottom', 'gutter' => 20, 'mouseDrag' => true, 'nav' => false, 'navPosition' => 'bottom', 'controlsText' => array("Prev", "Next"), 'responsive' => array( 640 => array( 'items' => (int)$atts['columns'] ) ) ); $params = apply_filters( 'propertyhive_carousel_params', $params ); $params = apply_filters( 'propertyhive_recent_properties_carousel_params', $params ); wp_localize_script( 'propertyhive_carousel', 'propertyhive_carousel_params', $params ); wp_enqueue_style( 'tiny_slider_css' ); wp_enqueue_script( 'tiny_slider' ); wp_enqueue_script( 'propertyhive_carousel' ); } $meta_query = PH()->query->get_meta_query(); if ( isset($atts['department']) && $atts['department'] != '' ) { $departments = explode(",", $atts['department']); $departments = array_map('trim', $departments); $departments = array_filter($departments); $meta_query[] = array( 'key' => '_department', 'value' => $departments, 'compare' => 'IN' ); } $base_department = $atts['department']; if ( $atts['department'] !== '' && !in_array($atts['department'], array_keys( ph_get_departments( true ) )) ) { $base_department = ph_get_custom_department_based_on($base_department); } if ( isset($atts['department']) && $base_department == 'residential-sales' && isset($atts['minimum_price']) && $atts['minimum_price'] != '' ) { $search_form_currency = get_option( 'propertyhive_search_form_currency', 'GBP' ); $minimum_price = $atts['minimum_price']; if ( $search_form_currency != 'GBP' ) { // Convert $atts['minimum_price'] to GBP $ph_countries = new PH_Countries(); $minimum_price = $ph_countries->convert_price_to_gbp( $minimum_price, $search_form_currency ); } $meta_query[] = array( 'key' => '_price_actual', 'value' => sanitize_text_field( floor( $minimum_price ) ), 'compare' => '>=', 'type' => 'NUMERIC' ); } if ( isset($atts['office_id']) && $atts['office_id'] != '' ) { $meta_query[] = array( 'key' => '_office_id', 'value' => explode(",", $atts['office_id']), 'compare' => 'IN' ); } if ( isset($atts['negotiator_id']) && $atts['negotiator_id'] != '' ) { $meta_query[] = array( 'key' => '_negotiator_id', 'value' => explode(",", $atts['negotiator_id']), 'compare' => 'IN', ); } if ( isset($atts['commercial_for_sale']) && $atts['commercial_for_sale'] != '' ) { $meta_query[] = array( 'key' => '_for_sale', 'value' => 'yes', 'compare' => '=', ); } if ( isset($atts['commercial_to_rent']) && $atts['commercial_to_rent'] != '' ) { $meta_query[] = array( 'key' => '_to_rent', 'value' => 'yes', 'compare' => '=', ); } $tax_query = array(); if ( isset($atts['availability_id']) && $atts['availability_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'availability', 'terms' => explode(",", $atts['availability_id']), 'compare' => 'IN', ); } if ( isset($atts['marketing_flag_id']) && $atts['marketing_flag_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'marketing_flag', 'terms' => explode(",", $atts['marketing_flag_id']), 'compare' => 'IN', ); } if ( isset($atts['property_type_id']) && $atts['property_type_id'] != '' ) { // Change field to check when department is specified as commercial, or if commercial is the only active department if ( ( isset($atts['department']) && $base_department == 'commercial' ) || ( !isset($atts['department']) && get_option( 'propertyhive_active_departments_sales' ) != 'yes' && get_option( 'propertyhive_active_departments_lettings' ) != 'yes' && get_option( 'propertyhive_active_departments_commercial' ) == 'yes' ) ) { $tax_query[] = array( 'taxonomy' => 'commercial_property_type', 'terms' => explode(",", $atts['property_type_id']), 'compare' => 'IN', ); } else { $tax_query[] = array( 'taxonomy' => 'property_type', 'terms' => explode(",", $atts['property_type_id']), 'compare' => 'IN', ); } } if ( isset($atts['location_id']) && $atts['location_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'location', 'terms' => explode(",", $atts['location_id']), 'compare' => 'IN', ); } if ( isset($atts['sale_by_id']) && $atts['sale_by_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'sale_by', 'terms' => explode(",", $atts['sale_by_id']), 'compare' => 'IN', ); } // Get which page we're currently viewing from the URL $paged = max( 1, get_query_var( 'paged' ) ); $args = array( 'post_type' => 'property', 'post_status' => ( ( is_user_logged_in() && current_user_can( 'manage_propertyhive' ) ) ? array('publish', 'private') : 'publish' ), 'ignore_sticky_posts' => 1, 'posts_per_page' => $atts['per_page'], 'paged' => $paged, 'orderby' => $atts['orderby'], 'order' => $atts['order'], 'meta_query' => $meta_query, 'tax_query' => $tax_query, 'has_password' => false, ); if ( ! empty( $atts['exclude'] ) ) { $exclude_ids = array_map( 'absint', explode( ',', $atts['exclude'] ) ); $exclude_ids = array_filter( $exclude_ids ); if ( ! empty( $exclude_ids ) ) { $args['post__not_in'] = $exclude_ids; } } if ( isset($atts['orderby']) && $atts['orderby'] == 'date' ) { $args['orderby'] = 'meta_value'; $args['meta_key'] = '_on_market_change_date'; } $args['orderby'] .= ' post_title'; ob_start(); if ( isset($atts['show_order']) && $atts['show_order'] != '' ) { list( $args, $orderby ) = self::get_show_order_args( $atts, $args ); propertyhive_catalog_ordering( $atts['department'], $orderby ); } $properties = new WP_Query( apply_filters( 'propertyhive_shortcode_recent_properties_query', $args, $atts ) ); if ( isset($atts['show_result_count']) && $atts['show_result_count'] != '' ) { $total_posts = $properties->found_posts; $first = ( $atts['per_page'] * $paged ) - $atts['per_page'] + 1; $last = min( $total_posts, $atts['per_page'] * $paged ); propertyhive_result_count( $paged, $atts['per_page'], $total_posts, $first, $last); } $propertyhive_loop['columns'] = (int)$atts['columns']; if ( $properties->have_posts() ) : ?> have_posts() ) : $properties->the_post(); ?>

max_num_pages ); } wp_reset_postdata(); $shortcode_output = ob_get_clean(); return apply_filters( 'propertyhive_recent_properties_shortcode_output', '
' . $shortcode_output . '
', $shortcode_output ); } /** * Output featured properties * * @access public * @param array $atts * @return string */ public static function featured_properties( $atts ) { global $propertyhive_loop; $atts = shortcode_atts( array( 'per_page' => '12', 'columns' => '4', 'department' => '', 'address_keyword' => '', 'office_id' => '', 'negotiator_id' => '', 'availability_id' => '', 'exclude' => '', 'orderby' => 'rand', 'order' => 'desc', 'meta_key' => '', 'no_results_output' => '', 'pagination' => '', 'show_order' => '', 'show_result_count' => '', 'carousel' => '', ), $atts, 'featured_properties' ); if ( isset($atts['carousel']) && !empty($atts['carousel']) ) { $params = array( 'items' => 1, 'controlsPosition' => 'bottom', 'gutter' => 20, 'mouseDrag' => true, 'nav' => false, 'navPosition' => 'bottom', 'controlsText' => array("Prev", "Next"), 'responsive' => array( 640 => array( 'items' => (int)$atts['columns'] ) ) ); $params = apply_filters( 'propertyhive_carousel_params', $params ); $params = apply_filters( 'propertyhive_featured_properties_carousel_params', $params ); wp_localize_script( 'propertyhive_carousel', 'propertyhive_carousel_params', $params ); wp_enqueue_style( 'tiny_slider_css' ); wp_enqueue_script( 'tiny_slider' ); wp_enqueue_script( 'propertyhive_carousel' ); } // Get which page we're currently viewing from the URL $paged = max( 1, get_query_var( 'paged' ) ); $args = array( 'post_type' => 'property', 'post_status' => ( ( is_user_logged_in() && current_user_can( 'manage_propertyhive' ) ) ? array('publish', 'private') : 'publish' ), 'ignore_sticky_posts' => 1, 'posts_per_page' => $atts['per_page'], 'paged' => $paged, 'orderby' => $atts['orderby'], 'order' => $atts['order'], 'has_password' => false, ); $meta_query = array( array( 'key' => '_on_market', 'value' => 'yes', ), array( 'key' => '_featured', 'value' => 'yes' ) ); if ( isset($atts['department']) && $atts['department'] != '' ) { $departments = explode(",", $atts['department']); $departments = array_map('trim', $departments); $departments = array_filter($departments); $meta_query[] = array( 'key' => '_department', 'value' => $departments, 'compare' => 'IN' ); } if ( isset($atts['address_keyword']) && $atts['address_keyword'] != '' ) { $atts['address_keyword'] = sanitize_text_field( trim( $atts['address_keyword'] ) ); $address_keywords = array( $atts['address_keyword'] ); if ( strpos( $atts['address_keyword'], ' ' ) !== FALSE ) { $address_keywords[] = str_replace(" ", "-", $atts['address_keyword']); } if ( strpos( $atts['address_keyword'], '-' ) !== FALSE ) { $address_keywords[] = str_replace("-", " ", $atts['address_keyword']); } $sub_meta_query = array('relation' => 'OR'); $address_keyword_compare = get_option( 'propertyhive_address_keyword_compare', '=' ); if ( $address_keyword_compare == 'polygon' ) { $address_keyword_compare = apply_filters('propertyhive_shortcode_address_keyword_compare', '='); } foreach ( $address_keywords as $address_keyword ) { $sub_meta_query[] = array( 'key' => '_reference_number', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_street', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_two', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_three', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); $sub_meta_query[] = array( 'key' => '_address_four', 'value' => $address_keyword, 'compare' => $address_keyword_compare ); } if ( strlen($atts['address_keyword']) <= 4 ) { $sub_meta_query[] = array( 'key' => '_address_postcode', 'value' => sanitize_text_field( $atts['address_keyword'] ), 'compare' => '=' ); // Run regex match where given keyword is at the start of the postcode ^ // followed by one or zero letters (for WC2E-style postcodes) [a-zA-Z]? // then a single space [ ] $sub_meta_query[] = array( 'key' => '_address_postcode', 'value' => sanitize_text_field( $atts['address_keyword'] ) . '[a-zA-Z]?[ ]', 'compare' => 'RLIKE' ); } else { $sub_meta_query[] = array( 'key' => '_address_postcode', 'value' => sanitize_text_field( $atts['address_keyword'] ), 'compare' => 'LIKE' ); } $meta_query[] = $sub_meta_query; } if ( isset($atts['office_id']) && $atts['office_id'] != '' ) { $meta_query[] = array( 'key' => '_office_id', 'value' => explode(",", $atts['office_id']), 'compare' => 'IN' ); } if ( isset($atts['negotiator_id']) && $atts['negotiator_id'] != '' ) { $meta_query[] = array( 'key' => '_negotiator_id', 'value' => explode(",", $atts['negotiator_id']), 'compare' => 'IN', ); } $args['meta_query'] = $meta_query; if ( ! empty( $atts['meta_key'] ) ) { $args['meta_key'] = $atts['meta_key']; } $tax_query = array(); if ( isset($atts['availability_id']) && $atts['availability_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'availability', 'terms' => explode(",", $atts['availability_id']), 'compare' => 'IN', ); } if ( ! empty( $tax_query ) ) { $args['tax_query'] = $tax_query; } if ( isset($atts['orderby']) && $atts['orderby'] == 'date' ) { $args['orderby'] = 'meta_value'; $args['meta_key'] = '_on_market_change_date'; } $args['orderby'] .= ' post_title'; if ( ! empty( $atts['exclude'] ) ) { $exclude_ids = array_map( 'absint', explode( ',', $atts['exclude'] ) ); $exclude_ids = array_filter( $exclude_ids ); if ( ! empty( $exclude_ids ) ) { $args['post__not_in'] = $exclude_ids; } } ob_start(); if ( isset($atts['show_order']) && $atts['show_order'] != '' ) { list( $args, $orderby ) = self::get_show_order_args( $atts, $args ); propertyhive_catalog_ordering( $atts['department'], $orderby ); } $properties = new WP_Query( apply_filters( 'propertyhive_shortcode_featured_properties_query', $args, $atts ) ); if ( isset($atts['show_result_count']) && $atts['show_result_count'] != '' ) { $total_posts = $properties->found_posts; $first = ( $atts['per_page'] * $paged ) - $atts['per_page'] + 1; $last = min( $total_posts, $atts['per_page'] * $paged ); propertyhive_result_count( $paged, $atts['per_page'], $total_posts, $first, $last); } $propertyhive_loop['columns'] = (int)$atts['columns']; if ( $properties->have_posts() ) : ?> have_posts() ) : $properties->the_post(); ?>

max_num_pages ); } wp_reset_postdata(); $shortcode_output = ob_get_clean(); return apply_filters( 'propertyhive_featured_properties_shortcode_output', '', $shortcode_output ); } /** * Output similar properties * * @param array $atts * @return string */ public static function similar_properties( $atts ) { global $property, $propertyhive_loop; $atts = shortcode_atts( array( 'per_page' => '2', 'columns' => '2', 'orderby' => 'rand', 'order' => 'asc', 'price_percentage_bounds' => 10, 'bedroom_bounds' => 0, 'matching_address_field' => '', // only return fields with matching address field. Options: address_two, address_three, address_four, location 'property_id' => '', 'availability_id' => '', 'property_type_id' => '', 'match_property_type' => '', 'exclude' => '', 'no_results_output' => '', 'carousel' => '', ), $atts, 'similar_properties' ); if ( isset($atts['carousel']) && !empty($atts['carousel']) ) { $params = array( 'items' => 1, 'controlsPosition' => 'bottom', 'gutter' => 20, 'mouseDrag' => true, 'nav' => false, 'navPosition' => 'bottom', 'controlsText' => array("Prev", "Next"), 'responsive' => array( 640 => array( 'items' => (int)$atts['columns'] ) ) ); $params = apply_filters( 'propertyhive_carousel_params', $params ); $params = apply_filters( 'propertyhive_similar_properties_carousel_params', $params ); wp_localize_script( 'propertyhive_carousel', 'propertyhive_carousel_params', $params ); wp_enqueue_style( 'tiny_slider_css' ); wp_enqueue_script( 'tiny_slider' ); wp_enqueue_script( 'propertyhive_carousel' ); } if ( $atts['property_id'] == '' && isset($property->id) ) { $atts['property_id'] = $property->id; } if ($atts['property_id'] != '') { $department = get_post_meta( $atts['property_id'], '_department', true ); $args = array( 'post_type' => 'property', 'post__not_in' => array($atts['property_id']), 'post_status' => ( ( is_user_logged_in() && current_user_can( 'manage_propertyhive' ) ) ? array('publish', 'private') : 'publish' ), 'ignore_sticky_posts' => 1, 'posts_per_page' => $atts['per_page'], 'orderby' => $atts['orderby'], 'order' => $atts['order'], 'has_password' => false, ); $meta_query = array(); $meta_query[] = array( 'key' => '_department', 'value' => $department, ); $meta_query[] = array( 'key' => '_on_market', 'value' => 'yes', ); if ( $department != 'commercial' && ph_get_custom_department_based_on( $department ) != 'commercial' ) { // residential $bedrooms = get_post_meta( $atts['property_id'], '_bedrooms', true ); $lower_bedrooms = $bedrooms; $higher_bedrooms = $bedrooms; if ( !empty($bedrooms) && isset($atts['bedroom_bounds']) && $atts['bedroom_bounds'] != '' && is_numeric($atts['bedroom_bounds']) && $atts['bedroom_bounds'] > 0 ) { $lower_bedrooms = $bedrooms - (int)$atts['bedroom_bounds']; $higher_bedrooms = $bedrooms + (int)$atts['bedroom_bounds']; } if ( isset($atts['bedroom_bounds']) && is_numeric($atts['bedroom_bounds']) ) { $meta_query[] = array( 'key' => '_bedrooms', 'value' => array( $lower_bedrooms, $higher_bedrooms ), 'compare' => 'BETWEEN', 'type' => 'NUMERIC' ); } $price = get_post_meta( $atts['property_id'], '_price_actual', true ); $lower_price = $price; $higher_price = $price; $atts['price_percentage_bounds'] = str_replace("%", "", $atts['price_percentage_bounds']); if ( !empty($price) && isset($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] != '' && is_numeric($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] > 0 ) { $lower_price = $price - ($price * (int)$atts['price_percentage_bounds'] / 100); $higher_price = $price + ($price * (int)$atts['price_percentage_bounds'] / 100); } if ( isset($atts['price_percentage_bounds']) && is_numeric($atts['price_percentage_bounds']) ) { $meta_query[] = array( 'key' => '_price_actual', 'value' => array( $lower_price, $higher_price ), 'compare' => 'BETWEEN', 'type' => 'NUMERIC' ); } } else { // commercial $for_sale = get_post_meta( $atts['property_id'], '_for_sale', true ); $to_rent = get_post_meta( $atts['property_id'], '_to_rent', true ); if ( $for_sale == 'yes' || $to_rent == 'yes' ) { $sub_meta_query = array('relation' => 'OR'); if ( $for_sale == 'yes' ) { $prices_sub_query = array('relation' => 'OR'); $price_from = get_post_meta( $atts['property_id'], '_price_from_actual', true ); $price_to = get_post_meta( $atts['property_id'], '_price_to_actual', true ); if ( !empty($price_from) || !empty($price_to) ) { if ( empty($price_from) ) { $price_from = $price_to; } if ( empty($price_to) ) { $price_to = $price_from; } $lower_price_from = $price_from; $higher_price_from = $price_from; if ( isset($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] != '' && is_numeric($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] > 0 ) { $lower_price_from = $price_from - ($price_from * (int)$atts['price_percentage_bounds'] / 100); $higher_price_from = $price_from + ($price_from * (int)$atts['price_percentage_bounds'] / 100); } $lower_price_to = $price_to; $higher_price_to = $price_to; if ( isset($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] != '' && is_numeric($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] > 0 ) { $lower_price_to = $price_to - ($price_to * (int)$atts['price_percentage_bounds'] / 100); $higher_price_to = $price_to + ($price_to * (int)$atts['price_percentage_bounds'] / 100); } // where price from and price to not blank and price from -15% $price_sub_query = array(); $price_sub_query[] = array( 'key' => '_price_from_actual', 'value' => array( '', 0 ), 'compare' => 'NOT IN' ); $price_sub_query[] = array( 'key' => '_price_to_actual', 'value' => array( '', 0 ), 'compare' => 'NOT IN' ); $price_sub_query[] = array( 'key' => '_price_to_actual', 'value' => $lower_price_from, 'compare' => '>=', 'type' => 'NUMERIC' ); $price_sub_query[] = array( 'key' => '_price_from_actual', 'value' => $higher_price_to, 'compare' => '<=', 'type' => 'NUMERIC' ); $prices_sub_query[] = $price_sub_query; } $sub_meta_query[] = array( array( 'key' => '_for_sale', 'value' => $for_sale, ), $prices_sub_query ); } elseif ( $to_rent == 'yes' ) { $prices_sub_query = array('relation' => 'OR'); $price_from = get_post_meta( $atts['property_id'], '_rent_from_actual', true ); $price_to = get_post_meta( $atts['property_id'], '_rent_to_actual', true ); if ( !empty($price_from) || !empty($price_to) ) { if ( empty($price_from) ) { $price_from = $price_to; } if ( empty($price_to) ) { $price_to = $price_from; } $lower_price_from = $price_from; $higher_price_from = $price_from; if ( isset($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] != '' && is_numeric($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] > 0 ) { $lower_price_from = $price_from - ($price_from * (int)$atts['price_percentage_bounds'] / 100); $higher_price_from = $price_from + ($price_from * (int)$atts['price_percentage_bounds'] / 100); } $lower_price_to = $price_to; $higher_price_to = $price_to; if ( isset($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] != '' && is_numeric($atts['price_percentage_bounds']) && $atts['price_percentage_bounds'] > 0 ) { $lower_price_to = $price_to - ($price_to * (int)$atts['price_percentage_bounds'] / 100); $higher_price_to = $price_to + ($price_to * (int)$atts['price_percentage_bounds'] / 100); } // where price from and price to not blank and price from -15% $price_sub_query = array(); $price_sub_query[] = array( 'key' => '_rent_from_actual', 'value' => array( '', 0 ), 'compare' => 'NOT IN' ); $price_sub_query[] = array( 'key' => '_rent_to_actual', 'value' => array( '', 0 ), 'compare' => 'NOT IN' ); $price_sub_query[] = array( 'key' => '_rent_to_actual', 'value' => $lower_price_from, 'compare' => '>=', 'type' => 'NUMERIC' ); $price_sub_query[] = array( 'key' => '_rent_from_actual', 'value' => $higher_price_to, 'compare' => '<=', 'type' => 'NUMERIC' ); $prices_sub_query[] = $price_sub_query; } $sub_meta_query[] = array( array( 'key' => '_to_rent', 'value' => $to_rent, ), $prices_sub_query ); } $meta_query[] = $sub_meta_query; } } if ( isset($atts['matching_address_field']) && in_array($atts['matching_address_field'], array( 'address_two', 'address_three', 'address_four' )) ) { $address_field = get_post_meta( $atts['property_id'], '_' . $atts['matching_address_field'], true ); $meta_query[] = array( 'key' => '_' . $atts['matching_address_field'], 'value' => $address_field, ); } $args['meta_query'] = $meta_query; $tax_query = array(); if ( isset($atts['availability_id']) && $atts['availability_id'] != '' ) { $tax_query[] = array( 'taxonomy' => 'availability', 'terms' => explode(",", $atts['availability_id']), 'compare' => 'IN', ); } $property_types = array(); if ( isset($atts['property_type_id']) && $atts['property_type_id'] != '' ) { $property_types = explode(",", $atts['property_type_id']); } if ( isset($atts['match_property_type']) && $atts['match_property_type'] != '' ) { $term_list = wp_get_post_terms((int)$atts['property_id'], ( ( $department == 'commercial' || ph_get_custom_department_based_on( $department ) == 'commercial' ) ? 'commercial_' : '' ) . 'property_type', array("fields" => "ids")); if ( !is_wp_error($term_list) && is_array($term_list) && !empty($term_list) ) { $property_types = $term_list; } } if ( !empty($property_types) ) { $property_types = array_unique($property_types); $property_types = array_filter($property_types); if ( $department != 'commercial' && ph_get_custom_department_based_on( $department ) != 'commercial' ) { $tax_query[] = array( 'taxonomy' => 'property_type', 'terms' => $property_types, 'compare' => 'IN', ); } else { $tax_query[] = array( 'taxonomy' => 'commercial_property_type', 'terms' => $property_types, 'compare' => 'IN', ); } } if ( isset($atts['matching_address_field']) && $atts['matching_address_field'] == 'location' ) { $term_list = wp_get_post_terms($atts['property_id'], 'location', array("fields" => "ids")); if ( !is_wp_error($term_list) && is_array($term_list) && !empty($term_list) ) { $tax_query[] = array( 'taxonomy' => 'location', 'terms' => $term_list, 'compare' => 'IN', ); } } if ( ! empty( $tax_query ) ) { $args['tax_query'] = $tax_query; } if ( isset($atts['orderby']) && $atts['orderby'] == 'date' ) { $args['orderby'] = 'meta_value'; $args['meta_key'] = '_on_market_change_date'; } $args['orderby'] .= ' post_title'; if ( ! empty( $atts['exclude'] ) ) { $exclude_ids = array_map( 'absint', explode( ',', $atts['exclude'] ) ); $exclude_ids = array_filter( $exclude_ids ); if ( ! empty( $exclude_ids ) ) { $args['post__not_in'] = $exclude_ids; } } ob_start(); $properties = new WP_Query( apply_filters( 'propertyhive_shortcode_similar_properties_query', $args, $atts ) ); $propertyhive_loop['columns'] = (int)$atts['columns']; if ( $properties->have_posts() ) : ?> have_posts() ) : $properties->the_post(); ?>

' . $shortcode_output . '', $shortcode_output ); } /** * Output property map * Should only be used on a property page or where the $property var is set * * @param array $atts * @return string */ public static function property_map( $atts ) { global $property; $atts = shortcode_atts( array( 'id' => '', 'height' => '400', 'zoom' => '14', 'scrollwheel' => 'true', 'init_on_load' => 'true', 'embed' => 'false' ), $atts, 'property_map' ); ob_start(); echo get_property_map( $atts ); return ob_get_clean(); } /** * Output static (image) property map * Should only be used on a property page or where the $property var is set * * @param array $atts * @return string */ public static function property_static_map( $atts ) { global $property; $atts = shortcode_atts( array( 'id' => '', 'height' => '400', 'zoom' => '14', 'link' => 'true', ), $atts, 'property_static_map' ); ob_start(); echo get_property_static_map( $atts ); return ob_get_clean(); } /** * Output property street view * Should only be used on a property page or where the $property var is set * * @param array $atts * @return string */ public static function property_street_view( $atts ) { global $property; $atts = shortcode_atts( array( 'height' => '400', 'init_on_load' => 'true', 'embed' => 'false' ), $atts, 'property_street_view' ); ob_start(); echo get_property_street_view( $atts ); return ob_get_clean(); } /** * Output property office details * Should only be used on a property page or where the $property var is set * * @param array $atts * @return string */ public static function property_office_details( $atts ) { global $property; $atts = shortcode_atts( array( 'address_separator' => '
', 'hyperlink_telephone_number' => true, 'hyperlink_email_address' => true, ), $atts, 'property_office_details' ); $atts['hyperlink_telephone_number'] = (($atts['hyperlink_telephone_number'] === 'true' || $atts['hyperlink_telephone_number'] === true) ? true : false); $atts['hyperlink_email_address'] = (($atts['hyperlink_email_address'] === 'true' || $atts['hyperlink_email_address'] === true) ? true : false); ob_start(); if ( $property->office_id != '' ) { echo '
'; if ( $property->office_name != '' ) { echo '
' . esc_html($property->office_name) . '
'; } if ( $property->get_office_address( $atts['address_separator'] ) != '' ) { echo '
' . $property->get_office_address( $atts['address_separator'] ) . '
'; } if ( $property->office_telephone_number != '' ) { echo '
' . ( ($atts['hyperlink_telephone_number'] === true) ? '' : '' ) . esc_html($property->office_telephone_number) . ( ($atts['hyperlink_telephone_number'] === true) ? '' : '' ) . '
'; } if ( $property->office_email_address != '' ) { echo '
' . ( ($atts['hyperlink_email_address'] === true) ? '' : '' ) . esc_html($property->office_email_address) . ( ($atts['hyperlink_email_address'] === true) ? '' : '' ) . '
'; } echo '
'; } return ob_get_clean(); } /** * Output office map * * @param array $atts * @return string */ public static function office_map( $atts ) { $offices_with_lat_lng = 0; if ( !isset($atts['office_id']) || ( isset($atts['office_id']) && $atts['office_id'] == '' ) ) { $args = array( 'post_type' => 'office', 'nopaging' => true ); $office_query = new WP_Query( $args ); if ( $office_query->have_posts() ) { while ( $office_query->have_posts() ) { $office_query->the_post(); $lat = get_post_meta(get_the_ID(), '_office_latitude', TRUE); $lng = get_post_meta(get_the_ID(), '_office_longitude', TRUE); if ( $lat != '' && $lng != '' ) { ++$offices_with_lat_lng; } } } wp_reset_postdata(); } $atts = shortcode_atts( array( 'office_id' => '', // if wanting to show map for a particular office 'height' => '400', 'zoom' => ( ( ( !isset($atts['office_id']) || ( isset($atts['office_id']) && $atts['office_id'] == '' ) ) && !isset($atts['zoom']) && $offices_with_lat_lng > 1 ) ? 'auto' : '14' ), 'scrollwheel' => 'true' ), $atts, 'office_map' ); ob_start(); $api_key = get_option('propertyhive_google_maps_api_key', ''); wp_register_script('googlemaps', '//maps.googleapis.com/maps/api/js?' . ( ( $api_key != '' && $api_key !== FALSE ) ? 'key=' . $api_key : '' ), false, '3'); wp_enqueue_script('googlemaps'); echo '
'; ?> plugin_url() ) . '/assets/'; wp_enqueue_script( 'propertyhive_account', $assets_path . 'js/frontend/account.js', array( 'jquery' ), PH_VERSION, true ); ob_start(); if ( is_user_logged_in() ) { ph_get_template( 'account/already-logged-in.php' ); return ob_get_clean(); } $form_controls = ph_get_user_details_form_fields(); $form_controls = apply_filters( 'propertyhive_user_details_form_fields', $form_controls ); $form_controls_2 = ph_get_applicant_requirements_form_fields(); $form_controls_2 = apply_filters( 'propertyhive_applicant_requirements_form_fields', $form_controls_2, false ); $form_controls = array_merge( $form_controls, $form_controls_2 ); if ( get_option( 'propertyhive_applicant_registration_form_disclaimer', '' ) != '' ) { $disclaimer = get_option( 'propertyhive_applicant_registration_form_disclaimer', '' ); $form_controls['disclaimer'] = array( 'type' => 'checkbox', 'label' => $disclaimer, 'label_style' => 'width:100%;', 'required' => true ); } $form_controls = apply_filters( 'propertyhive_applicant_registration_form_fields', $form_controls ); ph_get_template( 'account/applicant-registration-form.php', array( 'form_controls' => $form_controls ) ); return ob_get_clean(); } /** * Output 'Login' page * * @param array $atts * @return string */ public static function login_form( $atts ) { $atts = shortcode_atts( array( ), $atts, 'login_form' ); $assets_path = str_replace( array( 'http:', 'https:' ), '', PH()->plugin_url() ) . '/assets/'; wp_enqueue_script( 'propertyhive_account', $assets_path . 'js/frontend/account.js', array( 'jquery' ), PH_VERSION, true ); ob_start(); if ( is_user_logged_in() ) { ph_get_template( 'account/already-logged-in.php' ); return ob_get_clean(); } // Check 'propertyhive_applicant_users' setting is enabled if ( get_option( 'propertyhive_applicant_users', '' ) != 'yes' ) { ph_get_template( 'account/invalid-access.php' ); return ob_get_clean(); } ph_get_template( 'account/login-form.php' ); return ob_get_clean(); } /** * Output 'Reset Password' page * * @param array $atts * @return string */ public static function reset_password_form( $atts ) { $atts = shortcode_atts( array( ), $atts, 'reset_password_form' ); $assets_path = str_replace( array( 'http:', 'https:' ), '', PH()->plugin_url() ) . '/assets/'; wp_enqueue_script( 'propertyhive_account', $assets_path . 'js/frontend/account.js', array( 'jquery' ), PH_VERSION, true ); ob_start(); if ( is_user_logged_in() ) { ph_get_template( 'account/already-logged-in.php' ); return ob_get_clean(); } // Check 'propertyhive_applicant_users' setting is enabled if ( get_option( 'propertyhive_applicant_users', '' ) != 'yes' ) { ph_get_template( 'account/invalid-access.php' ); return ob_get_clean(); } // check key provided is valid if ( !isset($_GET['key']) || empty(ph_clean($_GET['key'])) || !isset($_GET['id']) || empty(absint($_GET['id'])) ) { echo esc_html(__( 'Invalid key or id provided. Please try again', 'propertyhive' )); return ob_get_clean(); } $key = ph_clean($_GET['key']); $user_id = absint($_GET['id']); $userdata = get_userdata( $user_id ); $user_login = $userdata ? $userdata->user_login : ''; $user = check_password_reset_key( $key, $user_login ); if ( is_wp_error( $user ) ) { echo esc_html(__( 'This key is invalid or has already been used. Please reset your password again if needed.', 'propertyhive' )); return ob_get_clean(); } ph_get_template( 'account/reset-password-form.php', array( 'reset_key' => $key, 'reset_login' => $user_login ) ); return ob_get_clean(); } /** * Output 'My Account' page * * @param array $atts * @return string */ public static function my_account( $atts ) { $atts = shortcode_atts( array( ), $atts, 'my_account' ); $assets_path = str_replace( array( 'http:', 'https:' ), '', PH()->plugin_url() ) . '/assets/'; wp_enqueue_script( 'propertyhive_account', $assets_path . 'js/frontend/account.js', array( 'jquery' ), PH_VERSION, true ); ob_start(); // Check user is logged in if ( !is_user_logged_in() ) { ph_get_template( 'account/invalid-access.php' ); return ob_get_clean(); } // Check 'propertyhive_applicant_users' setting is enabled if ( get_option( 'propertyhive_applicant_users', '' ) != 'yes' ) { ph_get_template( 'account/invalid-access.php' ); return ob_get_clean(); } ph_get_template( 'account/my-account.php' ); return ob_get_clean(); } private static function get_show_order_args( $atts, $args ) { $orderby = ''; if ( isset( $_GET['orderby'] ) && $_GET['orderby'] != '' ) { $PH_Query = new PH_Query(); $ordering_args = $PH_Query->get_search_results_ordering_args(); $args['orderby'] = $ordering_args['orderby']; $args['order'] = $ordering_args['order']; if ( isset( $ordering_args['meta_key'] ) ) { $args['meta_key'] = $ordering_args['meta_key']; } else { unset($args['meta_key']); } } else { switch ( $atts['orderby'] ) { case 'date': $orderby = 'date'; break; case 'meta_value_num': switch ( $atts['meta_key'] ) { case '_price_actual': $orderby = 'price'; break; case '_floor_area_from_sqft': $orderby = 'floor_area'; break; } if ( $orderby != '' && !empty($atts['order']) ) { $orderby .= '-' . $atts['order']; } break; } } return array( $args, $orderby ); } }