PK œqhYî¶J‚ßF ßF ) nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/
Dir : /home/trave494/hotebooking.site/wp-content/themes/traveler/inc/admin/ |
Server: Linux ngx353.inmotionhosting.com 4.18.0-553.22.1.lve.1.el8.x86_64 #1 SMP Tue Oct 8 15:52:54 UTC 2024 x86_64 IP: 209.182.202.254 |
Dir : /home/trave494/hotebooking.site/wp-content/themes/traveler/inc/admin/class.admin.hotel.php |
<?php /** * @package WordPress * @subpackage Traveler * @since 1.0 * * Class STAdminHotel * * Created by ShineTheme * */ $order_id = 0; if ( !class_exists( 'STAdminHotel' ) ) { class STAdminHotel extends STAdmin { static $parent_key = 'room_parent'; static $booking_page; static $_table_version = "1.3.6"; protected $post_type = 'st_hotel'; /** * * * @update 1.1.3 * */ function __construct() { add_action( 'init', [ $this, 'init_post_type' ], 8 ); if ( !st_check_service_available( $this->post_type ) ) return; add_action( 'current_screen', [ $this, 'init_metabox' ] ); self::$booking_page = admin_url( 'edit.php?post_type=st_hotel&page=st_hotel_booking' ); //add colum for rooms add_filter( 'manage_hotel_room_posts_columns', [ $this, 'add_col_header' ], 10 ); add_action( 'manage_hotel_room_posts_custom_column', [ $this, 'add_col_content' ], 10, 2 ); //add colum for rooms add_filter( 'manage_st_hotel_posts_columns', [ $this, 'add_hotel_col_header' ], 10 ); add_action( 'manage_st_hotel_posts_custom_column', [ $this, 'add_hotel_col_content' ], 10, 2 ); add_action( 'admin_menu', [ $this, 'add_menu_page' ] ); //Check booking edit and redirect if ( self::is_booking_page() ) { add_action( 'admin_enqueue_scripts', [ __CLASS__, 'add_edit_scripts' ] ); add_action( 'admin_init', [ $this, '_do_save_booking' ] ); } if ( isset( $_GET[ 'send_mail' ] ) and $_GET[ 'send_mail' ] == 'success' ) { self::set_message( __( 'Email sent', 'traveler' ), 'updated' ); } add_action( 'wp_ajax_st_room_select_ajax_admin', [ __CLASS__, 'st_room_select_ajax' ] ); //parent::__construct(); add_action( 'save_post', [ $this, '_update_avg_price' ], 50 ); add_action( 'save_post', [ $this, '_update_min_price' ], 50 ); add_action( 'save_post', [ $this, '_update_list_location' ], 999999, 2 ); add_action( 'save_post', [ $this, '_update_duplicate_data' ], 51, 2 ); add_action( 'before_delete_post', [ $this, '_delete_data' ], 50 ); add_action( 'wp_ajax_st_getRoomHotelInfo', [ __CLASS__, 'getRoomHotelInfo' ], 9999 ); add_action( 'wp_ajax_st_getRoomHotel', [ __CLASS__, 'getRoomHotel' ], 9999 ); /** * since 1.2.4 * auto create & update table st_hotel **/ add_action( 'after_setup_theme', [ __CLASS__, '_check_table_hotel' ] ); add_action('admin_init', [$this, '_upgradeHotelTable136']); } public function _upgradeHotelTable136(){ $updated = get_option('_upgradeHotelTable136', false); if(!$updated){ global $wpdb; $table = $wpdb->prefix. $this->post_type; $sql = "Update {$table} as t inner join {$wpdb->postmeta} as m on (t.post_id = m.post_id and m.meta_key = 'is_featured') set t.is_featured = m.meta_value"; $wpdb->query($sql); update_option('_upgradeHotelTable136', 'updated'); } } static function check_ver_working() { $dbhelper = new DatabaseHelper( self::$_table_version ); return $dbhelper->check_ver_working( 'st_hotel_table_version' ); } static function _check_table_hotel() { $dbhelper = new DatabaseHelper( self::$_table_version ); $dbhelper->setTableName( 'st_hotel' ); $column = [ 'post_id' => [ 'type' => 'INT', 'length' => 11, ], 'multi_location' => [ 'type' => 'text', ], 'id_location' => [ 'type' => 'varchar', 'length' => 255 ], 'address' => [ 'type' => 'text', ], 'allow_full_day' => [ 'type' => 'varchar', 'length' => 255 ], 'rate_review' => [ 'type' => 'varchar', 'length' => 255 ], 'hotel_star' => [ 'type' => 'varchar', 'length' => 255 ], 'price_avg' => [ 'type' => 'varchar', 'length' => 255 ], 'min_price' => [ 'type' => 'varchar', 'length' => 255 ], 'hotel_booking_period' => [ 'type' => 'varchar', 'length' => 255 ], 'map_lat' => [ 'type' => 'varchar', 'length' => 255 ], 'map_lng' => [ 'type' => 'varchar', 'length' => 255 ], 'is_sale_schedule' => [ 'type' => 'varchar', 'length' => 255 ], 'post_origin' => [ 'type' => 'varchar', 'length' => 255 ], 'is_featured' => [ 'type' => 'varchar', 'length' => 5 ] ]; $column = apply_filters( 'st_change_column_st_hotel', $column ); $dbhelper->setDefaultColums( $column ); $dbhelper->check_meta_table_is_working( 'st_hotel_table_version' ); return array_keys( $column ); } function _do_save_booking() { $section = isset( $_GET[ 'section' ] ) ? $_GET[ 'section' ] : FALSE; switch ( $section ) { case "edit_order_item": $item_id = isset( $_GET[ 'order_item_id' ] ) ? $_GET[ 'order_item_id' ] : FALSE; if ( !$item_id or get_post_type( $item_id ) != 'st_order' ) { return FALSE; } if ( isset( $_POST[ 'submit' ] ) and $_POST[ 'submit' ] ) $this->_save_booking( $item_id ); break; case 'resend_email': $this->_resend_mail(); break; } } /** * @since 1.1.8 **/ static function _update_duplicate_data( $id, $data ) { if ( !TravelHelper::checkTableDuplicate( 'st_hotel' ) ) return; if ( get_post_type( $id ) == 'st_hotel' ) { $num_rows = TravelHelper::checkIssetPost( $id, 'st_hotel' ); $location_str = get_post_meta( $id, 'multi_location', true ); $location_id = ''; // location_id $address = get_post_meta( $id, 'address', true ); // address $allow_full_day = get_post_meta( $id, 'allow_full_day', true ); // address $rate_review = STReview::get_avg_rate( $id ); // rate review $hotel_star = get_post_meta( $id, 'hotel_star', true ); // hotel star $price_avg = get_post_meta( $id, 'price_avg', true ); // price avg $min_price = get_post_meta( $id, 'min_price', true ); // price avg $hotel_booking_period = get_post_meta( $id, 'hotel_booking_period', true ); // price avg $map_lat = get_post_meta( $id, 'map_lat', true ); // map_lat $map_lng = get_post_meta( $id, 'map_lng', true ); // map_lng if ( $num_rows == 1 ) { $data = [ 'multi_location' => $location_str, 'id_location' => $location_id, 'address' => $address, 'allow_full_day' => $allow_full_day, 'rate_review' => $rate_review, 'hotel_star' => $hotel_star, 'price_avg' => $price_avg, 'min_price' => $min_price, 'hotel_booking_period' => $hotel_booking_period, 'map_lat' => $map_lat, 'map_lng' => $map_lng, ]; $where = [ 'post_id' => $id ]; TravelHelper::updateDuplicate( 'st_hotel', $data, $where ); } elseif ( $num_rows == 0 ) { $data = [ 'post_id' => $id, 'multi_location' => $location_str, 'id_location' => $location_id, 'address' => $address, 'allow_full_day' => $allow_full_day, 'rate_review' => $rate_review, 'hotel_star' => $hotel_star, 'price_avg' => $price_avg, 'min_price' => $min_price, 'hotel_booking_period' => $hotel_booking_period, 'map_lat' => $map_lat, 'map_lng' => $map_lng, ]; TravelHelper::insertDuplicate( 'st_hotel', $data ); } } } public function _delete_data( $post_id ) { if ( get_post_type( $post_id ) == 'st_hotel' ) { global $wpdb; $table = $wpdb->prefix . 'st_hotel'; $rs = TravelHelper::deleteDuplicateData( $post_id, $table ); if ( !$rs ) return false; return true; } } static function _get_list_room_by_hotel( $post_id ) { global $wpdb; $sql = "SELECT * ,mt1.meta_value as multi_location FROM {$wpdb->postmeta} JOIN {$wpdb->postmeta} as mt1 ON mt1.post_id = {$wpdb->postmeta}.post_id and mt1.meta_key = 'multi_location' WHERE {$wpdb->postmeta}.meta_key = 'room_parent' AND {$wpdb->postmeta}.meta_value = '{$post_id}' GROUP BY {$wpdb->postmeta}.post_id"; $list_room = $wpdb->get_results( $sql ); return $list_room; } /** * @since 1.1.5 **/ function _update_list_location( $id, $data ) { $location = STInput::request( 'multi_location', '' ); if ( isset( $_REQUEST[ 'multi_location' ] ) ) { if ( is_array( $location ) && count( $location ) ) { $location_str = ''; foreach ( $location as $item ) { if ( empty( $location_str ) ) { $location_str .= $item; } else { $location_str .= ',' . $item; } } } else { $location_str = ''; } update_post_meta( $id, 'multi_location', $location_str ); update_post_meta( $id, 'id_location', '' ); } } /** * Init the post type * * */ function init_post_type() { if ( !st_check_service_available( $this->post_type ) ) { return; } if ( !function_exists( 'st_reg_post_type' ) ) return; $labels = [ 'name' => __( 'Hotels', 'traveler' ), 'singular_name' => __( 'Hotel', 'traveler' ), 'menu_name' => __( 'Hotels', 'traveler' ), 'name_admin_bar' => __( 'Hotel', 'traveler' ), 'add_new' => __( 'Add New', 'traveler' ), 'add_new_item' => __( 'Add New Hotel', 'traveler' ), 'new_item' => __( 'New Hotel', 'traveler' ), 'edit_item' => __( 'Edit Hotel', 'traveler' ), 'view_item' => __( 'View Hotel', 'traveler' ), 'all_items' => __( 'All Hotels', 'traveler' ), 'search_items' => __( 'Search Hotels', 'traveler' ), 'parent_item_colon' => __( 'Parent Hotels:', 'traveler' ), 'not_found' => __( 'No hotels found.', 'traveler' ), 'not_found_in_trash' => __( 'No hotels found in Trash.', 'traveler' ), 'insert_into_item' => __( 'Insert into Hotel', 'traveler' ), 'uploaded_to_this_item' => __( "Uploaded to this Hotel", 'traveler' ), 'featured_image' => __( "Feature Image", 'traveler' ), 'set_featured_image' => __( "Set featured image", 'traveler' ) ]; $args = [ 'labels' => $labels, 'menu_icon' => 'dashicons-building-yl', 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => [ 'slug' => get_option( 'hotel_permalink', 'st_hotel' ) ], 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'supports' => [ 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ] ]; st_reg_post_type( 'st_hotel', $args ); $labels = [ 'name' => __( 'Room(s)', 'traveler' ), 'singular_name' => __( 'Room', 'traveler' ), 'menu_name' => __( 'Room(s)', 'traveler' ), 'name_admin_bar' => __( 'Room', 'traveler' ), 'add_new' => __( 'Add New', 'traveler' ), 'add_new_item' => __( 'Add New Room', 'traveler' ), 'new_item' => __( 'New Room', 'traveler' ), 'edit_item' => __( 'Edit Room', 'traveler' ), 'view_item' => __( 'View Room', 'traveler' ), 'all_items' => __( 'All Rooms', 'traveler' ), 'search_items' => __( 'Search Rooms', 'traveler' ), 'parent_item_colon' => __( 'Parent Rooms:', 'traveler' ), 'not_found' => __( 'No rooms found.', 'traveler' ), 'not_found_in_trash' => __( 'No rooms found in Trash.', 'traveler' ), 'insert_into_item' => __( 'Insert into Room', 'traveler' ), 'uploaded_to_this_item' => __( "Uploaded to this Room", 'traveler' ), 'featured_image' => __( "Feature Image", 'traveler' ), 'set_featured_image' => __( "Set featured image", 'traveler' ) ]; $args = [ 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'query_var' => true, 'rewrite' => [ 'slug' => get_option( 'hotel_room_permalink', 'hotel_room' ) ], 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'supports' => [ 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ], 'menu_icon' => 'dashicons-building-yl', 'exclude_from_search' => true ]; st_reg_post_type( 'hotel_room', $args ); $name = __( 'Room Type', 'traveler' ); $labels = [ 'name' => $name, 'singular_name' => $name, 'search_items' => sprintf( __( 'Search %s', 'traveler' ), $name ), 'all_items' => sprintf( __( 'All %s', 'traveler' ), $name ), 'parent_item' => sprintf( __( 'Parent %s', 'traveler' ), $name ), 'parent_item_colon' => sprintf( __( 'Parent %s', 'traveler' ), $name ), 'edit_item' => sprintf( __( 'Edit %s', 'traveler' ), $name ), 'update_item' => sprintf( __( 'Update %s', 'traveler' ), $name ), 'add_new_item' => sprintf( __( 'New %s', 'traveler' ), $name ), 'new_item_name' => sprintf( __( 'New %s', 'traveler' ), $name ), 'menu_name' => $name, ]; $args = [ 'hierarchical' => true, 'labels' => $labels, 'show_ui' => 'edit.php?post_type=st_hotel', 'query_var' => true, 'public' => apply_filters('stt_show_term_frontend',false), ]; st_reg_taxonomy( 'room_type', 'hotel_room', $args ); } /** * * @since 1.1.1 * */ function init_metabox() { $screen = get_current_screen(); if ( $screen->id != 'st_hotel' ) { return false; } $this->metabox[] = [ 'id' => 'hotel_metabox', 'title' => __( 'Hotel information', 'traveler' ), 'desc' => '', 'pages' => [ 'st_hotel' ], 'context' => 'normal', 'priority' => 'high', 'fields' => [ [ 'label' => __( 'Location', 'traveler' ), 'id' => 'location_tab', 'type' => 'tab' ], [ 'label' => __( 'Hotel location', 'traveler' ), 'id' => 'multi_location', // id_location 'type' => 'list_item_post_type', 'desc' => __( 'Select one or more locations for your hotel (Enter the name you need to search in search box to filter address faster)', 'traveler' ), 'post_type' => 'location' ], [ 'label' => __( 'Hotel address', 'traveler' ), 'id' => 'address', 'type' => 'address_autocomplete', 'desc' => __( 'Enter your hotel address detail', 'traveler' ), ], [ 'label' => __( 'Location on map', 'traveler' ), 'id' => 'st_google_map', 'type' => 'bt_gmap', 'std' => 'off', 'desc' => __( 'Kindly input Map API in Theme Settings > Other Options . Select one location on map to see latiture and longiture', 'traveler' ) ], [ 'label' => __( 'Properties near by', 'traveler' ), 'id' => 'properties_near_by', 'type' => 'list-item', 'desc' => __( 'Properties near by this hotel', 'traveler' ), 'settings' => [ [ 'id' => 'featured_image', 'label' => __( 'Featured Image', 'traveler' ), 'type' => 'upload', ], [ 'id' => 'description', 'label' => __( 'Description', 'traveler' ), 'type' => 'textarea', 'row' => 5 ], [ 'id' => 'icon', 'label' => __( 'Map icon', 'traveler' ), 'type' => 'upload' ], [ 'id' => 'map_lat', 'label' => __( 'Map lat', 'traveler' ), 'type' => 'text' ], [ 'id' => 'map_lng', 'label' => __( 'Map long', 'traveler' ), 'type' => 'text' ] ] ], [ 'label' => __( 'Streetview mode', 'traveler' ), 'id' => 'enable_street_views_google_map', 'type' => 'on-off', 'desc' => __( 'Turn on/off street view mode for this location', 'traveler' ), 'std' => 'on' ], [ 'label' => __( 'Hotel detail', 'traveler' ), 'id' => 'detail_tab', 'type' => 'tab' ], [ 'label' => __( 'Set hotel as feature', 'traveler' ), 'id' => 'is_featured', 'type' => 'on-off', 'desc' => __( 'ON: Set this hotel to be featured', 'traveler' ), 'std' => 'off' ], [ 'label' => __( 'Hotel logo', 'traveler' ), 'id' => 'logo', 'type' => 'upload', 'class' => '', 'desc' => __( 'Upload the hotel logo (it is recommended using size: 256 x 195 px)', 'traveler' ), ], [ 'label' => __( 'Hotel accepted cards', 'traveler' ), 'desc' => __( 'Accepted cards for payment of hotel', 'traveler' ), 'id' => 'card_accepted', 'type' => 'checkbox', 'choices' => $this->get_card_accepted_list() ], [ 'label' => __( 'Hotel single layout', 'traveler' ), 'id' => 'st_custom_layout', 'post_type' => 'st_layouts', 'desc' => __( 'Select one default layout to show single hotel', 'traveler' ), 'type' => 'select', 'choices' => st_get_layout( 'st_hotel' ) ], [ 'label' => __( 'Hotel gallery', 'traveler' ), 'id' => 'gallery', 'type' => 'gallery', 'desc' => __( 'Upload one or many images to make a hotel image gallery for customers', 'traveler' ), ], [ 'label' => __( 'Hotel video', 'traveler' ), 'id' => 'video', 'type' => 'text', 'desc' => __( 'Enter YouTube/Vimeo URL here', 'traveler' ), ], [ 'label' => __( 'Hotel rating standard', 'traveler' ), 'desc' => __( 'Hotel rating standard', 'traveler' ), 'id' => 'hotel_star', 'type' => 'numeric-slider', 'min_max_step' => '0,5,1', 'std' => 0 ], [ 'label' => __( 'Contact information', 'traveler' ), 'id' => 'agent_tab', 'type' => 'tab' ], [ 'label' => __( 'Contact Info', 'traveler' ), 'id' => 'show_agent_contact_info', 'type' => 'select', 'choices' => [ [ 'label' => __( "----Select----", 'traveler' ), 'value' => '' ], [ 'label' => __( "Use agent contact Info", 'traveler' ), 'value' => 'user_agent_info' ], [ 'label' => __( "Use Item Info", 'traveler' ), 'value' => 'user_item_info' ], ], 'desc' => __( ' Use contact info of people who upload hotel || Use contact info in hotel details', 'traveler' ), ], [ 'label' => __( 'Hotel email', 'traveler' ), 'id' => 'email', 'type' => 'text', 'desc' => __( 'This email will received notification when have booking order', 'traveler' ), ], [ 'label' => __( 'Hotel website', 'traveler' ), 'id' => 'website', 'type' => 'text', 'desc' => __( 'Enter hotel website', 'traveler' ), ], [ 'label' => __( 'Hotel phone number', 'traveler' ), 'id' => 'phone', 'type' => 'text', 'desc' => __( 'Enter hotel phone number', 'traveler' ), ], [ 'label' => __( 'Hotel fax', 'traveler' ), 'id' => 'fax', 'type' => 'text', 'desc' => __( 'Enter hotel fax number', 'traveler' ), ], [ 'label' => __( 'Price', 'traveler' ), 'id' => 'sale_number_tab', 'type' => 'tab' ], [ 'label' => __( 'Set auto calculation average price', 'traveler' ), 'id' => 'is_auto_caculate', 'type' => 'on-off', 'desc' => __( 'The average price of hotel<br/>ON: Automatically<br/>OFF: Input manually', 'traveler' ), 'std' => 'on' ], [ 'label' => __( 'Average price', 'traveler' ), 'id' => 'price_avg', 'type' => 'text', 'desc' => __( 'Enter default average price', 'traveler' ), 'std' => 0, 'conditions' => 'is_auto_caculate:is(on)' ], [ 'label' => __( 'Check in/out time', 'traveler' ), 'id' => 'check_in_out_time', 'type' => 'tab' ], [ 'label' => __( 'Allowed full day booking ', 'traveler' ), 'id' => 'allow_full_day', 'type' => 'on-off', 'std' => 'on', 'desc' => __( 'You can book room with full day<br/>Eg: booking from 22 -23, then all days 22 and 23 are full, other people cannot book', 'traveler' ) ], [ 'label' => __( 'Time for check in', 'traveler' ), 'id' => 'check_in_time', 'type' => 'text', 'std' => '12:00 pm', 'desc' => __( 'Enter time for check in at hotel', 'traveler' ) ], [ 'label' => __( 'Time for check out', 'traveler' ), 'id' => 'check_out_time', 'type' => 'text', 'std' => '12:00 pm', 'desc' => __( 'Enter time for checkout at hotel', 'traveler' ) ], [ 'label' => __( 'Other options', 'traveler' ), 'id' => 'hotel_options', 'type' => 'tab' ], [ 'label' => __( 'Book before number of day', 'traveler' ), 'id' => 'hotel_booking_period', 'type' => 'numeric-slider', 'min_max_step' => '0,30,1', 'std' => 0, 'desc' => __( 'Input number of day can book before from check in date', 'traveler' ), ], [ 'label' => __( 'Minimum number of days to book', 'traveler' ), 'id' => 'min_book_room', 'type' => 'numeric-slider', 'min_max_step' => '0,30,1', 'std' => 0, 'desc' => __( 'Booking time period.', 'traveler' ), ], [ 'label' => __( 'Hotel policy', 'traveler' ), 'id' => 'hotel_policy_tab', 'type' => 'tab' ], [ 'label' => __( 'Hotel policy', 'traveler' ), 'id' => 'hotel_policy', 'desc' => __( 'Enter hotel policy', 'traveler' ), 'type' => 'list-item', 'settings' => [ [ 'label' => __( 'Policy Description', 'traveler' ), 'id' => 'policy_description', 'type' => 'textarea' ] ], ], [ 'label' => __('Inventory', 'traveler'), 'id' => 'inventory_tab', 'type' => 'tab', ], [ 'label' => __('Inventory', 'traveler'), 'id' => 'inventory', 'type' => 'inventory' ] ] ]; $custom_field = st()->get_option( 'hotel_unlimited_custom_field' ); if ( !empty( $custom_field ) and is_array( $custom_field ) ) { $this->metabox[ 0 ][ 'fields' ][] = [ 'label' => __( 'Custom fields', 'traveler' ), 'id' => 'custom_field_tab', 'type' => 'tab' ]; foreach ( $custom_field as $k => $v ) { $key = str_ireplace( '-', '_', 'st_custom_' . sanitize_title( $v[ 'title' ] ) ); $this->metabox[ 0 ][ 'fields' ][] = [ 'label' => $v[ 'title' ], 'id' => $key, 'type' => $v[ 'type_field' ], 'desc' => '<input value=\'[st_custom_meta key="' . $key . '"]\' type=text readonly />', 'std' => $v[ 'default_field' ] ]; } } parent::register_metabox( $this->metabox ); } /** * * * @since 1.1.1 * */ function get_card_accepted_list() { $data = []; $options = st()->get_option( 'booking_card_accepted', [] ); if ( !empty( $options ) ) { foreach ( $options as $key => $value ) { $data[] = [ 'label' => $value[ 'title' ], 'src' => $value[ 'image' ], 'value' => sanitize_title_with_dashes( $value[ 'title' ] ) ]; } } return $data; } /** * * * @update 1.2.4 * */ static function _update_avg_price( $post_id = FALSE ) { if ( !$post_id ) { $post_id = get_the_ID(); } $post_type = get_post_type( $post_id ); if ( $post_type == 'st_hotel' ) { $hotel_id = $post_id; $is_auto_caculate = get_post_meta( $hotel_id, 'is_auto_caculate', TRUE ); if ( $is_auto_caculate != 'off' ) { $query = [ 'post_type' => 'hotel_room', 'posts_per_page' => 100, 'meta_key' => 'room_parent', 'meta_value' => $hotel_id ]; $traver = new WP_Query( $query ); $price = 0; while ( $traver->have_posts() ) { $traver->the_post(); $discount = get_post_meta( get_the_ID(), 'discount_rate', TRUE ); $item_price = get_post_meta( get_the_ID(), 'price', TRUE ); if ( $discount ) { if ( $discount > 100 ) $discount = 100; $item_price = $item_price - ( $item_price / 100 ) * $discount; } $price += $item_price; } wp_reset_query(); $avg_price = 0; if ( $traver->post_count ) { $avg_price = $price / $traver->post_count; } update_post_meta( $hotel_id, 'price_avg', $avg_price ); } } } /** * * * @update 1.2.4 * */ static function _update_min_price( $post_id = FALSE ) { if ( !$post_id ) { $post_id = get_the_ID(); } $post_type = get_post_type( $post_id ); if ( $post_type == 'st_hotel' ) { $hotel_id = $post_id; $query = [ 'post_type' => 'hotel_room', 'posts_per_page' => 999, 'meta_key' => 'room_parent', 'meta_value' => $hotel_id ]; $traver = new WP_Query( $query ); $prices = []; while ( $traver->have_posts() ) { $traver->the_post(); $discount = get_post_meta( get_the_ID(), 'discount_rate', TRUE ); if ( get_post_meta( get_the_ID(), 'price_by_per_person', true ) == 'on' ) { $query_price = ST_Hotel_Room_Availability::inst() ->select( "min(CAST(adult_price as DECIMAL)) as min_price" ) ->where( 'status', 'available' ) ->where( 'post_id', get_the_ID() ) ->where( "check_in >= UNIX_TIMESTAMP(CURRENT_DATE)", null, true ) ->get()->result(); if ( !empty( $query_price ) ) { $item_price = floatval( $query_price[ 0 ][ 'min_price' ] ); } else { $item_price = floatval( get_post_meta( get_the_ID(), 'price', true ) ); } } else { $query_price = ST_Hotel_Room_Availability::inst() ->select("min(CAST(price as DECIMAL)) as min_price") ->where('status', 'available') ->where('post_id', get_the_ID()) ->where("check_in >= UNIX_TIMESTAMP(CURRENT_DATE)", null, true) ->get()->result(); if(!empty($query_price)){ $item_price = $query_price[0]['min_price']; }else{ $item_price = get_post_meta( get_the_ID(), 'price', TRUE ); } } if ( $discount ) { if ( $discount > 100 ) $discount = 100; $item_price = $item_price - ( $item_price / 100 ) * $discount; } $prices[] = $item_price; } wp_reset_query(); if ( !empty( $prices ) ) { $min_price = min( $prices ); update_post_meta( $post_id, 'min_price', $min_price ); } else { update_post_meta( $hotel_id, 'min_price', '0' ); } } } function _resend_mail() { $order_item = isset( $_GET[ 'order_item_id' ] ) ? $_GET[ 'order_item_id' ] : FALSE; $test = isset( $_GET[ 'test' ] ) ? $_GET[ 'test' ] : FALSE; if ( $order_item ) { $order = $order_item; if ( $test ) { global $order_id; $order_id = $order_item; $id_page_email_for_admin = st()->get_option('email_for_admin', ''); $content = !empty(get_post($id_page_email_for_admin)) ? wp_kses_post(get_post($id_page_email_for_admin)->post_content) : ""; $email = ""; $email .= TravelHelper::_get_template_email($email, $content); echo( $email ); die; } if ( $order ) { $booking_by = get_post_meta( $order_item, 'booking_by', true ); $made_by_admin = false; if ( $booking_by && $booking_by == 'admin' ) { $made_by_admin = true; } STCart::send_mail_after_booking( $order, $made_by_admin ); } } wp_safe_redirect( self::$booking_page . '&send_mail=success' ); } static function st_room_select_ajax() { extract( wp_parse_args( $_GET, [ 'room_parent' => '', 'post_type' => '', 'q' => '' ] ) ); $query = [ 'post_type' => $post_type, 'post_status' => 'publish', 'posts_per_page' => 10, 'meta_query' => [ [ 'key' => 'room_parent', 'value' => $room_parent, 'compare' => 'IN', ], ], ]; query_posts( $query ); $r = [ 'items' => [], ]; while ( have_posts() ) { the_post(); $r[ 'items' ][] = [ 'id' => get_the_ID(), 'name' => get_the_title(), 'description' => '' ]; } wp_reset_query(); echo json_encode( $r ); die; } static function add_edit_scripts() { wp_enqueue_script( 'st-hotel-edit-booking', get_template_directory_uri() . '/js/admin/hotel-booking.js', [ 'jquery', 'jquery-ui-datepicker' ], NULL, TRUE ); wp_enqueue_style( 'jjquery-ui.theme.min.css', get_template_directory_uri() . '/css/admin/jquery-ui.min.css' ); } static function is_booking_page() { if ( is_admin() and isset( $_GET[ 'post_type' ] ) and $_GET[ 'post_type' ] == 'st_hotel' and isset( $_GET[ 'page' ] ) and $_GET[ 'page' ] = 'st_hotel_booking' ) return TRUE; return FALSE; } function add_menu_page() { //Add booking page add_submenu_page( 'edit.php?post_type=st_hotel', __( 'Hotel Bookings', 'traveler' ), __( 'Hotel Bookings', 'traveler' ), 'manage_options', 'st_hotel_booking', [ $this, '__hotel_booking_page' ] ); } function __hotel_booking_page() { $section = isset( $_GET[ 'section' ] ) ? $_GET[ 'section' ] : FALSE; if ( $section ) { switch ( $section ) { case "edit_order_item": $this->edit_order_item(); break; } } else { $action = isset( $_POST[ 'st_action' ] ) ? $_POST[ 'st_action' ] : FALSE; switch ( $action ) { case "delete": $this->_delete_items(); break; } echo balanceTags( $this->load_view( 'hotel/booking_index', FALSE ) ); } } function add_booking() { echo balanceTags( $this->load_view( 'hotel/booking_edit', FALSE, [ 'page_title' => __( 'Add new Hotel Booking', 'traveler' ) ] ) ); } function _delete_items() { if ( empty( $_POST ) or !check_admin_referer( 'shb_action', 'shb_field' ) ) { //// process form data, e.g. update fields return; } $ids = isset( $_POST[ 'post' ] ) ? $_POST[ 'post' ] : []; if ( !empty( $ids ) ) { foreach ( $ids as $id ) { wp_delete_post( $id, TRUE ); do_action('st_admin_delete_booking',$id); } } STAdmin::set_message( __( "Delete item(s) success", 'traveler' ), 'updated' ); } function edit_order_item() { $item_id = isset( $_GET[ 'order_item_id' ] ) ? $_GET[ 'order_item_id' ] : FALSE; if ( !$item_id or get_post_type( $item_id ) != 'st_order' ) { return FALSE; } echo balanceTags( $this->load_view( 'hotel/booking_edit' ) ); } function _save_booking( $order_id ) { if ( !check_admin_referer( 'shb_action', 'shb_field' ) ) die; if ( $this->_check_validate() ) { $item_data = [ 'status' => $_POST[ 'status' ], ]; foreach ( $item_data as $val => $value ) { update_post_meta( $order_id, $val, $value ); } $check_out_field = STCart::get_checkout_fields(); if ( !empty( $check_out_field ) ) { foreach ( $check_out_field as $field_name => $field_desc ) { if($field_name != 'st_note'){ update_post_meta( $order_id, $field_name, STInput::post( $field_name ) ); } } } if ( TravelHelper::checkTableDuplicate( 'st_hotel' ) ) { global $wpdb; $table = $wpdb->prefix . 'st_order_item_meta'; $where = [ 'order_item_id' => $order_id, ]; $data = [ 'status' => $_POST[ 'status' ], 'cancel_refund_status' => 'complete' ]; $wpdb->update( $table, $data, $where ); } do_action( 'update_booking_hotel', $order_id ); STCart::send_mail_after_booking( $order_id, true ); do_action('st_admin_edit_booking_status',$item_data['status'],$order_id); wp_safe_redirect( self::$booking_page ); } } public function _check_validate() { $st_first_name = STInput::request( 'st_first_name', '' ); if ( empty( $st_first_name ) ) { STAdmin::set_message( __( 'The firstname field is not empty.', 'traveler' ), 'danger' ); return false; } $st_last_name = STInput::request( 'st_last_name', '' ); if ( empty( $st_last_name ) ) { STAdmin::set_message( __( 'The lastname field is not empty.', 'traveler' ), 'danger' ); return false; } $st_email = STInput::request( 'st_email', '' ); if ( empty( $st_email ) ) { STAdmin::set_message( __( 'The email field is not empty.', 'traveler' ), 'danger' ); return false; } if ( !filter_var( $st_email, FILTER_VALIDATE_EMAIL ) ) { STAdmin::set_message( __( 'Invalid email format.', 'traveler' ), 'danger' ); return false; } $st_phone = STInput::request( 'st_phone', '' ); if ( empty( $st_phone ) ) { STAdmin::set_message( __( 'The phone field is not empty.', 'traveler' ), 'danger' ); return false; } return true; } function is_able_edit() { $item_id = isset( $_GET[ 'order_item_id' ] ) ? $_GET[ 'order_item_id' ] : FALSE; if ( !$item_id or get_post_type( $item_id ) != 'st_order' ) { wp_safe_redirect( self::$booking_page ); die; } return TRUE; } function add_col_header( $defaults ) { $this->array_splice_assoc( $defaults, 2, 0, [ 'room_number' => __( 'Room(s)', 'traveler' ) ] ); $this->array_splice_assoc( $defaults, 2, 0, [ 'hotel_parent' => __( 'Hotel', 'traveler' ) ] ); return $defaults; } function add_hotel_col_header( $defaults ) { $this->array_splice_assoc( $defaults, 2, 0, [ 'hotel_layout' => __( 'Layout', 'traveler' ) ] ); return $defaults; } function array_splice_assoc( &$input, $offset, $length = 0, $replacement = [] ) { $tail = array_splice( $input, $offset ); $extracted = array_splice( $tail, 0, $length ); $input += $replacement + $tail; return $extracted; } function add_col_content( $column_name, $post_ID ) { if ( $column_name == 'hotel_parent' ) { // show content of 'directors_name' column $parent = get_post_meta( $post_ID, 'room_parent', TRUE ); if ( $parent ) { echo "<a href='" . get_edit_post_link( $parent ) . "'>" . get_the_title( $parent ) . "</a>"; } } if ( $column_name == 'room_number' ) { echo get_post_meta( $post_ID, 'number_room', TRUE ); } } function add_hotel_col_content( $column_name, $post_ID ) { if ( $column_name == 'hotel_layout' ) { // show content of 'directors_name' column $parent = get_post_meta( $post_ID, 'st_custom_layout', TRUE ); if ( $parent ) { echo "<a href='" . get_edit_post_link( $parent ) . "'>" . get_the_title( $parent ) . "</a>"; } else { echo __( 'Default', 'traveler' ); } } } static function st_get_custom_price_by_date( $post_id, $start_date = null, $price_type = 'default' ) { global $wpdb; if ( !$post_id ) $post_id = get_the_ID(); if ( empty( $start_date ) ) $start_date = date( "Y-m-d" ); $rs = $wpdb->get_results( "SELECT * FROM " . $wpdb->base_prefix . "st_price WHERE post_id=" . $post_id . " AND price_type='" . $price_type . "' AND start_date <='" . $start_date . "' AND end_date >='" . $start_date . "' AND status=1 ORDER BY priority DESC LIMIT 1" ); if ( !empty( $rs ) ) { return $rs[ 0 ]->price; } else { return false; } } static function getRoomHotelInfo() { $room_id = intval( STInput::request( 'room_id', '' ) ); $data = [ 'price' => '', 'extras' => 'None', 'adult_html' => '', 'child_html' => '', 'room_html' => '', 'adult_price' => '', 'child_price' => '', ]; if ( $room_id <= 0 || get_post_type( $room_id ) != 'hotel_room' ) { echo json_encode( $data ); } else { $html = ''; $price = floatval( get_post_meta( $room_id, 'price', true ) ); $adult_number = intval( get_post_meta( $room_id, 'adult_number', true ) ); $adult_price = floatval( get_post_meta( $room_id, 'adult_price', true ) ); $child_price = floatval( get_post_meta( $room_id, 'child_price', true ) ); if ( $adult_number <= 0 ) $adult_number = 1; $adult_max=st()->get_option('hotel_max_adult',20); $child_max=st()->get_option('hotel_max_child',20); $adult_html = '<select name="adult_number" class="form-control" style="width: 100%">'; for ( $i = 0; $i <= $adult_max; $i++ ) { $adult_html .= '<option value="' . $i . '">' . $i . '</option>'; } $adult_html .= '</select>'; $child_number = intval( get_post_meta( $room_id, 'children_number', true ) ); if ( $child_number <= 0 ) $child_number = 0; $child_html = '<select name="child_number" class="form-control" style="width: 100%">'; for ( $i = 0; $i <= $child_max; $i++ ) { $child_html .= '<option value="' . $i . '">' . $i . '</option>'; } $child_html .= '</select>'; $room_number = intval( get_post_meta( $room_id, 'number_room', true ) ); if ( $room_number <= 0 ) $room_number = 1; $room_html = '<select name="room_num_search" class="form-control" style="width: 100%">'; for ( $i = 1; $i <= $room_number; $i++ ) { $room_html .= '<option value="' . $i . '">' . $i . '</option>'; } $room_html .= '</select>'; $extras = get_post_meta( $room_id, 'extra_price', true ); if ( is_array( $extras ) && count( $extras ) ): $html = '<table class="table">'; foreach ( $extras as $key => $val ): $html .= ' <tr> <td width="80%"> <label for="' . $val[ 'extra_name' ] . '" class="ml20">' . $val[ 'title' ] . ' (' . TravelHelper::format_money( $val[ 'extra_price' ] ) . ')' . '</label> <input type="hidden" name="extra_price[price][' . $val[ 'extra_name' ] . ']" value="' . $val[ 'extra_price' ] . '"> <input type="hidden" name="extra_price[title][' . $val[ 'extra_name' ] . ']" value="' . $val[ 'title' ] . '"> </td> <td width="20%"> <select style="width: 100%" class="form-control" name="extra_price[value][' . $val[ 'extra_name' ] . ']" id="">'; $max_item = intval( $val[ 'extra_max_number' ] ); if ( $max_item <= 0 ) $max_item = 1; for ( $i = 0; $i <= $max_item; $i++ ): $html .= '<option value="' . $i . '">' . $i . '</option>'; endfor; $html .= ' </select> </td> </tr>'; endforeach; $html .= '</table>'; endif; $data[ 'price' ] = TravelHelper::format_money_from_db( $price, false ); $data[ 'extras' ] = $html; $data[ 'adult_html' ] = $adult_html; $data[ 'child_html' ] = $child_html; $data[ 'room_html' ] = $room_html; $data[ 'adult_price' ] = TravelHelper::format_money_from_db( $adult_price, false ); $data[ 'child_price' ] = TravelHelper::format_money_from_db( $child_price, false ); echo json_encode( $data ); } die(); } static function getRoomHotel() { $hotel_id = intval( STInput::request( 'hotel_id', '' ) ); $room_id = intval( STInput::request( 'room_id', '' ) ); if ( $hotel_id <= 0 || get_post_type( $hotel_id ) != 'st_hotel' ) { echo ""; die(); } else { $list_room = "<select name='room_id' id='room_id' class='form-control form-control-admin'>"; $list_room .= "<option value=''>" . __( '----Select a room----', 'traveler' ) . "</option>"; $query = [ 'post_status' => 'publish', 'post_type' => 'hotel_room', 'posts_per_page' => -1, 'orderby' => 'title', 'order' => 'DESC', 'meta_query' => [ [ 'key' => 'room_parent', 'value' => $hotel_id, 'compare' => 'IN', ], ], ]; query_posts( $query ); while ( have_posts() ): the_post(); $selected = ( $room_id == intval( get_the_ID() ) ) ? 'selected' : ''; $list_room .= "<option " . $selected . " value='" . get_the_ID() . "'>" . get_the_title() . "</option>"; endwhile; wp_reset_query(); wp_reset_postdata(); $list_room .= "</select>"; echo balanceTags($list_room); die(); } } public static function __cronjob_update_min_avg_price($offset, $limit = 2) { global $wpdb; $list_hotel = new WP_Query(array( 'posts_per_page' => $limit, 'post_type' => 'st_hotel', 'offset' => $offset )); $hotel_ids=[]; if ($list_hotel->have_posts()) { while ($list_hotel->have_posts()) { $list_hotel->the_post(); $hotel_id = get_the_ID(); STAdminHotel::_update_avg_price($hotel_id); STAdminHotel::_update_min_price($hotel_id); STAdminHotel::_update_duplicate_data($hotel_id, []); } } wp_reset_postdata(); } } new STAdminHotel(); }