Opal-Estate-Pro/inc/property/class-opalestate-property.php
2019-10-01 12:16:57 +07:00

734 lines
16 KiB
PHP
Executable File

<?php
/**
* $Desc$
*
* @version $Id$
* @package opalestate
* @author Opal Team <info@wpopal.com >
* @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved.
* @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
*
* @website http://www.wpopal.com
* @support http://www.wpopal.com/support/forum.html
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
/**
* @class Opalestate_Property
*
* @version 1.0
*/
class Opalestate_Property {
/**
* @var Integer $post_id
*
* @access protected
*/
public $post_id;
/**
* @var array $metabox_info
*
* @access protected
*/
protected $metabox_info;
/**
* @var float $price
*
* @access protected
*/
protected $price;
/**
* @var float $saleprice
*
* @access protected
*/
protected $saleprice;
/**
* @var String $map
*
* @access protected
*/
protected $map;
/**
* @var Integer $address
*
* @access protected
*/
public $address;
/**
* @var String $sku
*
* @access protected
*/
public $sku;
/**
* @var String $latitude
*
* @access protected
*/
public $latitude;
/**
* @var String $longitude
*
* @access protected
*/
public $longitude;
/**
* @var Integer $featured 1 or 0
*
* @access protected
*/
public $featured;
/**
* @var array Property page settings $property_settings
*
* @access public
*/
public $property_settings;
/**
* Constructor
*/
public function __construct( $post_id ) {
$this->post_id = $post_id;
$this->map = $this->get_metabox_value( 'map' );
$this->address = $this->get_metabox_value( 'address' );
$this->price = $this->get_metabox_value( 'price' );
$this->saleprice = $this->get_metabox_value( 'saleprice' );
$this->before_pricelabel = $this->get_metabox_value( 'before_pricelabel' );
$this->pricelabel = $this->get_metabox_value( 'pricelabel' );
$this->featured = $this->get_metabox_value( 'featured' );
$this->sku = $this->get_metabox_value( 'sku' );
$this->latitude = isset( $this->map['latitude'] ) ? $this->map['latitude'] : '';
$this->longitude = isset( $this->map['longitude'] ) ? $this->map['longitude'] : '';
}
/**
* Get A Instance Of Opalestate_Property
*/
public static function get_instance( $post_id ) {
static $_instance;
if ( ! $_instance ) {
$_instance = new Opalestate_Property( $post_id );
}
return $_instance;
}
public function get_block_setting( $key ) {
if ( ! $this->property_settings ) {
$keys = [
'amenities',
'attachments',
'facilities',
'video',
'virtual_tour',
'map',
'nearby',
'walkscores',
'apartments',
'floor_plans',
'views_statistics',
'author_box',
'enquire_form',
'mortgage',
];
foreach ( $keys as $key ) {
$this->property_settings[ $key ] = opalestate_get_option( 'enable_single_' . $key, 'on' );
}
}
return $this->property_settings[ $key ];
}
/**
* Gets Amenities
*
* @access public
* @param string $all
* @return array
*/
public function get_meta_fullinfo() {
if ( empty( $this->metabox_info ) ) {
$fields = Opalestate_Property_MetaBox::metaboxes_info_fields();
foreach ( $fields as $a => $field ) {
$id = str_replace( OPALESTATE_PROPERTY_PREFIX, '', $field['id'] );
if ( $field['type'] == 'multicheck' || $field['type'] == 'select' ) {
$opt_values = (array) get_post_meta( $this->post_id, $field['id'] );
if ( ! empty( $opt_values ) && isset( $field['options'] ) ) {
$tmp = [];
foreach ( $opt_values as $key => $val ) {
if ( isset( $field['options'][ $val ] ) ) {
$tmp[ $val ] = $field['options'][ $val ];
}
}
$opt_values = $tmp;
}
$value = implode( ", ", $opt_values );
} else {
$value = get_post_meta( $this->post_id, $field['id'], true );
}
$value = isset( $field['unit'] ) && $field['unit'] ? $value . ' ' . $field['unit'] : $value;
$this->metabox_info[ $id ] = [ 'label' => $field['name'], 'value' => $value ];
}
}
return apply_filters( 'opalestate_property_metabox_info', $this->metabox_info );
}
public function get_id() {
return $this->post_id;
}
/**
*
*/
public function is_featured() {
return $this->featured;
}
/**
*
*/
public function get_meta_search_objects() {
$prop = new stdClass();
$map = $this->get_metabox_value( 'map' );
$image_id = get_post_thumbnail_id( $this->post_id );
if ( $image_id ) {
$url = wp_get_attachment_url( $image_id, opalestate_options( 'loop_image_size', 'large' ), true );
} else {
$url = opalestate_get_image_placeholder( apply_filters( 'opalestate_loop_property_thumbnail', 'large' ), true );
}
$prop->id = $this->post_id;
$prop->title = get_the_title();
$prop->url = get_permalink( $this->post_id );
$prop->lat = $map['latitude'];
$prop->lng = $map['longitude'];
$prop->address = $this->address;
$prop->pricehtml = opalestate_price_format( $this->get_price() );
$prop->pricelabel = $this->get_price_label();
$prop->thumb = $url;
if ( file_exists( get_template_directory() . '/images/map/market_icon.png' ) ) {
$prop->icon = get_template_directory_uri() . '/images/map/market_icon.png';
} else {
$prop->icon = OPALESTATE_PLUGIN_URL . '/assets/map/market_icon.png';
}
$prop->icon = apply_filters( 'opalestate_prop_icon', $prop->icon );
$prop->featured = $this->featured;
$metas = Opalestate_Property_MetaBox::metaboxes_info_fields();
foreach ( $metas as $key => $field ) {
$id = str_replace( OPALESTATE_PROPERTY_PREFIX, "", $field['id'] );
$prop->$id = get_post_meta( $this->post_id, $field['id'], true );
}
$metas = $this->get_meta_shortinfo();
$prop->metas = $metas;
$prop->status = $this->render_statuses();
$terms = wp_get_post_terms( $this->post_id, 'opalestate_types' );
if ( $terms ) {
$term = reset( $terms );
$icon = get_term_meta( $term->term_id, 'opalestate_type_iconmarker', true );
if ( $icon ) {
$prop->icon = $icon;
}
}
return $prop;
}
/**
* Gets Amenities
*
* @access public
* @param string $all
* @return array
*/
public function get_meta_shortinfo() {
$output = [];
$meta = opalestate_options( 'show_property_meta' );
$meta = apply_filters( 'opalestate_property_meta_shortinfo_fields', $meta );
if ( ! empty( $meta ) ) {
$fields = $this->get_meta_fullinfo();
foreach ( $meta as $key => $value ) {
if ( isset( $fields[ $value ] ) ) {
$output[ $value ] = $fields[ $value ];
}
}
}
return $output;
}
/**
* Gets Amenities
*
* @access public
* @param string $all
* @return array
*/
public function get_amenities( $all = true ) {
if ( $all ) {
$terms = Opalestate_Query::get_amenities();
} else {
$terms = wp_get_post_terms( $this->post_id, 'opalestate_amenities' );
}
return $terms;
}
/**
*
*/
public function get_locations() {
$terms = wp_get_post_terms( $this->post_id, 'opalestate_location' );
if ( $terms ) {
return $terms;
}
return [];
}
/**
* Gets locations
*
* @access public
* @return array
*/
public function render_locations() {
$terms = wp_get_post_terms( $this->post_id, 'opalestate_location' );
if ( $terms ) {
$output = '<span class="property-locations">';
foreach ( $terms as $key => $term ) {
$output .= '<a href="' . get_term_link( $term->term_id ) . '" class="location-name">' . $term->name . '</a>';
if ( $key < ( count( $terms ) - 1 ) ) {
$output .= ", ";
}
}
$output .= '</span>';
echo $output;
}
}
/**
* Gets labels
*
* @access public
* @return array
*/
public function get_labels() {
return wp_get_post_terms( $this->post_id, 'opalestate_label' );
}
/**
* Render labels.
*
* @access public
* @return string
*/
public function render_labels() {
$labels = $this->get_labels();
if ( empty( $labels ) ) {
return;
}
$output = '<ul class="property-labels">';
foreach ( $labels as $key => $value ) {
$output .= '<li class="property-labels-item property-label-' . trim( $value->slug ) . '"><span class="label-status label">' . esc_html( $value->name ) . '</span></li>';
}
$output .= '</ul>';
return $output;
}
/**
* Gets statuses
*
* @access public
* @return array
*/
public function get_status() {
$terms = wp_get_post_terms( $this->post_id, 'opalestate_status' );
return $terms;
}
/**
* Render statuses.
*
* @access public
* @return string
*/
public function render_statuses() {
$statuses = $this->get_status();
if ( empty( $statuses ) ) {
return;
}
$output = '<ul class="property-status">';
foreach ( $statuses as $key => $value ) {
$output .= '<li class="property-status-item property-status-' . esc_attr( $value->slug ) . '"><span class="label-status label">' . esc_html( $value->name ) . '</span></li>';
}
$output .= '</ul>';
return $output;
}
/**
*
*/
public function getAuthor() {
}
public function get_author_type() {
return $this->get_metabox_value( 'author_type' );
}
/**
*
*/
public function render_author_link() {
switch ( $this->get_author_type() ) {
case 'hide':
return;
break;
case 'agent':
$agent_id = $this->get_metabox_value( 'agent' );
$data = OpalEstate_Agent::get_link( $agent_id );
break;
case 'agency':
$agency_id = $this->get_metabox_value( 'agency' );
$data = OpalEstate_Agency::get_link( $agency_id );
break;
default:
$data = $this->get_author_link();
break;
}
$avatar = $data['avatar'] ? $data['avatar'] : opalestate_get_image_avatar_placehold();
$avatar = '<img class="avatar" src="' . esc_url( $avatar ) . '" alt="' . $data['name'] . '" />';
return '<a href="' . $data['link'] . '" aria-label="' . $data['name'] . '" class="author-link"><span aria-label="' . $data['name'] . '" class="author-avatar hint--top">' . $avatar . '</span><span class="author-name">' . $data['name'] . '</span></a>';
}
public function get_author_link() {
$image_id = get_user_meta( get_the_author_meta( 'ID' ), OPALESTATE_USER_PROFILE_PREFIX . 'avatar_id', true );
$related_id = get_user_meta( get_the_author_meta( 'ID' ), OPALESTATE_USER_PROFILE_PREFIX . 'related_id', true );
if ( $image_id ) {
$url = wp_get_attachment_url( $image_id );
} else {
$url = get_avatar_url( get_the_author_meta( 'email' ) );
}
if ( $related_id ) {
$authorlink = get_permalink( $related_id );
$author = get_the_title( $related_id );
} else {
$authorlink = get_author_posts_url( get_the_author_meta( 'ID' ) );
$author = get_the_author();
}
return [
'name' => $author,
'avatar' => $url,
'link' => $authorlink,
];
}
/**
* Gets status
*
* @access public
* @return array
*/
public function get_category_tax() {
$terms = wp_get_post_terms( $this->post_id, 'property_category' );
return $terms;
}
public function get_types_tax() {
$terms = wp_get_post_terms( $this->post_id, 'opalestate_types' );
return $terms;
}
/**
* Gets meta box value
*
* @access public
* @param $key
* @param $single
* @return string
*/
public function get_metabox_value( $key, $single = true ) {
return get_post_meta( $this->post_id, OPALESTATE_PROPERTY_PREFIX . $key, $single );
}
/**
* Gets map value
*
* @access public
* @return string
*/
public function get_map() {
return $this->map;
}
/**
* Gets address value
*
* @access public
* @return string
*/
public function get_address() {
return $this->address;
}
/**
* Gets sku value
*
* @access public
* @return string
*/
public function get_sku() {
return $this->sku;
}
/**
* Gets video url value
*
* @access public
* @return string
*/
public function get_video_url() {
return $this->get_metabox_value( 'video' );
}
/**
* Gets 360 virtual tour value
*
* @access public
* @return string
*/
public function get_virtual_tour() {
return $this->get_metabox_value( 'virtual' );
}
/**
* Gets gallery ids value
*
* @access public
* @return array
*/
public function get_gallery() {
return $this->get_metabox_value( 'gallery', true );
}
/**
* Count gallery images.
*
* @return int
*/
public function get_gallery_count() {
$count = $this->get_gallery();
return is_array( $count ) && $count ? count( $count ) : 0;
}
/**
* Gets price value
*
* @access public
* @return string
*/
public function get_price() {
return $this->price;
}
/**
* Gets sale price value
*
* @access public
* @return string
*/
public function get_sale_price() {
return $this->saleprice;
}
/**
* Gets price value
*
* @access public
* @return string
*/
public function get_before_price_label() {
return $this->before_pricelabel;
}
/**
* Gets price value
*
* @access public
* @return string
*/
public function get_price_label() {
return $this->pricelabel;
}
/**
* Gets price format value
*
* @access public
* @return string
*/
public function get_format_price() {
return $this->get_metabox_value( 'formatprice' );
}
public function enable_google_mapview() {
return $this->get_metabox_value( 'enablemapview' );
}
public function get_google_map_link() {
$url = 'https://maps.google.com/maps?q=' . $this->address . '&ll=' . $this->latitude . ',' . $this->longitude . '&z=17';
return $url;
}
public static function is_allowed_remove( $user_id, $item_id ) {
$item = get_post( $item_id );
if ( ! empty( $item->post_author ) ) {
if ( $item->post_author == $user_id ) {
return true;
}
}
return false;
}
public function get_price_oncall() {
return $this->get_metabox_value( 'price_oncall' );
}
public function get_facilities() {
return $this->get_metabox_value( 'public_facilities_group' );
}
public function get_attachments() {
return $this->get_metabox_value( 'attachments' );
}
public function get_content_single_layout() {
return $this->get_metabox_value( 'layout' );
}
public function get_preview_template() {
return $this->get_metabox_value( 'preview' );
}
/**
* Get rating count.
*
* @param string $context What the value is for. Valid values are view and edit.
* @return int
*/
public function get_rating_counts() {
return $this->get_metabox_value( 'rating_count' ) ? $this->get_metabox_value( 'rating_count' ) : 0;
}
/**
* Get average rating.
*
* @param string $context What the value is for. Valid values are view and edit.
* @return float
*/
public function get_average_rating() {
return $this->get_metabox_value( 'average_rating' ) ? $this->get_metabox_value( 'average_rating' ) : 0;
}
/**
* Get review count.
*
* @param string $context What the value is for. Valid values are view and edit.
* @return int
*/
public function get_review_count() {
return $this->get_metabox_value( 'review_count' ) ? $this->get_metabox_value( 'review_count' ) : 0;
}
public function get_rating_count_stats() {
return $this->get_metabox_value( 'rating_count_stats' ) ? $this->get_metabox_value( 'rating_count_stats' ) : [
5 => 0,
4 => 0,
3 => 0,
2 => 0,
1 => 0,
];
}
public function get_rating_average_stats() {
return $this->get_metabox_value( 'rating_average_stats' );
}
public function get_apartments() {
return $this->get_metabox_value( 'apartments' );
}
public function get_floor_plans() {
return $this->get_metabox_value( 'public_floor_group' );
}
public function get_posted() {
return human_time_diff( get_the_time( 'U' ), current_time( 'timestamp' ) ) . ' ' . esc_html__( 'ago' );
}
}