* @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_MetaBox { /** * Register admin fields. */ public function register_admin_fields() { $prefix = OPALESTATE_PROPERTY_PREFIX; $box_options = [ 'id' => 'property_metabox', 'title' => esc_html__( 'Property Metabox', 'opalestate-pro' ), 'object_types' => [ 'opalestate_property' ], 'show_names' => true, ]; // Setup meta box $cmb = new_cmb2_box( $box_options ); // Setting tabs $tabs_setting = [ 'config' => $box_options, 'layout' => 'vertical', // Default : horizontal 'tabs' => [], ]; $tabs_setting['tabs'][] = [ 'id' => 'p-general', 'icon' => 'dashicons-admin-home', 'title' => esc_html__( 'General', 'opalestate-pro' ), 'fields' => $this->metaboxes_management_fields(), ]; $tabs_setting['tabs'][] = [ 'id' => 'p-prices', 'icon' => 'dashicons-admin-tools', 'title' => esc_html__( 'Prices', 'opalestate-pro' ), 'fields' => $this->metaboxes_price_fields(), ]; $tabs_setting['tabs'][] = [ 'id' => 'p-information', 'icon' => 'dashicons-admin-post', 'title' => esc_html__( 'Information', 'opalestate-pro' ), 'fields' => $this->metaboxes_info_fields(), ]; $tabs_setting['tabs'][] = [ 'id' => 'p-facilities', 'icon' => 'dashicons-grid-view', 'title' => esc_html__( 'Facility', 'opalestate-pro' ), 'fields' => $this->metaboxes_public_facilities_fields(), ]; $tabs_setting['tabs'][] = [ 'id' => 'p-floor-plans', 'icon' => 'dashicons-grid-view', 'title' => esc_html__( 'Floor Plan', 'opalestate-pro' ), 'fields' => $this->metaboxes_floor_plans(), ]; $tabs_setting['tabs'][] = [ 'id' => 'p-apartments', 'icon' => 'dashicons-admin-multisite', 'title' => esc_html__( 'Apartments', 'opalestate-pro' ), 'fields' => $this->metaboxes_apartments(), ]; //// $tabs_setting['tabs'][] = [ 'id' => 'p-gallery', 'icon' => 'dashicons-format-gallery', 'title' => esc_html__( 'Gallery', 'opalestate-pro' ), 'fields' => [ [ 'id' => "{$prefix}gallery", 'name' => esc_html__( 'Images Gallery', 'opalestate-pro' ), 'type' => 'file_list', 'description' => esc_html__( 'Select one or more images to show as gallery', 'opalestate-pro' ), ], ], ]; /// $tabs_setting['tabs'][] = [ 'id' => 'p-vt_gallery', 'title' => esc_html__( 'Virtual Tour 360', 'opalestate-pro' ), 'icon' => 'dashicons-format-image', 'fields' => [ [ 'id' => "{$prefix}vt_gallery", 'name' => esc_html__( 'Manual Images 360 ', 'opalestate-pro' ), 'type' => 'opal_upload', 'description' => esc_html__( 'Select one or more images to show as gallery', 'opalestate-pro' ), ], [ 'id' => "{$prefix}virtual", 'name' => esc_html__( 'Or 360° Virtual Tour', 'opalestate-pro' ), 'type' => 'textarea_code', 'description' => esc_html__( 'Input iframe to show 360° Virtual Tour.', 'opalestate-pro' ), ], ], ]; /// $tabs_setting['tabs'][] = [ 'id' => 'p-attachments', 'icon' => 'dashicons-media-default', 'title' => esc_html__( 'Attachments', 'opalestate-pro' ), 'fields' => [ [ 'id' => "{$prefix}attachments", 'name' => esc_html__( 'Attachments', 'opalestate-pro' ), 'type' => 'file_list', 'options' => [ 'url' => false, // Hide the text input for the url ], 'description' => esc_html__( 'Select one or more files to allow download', 'opalestate-pro' ), ], ], ]; $tabs_setting['tabs'][] = [ 'id' => 'p-agents', 'icon' => 'dashicons-admin-users', 'title' => esc_html__( 'Contact Member', 'opalestate-pro' ), 'fields' => $this->metaboxes_members_fields(), ]; $tabs_setting['tabs'][] = [ 'id' => 'p-assignment', 'icon' => 'dashicons-admin-users', 'title' => esc_html__( 'User Assignment', 'opalestate-pro' ), 'fields' => $this->metaboxes_assignment_fields(), ]; $tabs_setting['tabs'][] = [ 'id' => 'p-layout', 'title' => esc_html__( 'Layout', 'opalestate-pro' ), 'fields' => $this->metaboxes_layout_fields(), ]; // Set tabs $cmb->add_field( [ 'id' => '__tabs', 'type' => 'tabs', 'tabs' => $tabs_setting, ] ); return true; } /** * Management fields. */ public function metaboxes_management_fields() { $prefix = OPALESTATE_PROPERTY_PREFIX; $fields = [ [ 'name' => esc_html__( 'Featured', 'opalestate-pro' ), 'id' => $prefix . 'featured', 'type' => 'switch', 'options' => [ 'on' => esc_html__( 'Yes', 'opalestate-pro' ), 'off' => esc_html__( 'No', 'opalestate-pro' ), ], 'default' => 'off', ], [ 'name' => esc_html__( 'Property SKU', 'opalestate-pro' ), 'id' => $prefix . 'sku', 'type' => 'text', 'description' => esc_html__( 'Please Enter Your Property SKU', 'opalestate-pro' ), ], [ 'id' => $prefix . 'map', 'name' => esc_html__( 'Location', 'opalestate-pro' ), 'type' => 'opal_map', 'sanitization_cb' => 'opal_map_sanitise', 'split_values' => true, ], [ 'name' => esc_html__( 'Postal Code / Zip', 'opalestate-pro' ), 'id' => $prefix . 'zipcode', 'type' => 'text', ], [ 'name' => esc_html__( 'Google Map View', 'opalestate-pro' ), 'id' => $prefix . 'enablemapview', 'type' => 'switch', 'options' => [ 'on' => esc_html__( 'Yes', 'opalestate-pro' ), 'off' => esc_html__( 'No', 'opalestate-pro' ), ], ], [ 'name' => esc_html__( 'Address', 'opalestate-pro' ), 'id' => $prefix . 'address', 'type' => 'textarea_small', ], [ 'id' => "{$prefix}video", 'name' => esc_html__( 'Video', 'opalestate-pro' ), 'type' => 'text_url', 'description' => esc_html__( 'Input for videos, audios from Youtube, Vimeo and all supported sites by WordPress. It has preview feature.', 'opalestate-pro' ), ], ]; return apply_filters( 'opalestate_postype_property_metaboxes_fields_management', $fields ); } /** * Price fields. */ public function metaboxes_price_fields() { $prefix = OPALESTATE_PROPERTY_PREFIX; $currency = opalestate_currency_symbol() ? ' (' . opalestate_currency_symbol() . ')' : ' ($)'; $fields = [ [ 'id' => $prefix . 'price', 'name' => esc_html__( 'Regular Price', 'opalestate-pro' ) . $currency, 'type' => 'text', 'description' => esc_html__( 'Enter amount without currency', 'opalestate-pro' ), 'attributes' => opalestate_get_option( 'require_input_price' ) ? [ 'required' => 'required' ] : '', 'before_row' => '

' . ( is_admin() ? "" : esc_html__( 'Price', 'opalestate-pro' ) ) . '

', // callback ], [ 'id' => $prefix . 'saleprice', 'name' => esc_html__( 'Sale Price', 'opalestate-pro' ) . $currency, 'type' => 'text', 'description' => esc_html__( 'Enter amount without currency', 'opalestate-pro' ), ], [ 'id' => $prefix . 'before_pricelabel', 'name' => esc_html__( 'Before Price Label (optional)', 'opalestate-pro' ), 'type' => 'text', 'description' => esc_html__( 'Before Price Label (e.g. "from")', 'opalestate-pro' ), ], [ 'id' => $prefix . 'pricelabel', 'name' => esc_html__( 'After Price Label (optional)', 'opalestate-pro' ), 'type' => 'text', 'description' => esc_html__( 'After Price Label (e.g. "per month")', 'opalestate-pro' ), 'after_row' => '
', // callback ], [ 'name' => esc_html__( 'Is Price On Call', 'opalestate-pro' ), 'id' => $prefix . 'price_oncall', 'type' => 'switch', 'options' => [ 'on' => esc_html__( 'Yes', 'opalestate-pro' ), 'off' => esc_html__( 'No', 'opalestate-pro' ), ], 'default' => 'off', ], ]; return apply_filters( 'opalestate_postype_property_metaboxes_fields_price', $fields ); } /** * Information fields. */ public static function metaboxes_info_fields() { $prefix = OPALESTATE_PROPERTY_PREFIX; $fields = [ [ 'name' => esc_html__( 'Built year', 'opalestate-pro' ), 'id' => $prefix . 'builtyear', 'type' => 'text', 'description' => esc_html__( 'Enter built year', 'opalestate-pro' ), 'before_row' => '

' . ( is_admin() ? "" : esc_html__( 'Property Information', 'opalestate-pro' ) ) . '

', ], [ 'name' => esc_html__( 'Parking', 'opalestate-pro' ), 'id' => $prefix . 'parking', 'type' => 'text', 'attributes' => [ 'type' => 'number', 'min' => 0, ], 'description' => esc_html__( 'Enter number of Parking', 'opalestate-pro' ), ], [ 'name' => esc_html__( 'Bedrooms', 'opalestate-pro' ), 'id' => $prefix . 'bedrooms', 'type' => 'text', 'attributes' => [ 'type' => 'number', 'min' => 0, ], 'description' => esc_html__( 'Enter number of bedrooms', 'opalestate-pro' ), ], [ 'name' => esc_html__( 'Bathrooms', 'opalestate-pro' ), 'id' => $prefix . 'bathrooms', 'type' => 'text', 'attributes' => [ 'type' => 'number', 'min' => 0, ], 'description' => esc_html__( 'Enter number of bathrooms', 'opalestate-pro' ), ], [ 'name' => esc_html__( 'Plot Size', 'opalestate-pro' ), 'id' => $prefix . 'plotsize', 'type' => 'text', 'description' => esc_html__( 'Enter size of Plot as 20x30, 20x30x40, 20x30x40x50', 'opalestate-pro' ), ], [ 'name' => esc_html__( 'Area Size', 'opalestate-pro' ), 'id' => $prefix . 'areasize', 'type' => 'text', 'description' => esc_html__( 'Enter size of area in sqft', 'opalestate-pro' ), ], [ 'name' => esc_html__( 'Orientation', 'opalestate-pro' ), 'id' => "{$prefix}orientation", 'type' => 'text', 'description' => esc_html__( 'Enter Orientation of property', 'opalestate-pro' ), ], [ 'name' => esc_html__( 'Living Rooms', 'opalestate-pro' ), 'id' => "{$prefix}livingrooms", 'type' => 'text', 'attributes' => [ 'type' => 'number', 'min' => 0, ], 'description' => esc_html__( 'Enter Number of Living Rooms', 'opalestate-pro' ), ], [ 'name' => esc_html__( 'Kitchens', 'opalestate-pro' ), 'id' => "{$prefix}kitchens", 'type' => 'text', 'attributes' => [ 'type' => 'number', 'min' => 0, ], 'description' => esc_html__( 'Enter Number of Kitchens', 'opalestate-pro' ), ], [ 'name' => esc_html__( 'Rooms', 'opalestate-pro' ), 'id' => "{$prefix}amountrooms", 'type' => 'text', 'attributes' => [ 'type' => 'number', 'min' => 0, ], 'description' => esc_html__( 'Enter Number of Amount Rooms', 'opalestate-pro' ), 'after_row' => '
', ], ]; return apply_filters( 'opalestate_postype_property_metaboxes_fields_info', $fields ); } /** * Facilites fields. */ public function metaboxes_public_facilities_fields() { $prefix = OPALESTATE_PROPERTY_PREFIX; $fields = [ [ 'id' => $prefix . 'public_facilities_group', 'type' => 'group', 'fields' => [ [ 'id' => $prefix . 'public_facilities_key', 'name' => esc_html__( 'Label', 'opalestate-pro' ), 'type' => 'text', ], [ 'id' => $prefix . 'public_facilities_value', 'name' => esc_html__( 'Content', 'opalestate-pro' ), 'type' => 'text', ], ], 'options' => [ 'group_title' => esc_html__( 'Facility {#}', 'opalestate-pro' ), 'add_button' => esc_html__( 'Add more', 'opalestate-pro' ), 'remove_button' => esc_html__( 'Remove', 'opalestate-pro' ), 'sortable' => true, 'closed' => false, ], ], ]; return apply_filters( 'opalestate_postype_property_metaboxes_fields_public_facilities', $fields ); } /** * Member fields. */ public function metaboxes_members_fields() { $prefix = OPALESTATE_PROPERTY_PREFIX; global $post; $types = [ 'hide' => esc_html__( 'Hide Author Information', 'opalestate-pro' ), 'user' => esc_html__( 'User Author Information', 'opalestate-pro' ), 'agent' => esc_html__( 'Agent Information', 'opalestate-pro' ), 'agency' => esc_html__( 'Agency Information', 'opalestate-pro' ), ]; // agent $agents = [ 0 => esc_html__( 'No', 'opalestate-pro' ), ]; if ( isset( $_GET['post'] ) && $_GET['post'] ) { $id = get_post_meta( (int) $_GET['post'], OPALESTATE_PROPERTY_PREFIX . 'agent', true ); if ( $id ) { $agents[ $id ] = get_the_title( $id ); } } // agency $agency = [ 0 => esc_html__( 'No', 'opalestate-pro' ), ]; if ( isset( $_GET['post'] ) && $_GET['post'] ) { $id = get_post_meta( (int) $_GET['post'], OPALESTATE_PROPERTY_PREFIX . 'agency', true ); if ( $id ) { $agency[ $id ] = get_the_title( $id ); } } $fields = [ [ 'name' => esc_html__( 'Author Information', 'opalestate-pro' ), 'id' => "{$prefix}author_type", 'type' => 'select', 'options' => $types, 'default' => 'user', ], [ 'name' => esc_html__( 'Agent', 'opalestate-pro' ), 'id' => "{$prefix}agent", 'type' => 'select', 'options' => $agents, ], [ 'name' => esc_html__( 'Agency', 'opalestate-pro' ), 'id' => "{$prefix}agency", 'type' => 'select', 'options' => $agency, ], ]; return apply_filters( 'opalestate_postype_property_metaboxes_fields_agent', $fields ); } /** * Assigment fields. */ public function metaboxes_assignment_fields() { $prefix = OPALESTATE_PROPERTY_PREFIX; global $post; // users $users = [ 0 => esc_html__( 'Default User', 'opalestate-pro' ), ]; $all_users = get_users(); foreach ( $all_users as $user ) { $users[ $user->ID ] = $user->display_name; } $fields = [ [ 'name' => esc_html__( 'User', 'opalestate-pro' ), 'id' => "post_author_override", 'type' => 'select', "description" => esc_html__( 'Change to new owner of this property, which be listed in That user dashboard', 'opalestate-pro' ), 'options' => $users, ], ]; return apply_filters( 'opalestate_postype_property_metaboxes_fields_assignment', $fields ); } /** * Layout fields. */ public function metaboxes_layout_fields() { $prefix = OPALESTATE_PROPERTY_PREFIX; $templates = opalestate_single_layout_prieview(); $fields = [ [ 'name' => esc_html__( 'Layout Display', 'opalestate-pro' ), 'id' => "{$prefix}layout", 'type' => 'select', 'options' => apply_filters( 'opalestate_single_layout_templates', [ '' => esc_html__( 'Inherit', 'opalestate-pro' ) ] ), 'description' => esc_html__( 'Select a layout to display full information of this property', 'opalestate-pro' ), ], [ 'name' => esc_html__( 'Preview Display', 'opalestate-pro' ), 'id' => "{$prefix}preview", 'type' => 'select', 'options' => $templates, 'description' => esc_html__( 'Select a layout to display full information of this property', 'opalestate-pro' ), ], ]; return apply_filters( 'opalestate_postype_property_metaboxes_fields_layout', $fields ); } /** * Floor plans fields. */ public function metaboxes_floor_plans() { $prefix = OPALESTATE_PROPERTY_PREFIX; $fields = [ [ 'id' => $prefix . 'public_floor_group', 'type' => 'group', 'fields' => [ [ 'id' => $prefix . 'floor_name', 'name' => esc_html__( 'Name', 'opalestate-pro' ), 'type' => 'text', ], [ 'id' => $prefix . 'floor_price', 'name' => esc_html__( 'Price', 'opalestate-pro' ), 'before_row' => '
', 'type' => 'text', ], [ 'id' => $prefix . 'floor_size', 'name' => esc_html__( 'Size', 'opalestate-pro' ), 'type' => 'text', ], [ 'id' => $prefix . 'floor_room', 'name' => esc_html__( 'Rooms', 'opalestate-pro' ), 'type' => 'text', ], [ 'id' => $prefix . 'floor_bath', 'name' => esc_html__( 'Baths', 'opalestate-pro' ), 'type' => 'text', 'after_row' => '
', ], [ 'id' => $prefix . 'floor_content', 'name' => esc_html__( 'Content', 'opalestate-pro' ), 'type' => 'textarea_small', ], [ 'id' => "{$prefix}floor_image", 'name' => esc_html__( 'Image Preview', 'opalestate-pro' ), 'type' => 'file', 'query_args' => [ 'type' => [ 'image/gif', 'image/jpeg', 'image/png', ], ], 'description' => esc_html__( 'Input iframe to show 360° Virtual Tour.', 'opalestate-pro' ), ], ], 'options' => [ 'group_title' => esc_html__( 'Floor {#}', 'opalestate-pro' ), 'add_button' => esc_html__( 'Add more', 'opalestate-pro' ), 'remove_button' => esc_html__( 'Remove', 'opalestate-pro' ), 'sortable' => true, 'closed' => false, ], ], ]; return apply_filters( 'opalestate_postype_property_metaboxes_fields_floor_plans', $fields ); } /** * Apartment fields. */ public function metaboxes_apartments() { $prefix = OPALESTATE_PROPERTY_PREFIX; $fields = [ [ 'id' => $prefix . 'apartments', 'type' => 'group', 'fields' => [ [ 'id' => $prefix . 'apartment_plot', 'name' => esc_html__( 'Plot', 'opalestate-pro' ), 'before_row' => '
', 'type' => 'text', ], [ 'id' => $prefix . 'apartment_beds', 'name' => esc_html__( 'Beds', 'opalestate-pro' ), 'type' => 'text', ], [ 'id' => $prefix . 'apartment_price_from', 'name' => esc_html__( 'Price from', 'opalestate-pro' ), 'type' => 'text', ], [ 'id' => $prefix . 'apartment_floor', 'name' => esc_html__( 'Floor', 'opalestate-pro' ), 'type' => 'text', 'after_row' => '
', ], [ 'id' => $prefix . 'apartment_building_address', 'name' => esc_html__( 'Building / Address', 'opalestate-pro' ), 'type' => 'textarea_small', ], [ 'id' => $prefix . 'apartment_status', 'name' => esc_html__( 'Status', 'opalestate-pro' ), 'type' => 'select', 'options' => apply_filters( 'opalestate_property_apartment_statuses', [ '' => esc_html__( 'None', 'opalestate-pro' ), 'available' => esc_html__( 'Available', 'opalestate-pro' ), 'unavailable' => esc_html__( 'Unavailable', 'opalestate-pro' ), ] ), 'before_row' => '
', ], [ 'id' => $prefix . 'apartment_link', 'name' => esc_html__( 'Link', 'opalestate-pro' ), 'type' => 'text', 'after_row' => '
', ], ], 'options' => [ 'group_title' => esc_html__( 'Apartment {#}', 'opalestate-pro' ), 'add_button' => esc_html__( 'Add more', 'opalestate-pro' ), 'remove_button' => esc_html__( 'Remove', 'opalestate-pro' ), 'sortable' => true, 'closed' => false, ], ], ]; return apply_filters( 'opalestate_postype_property_metaboxes_fields_apartments', $fields ); } }