define_constants(); $this->init_hooks(); } /** * Define plugin constants */ private function define_constants() { define('EB_AP_VERSION', self::VERSION); define('EB_AP_FILE', __FILE__); define('EB_AP_PATH', plugin_dir_path(__FILE__)); define('EB_AP_URL', plugin_dir_url(__FILE__)); define('EB_AP_BASENAME', plugin_basename(__FILE__)); define('EB_AP_SLUG', 'eb-advanced-pricing'); // Database table names global $wpdb; define('EB_AP_TABLE_RATES', $wpdb->prefix . 'eb_ap_rates'); define('EB_AP_TABLE_AVAILABILITY', $wpdb->prefix . 'eb_ap_availability'); define('EB_AP_TABLE_DEALS', $wpdb->prefix . 'eb_ap_deals'); define('EB_AP_TABLE_RESTRICTIONS', $wpdb->prefix . 'eb_ap_restrictions'); } /** * Initialize hooks */ private function init_hooks() { add_action('plugins_loaded', array($this, 'init'), 0); add_action('init', array($this, 'init_textdomain')); // Activation and deactivation register_activation_hook(__FILE__, array($this, 'activate')); register_deactivation_hook(__FILE__, array($this, 'deactivate')); // Admin add_action('admin_menu', array($this, 'admin_menu')); add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts')); // Ajax handlers add_action('wp_ajax_eb_ap_update_rates', array($this, 'ajax_update_rates')); add_action('wp_ajax_eb_ap_update_availability', array($this, 'ajax_update_availability')); add_action('wp_ajax_eb_ap_create_deal', array($this, 'ajax_create_deal')); add_action('wp_ajax_eb_ap_get_calendar_data', array($this, 'ajax_get_calendar_data')); // Frontend hooks add_filter('eb_room_price_calculation', array($this, 'calculate_room_price'), 10, 4); add_filter('eb_room_availability_check', array($this, 'check_availability'), 10, 3); add_filter('eb_search_results', array($this, 'apply_deals_to_results'), 10, 2); } /** * Initialize plugin */ public function init() { if (!$this->check_requirements()) { return; } $this->includes(); $this->init_classes(); } /** * Check plugin requirements */ private function check_requirements() { if (!class_exists('Eagle_Booking')) { add_action('admin_notices', array($this, 'missing_eagle_booking_notice')); return false; } if (defined('EB_VERSION') && version_compare(EB_VERSION, self::MIN_EB_VERSION, '<')) { add_action('admin_notices', array($this, 'eagle_booking_version_notice')); return false; } return true; } /** * Include required files */ private function includes() { // Core classes require_once EB_AP_PATH . 'includes/class-eb-ap-database.php'; require_once EB_AP_PATH . 'includes/class-eb-ap-rates.php'; require_once EB_AP_PATH . 'includes/class-eb-ap-availability.php'; require_once EB_AP_PATH . 'includes/class-eb-ap-deals.php'; require_once EB_AP_PATH . 'includes/class-eb-ap-restrictions.php'; require_once EB_AP_PATH . 'includes/class-eb-ap-calendar.php'; // Admin classes if (is_admin()) { require_once EB_AP_PATH . 'includes/admin/class-eb-ap-admin.php'; require_once EB_AP_PATH . 'includes/admin/class-eb-ap-settings.php'; require_once EB_AP_PATH . 'includes/admin/class-eb-ap-metaboxes.php'; } // Frontend classes require_once EB_AP_PATH . 'includes/frontend/class-eb-ap-frontend.php'; require_once EB_AP_PATH . 'includes/frontend/class-eb-ap-pricing.php'; // API classes require_once EB_AP_PATH . 'includes/api/class-eb-ap-api.php'; // Helper functions require_once EB_AP_PATH . 'includes/functions.php'; } /** * Initialize classes */ private function init_classes() { // Core classes EB_AP_Database::instance(); EB_AP_Rates::instance(); EB_AP_Availability::instance(); EB_AP_Deals::instance(); EB_AP_Restrictions::instance(); EB_AP_Calendar::instance(); // Admin classes if (is_admin()) { EB_AP_Admin::instance(); EB_AP_Settings::instance(); EB_AP_Metaboxes::instance(); } // Frontend classes if (!is_admin()) { EB_AP_Frontend::instance(); EB_AP_Pricing::instance(); } // API EB_AP_API::instance(); } /** * Initialize text domain */ public function init_textdomain() { load_plugin_textdomain( 'eb-advanced-pricing', false, dirname(plugin_basename(__FILE__)) . '/languages/' ); } /** * Plugin activation */ public function activate() { if (!class_exists('Eagle_Booking')) { deactivate_plugins(plugin_basename(__FILE__)); wp_die( __('Eagle Booking Advanced Pricing requires Eagle Booking plugin to be installed and activated.', 'eb-advanced-pricing'), 'Plugin dependency check', array('back_link' => true) ); } // Create database tables $this->create_tables(); // Set default options $this->set_default_options(); // Flush rewrite rules flush_rewrite_rules(); // Set activation flag update_option('eb_ap_activated', true); } /** * Plugin deactivation */ public function deactivate() { // Remove activation flag delete_option('eb_ap_activated'); // Flush rewrite rules flush_rewrite_rules(); } /** * Create database tables */ private function create_tables() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); // Rates table $sql_rates = "CREATE TABLE " . EB_AP_TABLE_RATES . " ( id int(11) NOT NULL AUTO_INCREMENT, room_id int(11) NOT NULL, rate_date date NOT NULL, base_rate decimal(10,2) NOT NULL DEFAULT 0.00, adult_rate decimal(10,2) NOT NULL DEFAULT 0.00, child_rate decimal(10,2) NOT NULL DEFAULT 0.00, min_guests int(11) NOT NULL DEFAULT 1, max_guests int(11) NOT NULL DEFAULT 10, min_stay int(11) NOT NULL DEFAULT 1, max_stay int(11) NOT NULL DEFAULT 0, created_at datetime DEFAULT CURRENT_TIMESTAMP, updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY room_date (room_id, rate_date), KEY room_id (room_id), KEY rate_date (rate_date) ) $charset_collate;"; // Availability table $sql_availability = "CREATE TABLE " . EB_AP_TABLE_AVAILABILITY . " ( id int(11) NOT NULL AUTO_INCREMENT, room_id int(11) NOT NULL, availability_date date NOT NULL, available_rooms int(11) NOT NULL DEFAULT 0, stop_sell tinyint(1) NOT NULL DEFAULT 0, closed_to_arrival tinyint(1) NOT NULL DEFAULT 0, closed_to_departure tinyint(1) NOT NULL DEFAULT 0, created_at datetime DEFAULT CURRENT_TIMESTAMP, updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY room_date (room_id, availability_date), KEY room_id (room_id), KEY availability_date (availability_date) ) $charset_collate;"; // Deals table $sql_deals = "CREATE TABLE " . EB_AP_TABLE_DEALS . " ( id int(11) NOT NULL AUTO_INCREMENT, room_id int(11) NOT NULL, deal_type varchar(50) NOT NULL, deal_name varchar(255) NOT NULL, discount_type varchar(20) NOT NULL, discount_value decimal(10,2) NOT NULL, date_from date NOT NULL, date_to date NOT NULL, min_stay int(11) NOT NULL DEFAULT 1, max_stay int(11) NOT NULL DEFAULT 0, advance_booking_days int(11) NOT NULL DEFAULT 0, is_active tinyint(1) NOT NULL DEFAULT 1, priority int(11) NOT NULL DEFAULT 0, created_at datetime DEFAULT CURRENT_TIMESTAMP, updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY room_id (room_id), KEY deal_type (deal_type), KEY date_from (date_from), KEY date_to (date_to), KEY is_active (is_active) ) $charset_collate;"; // Restrictions table $sql_restrictions = "CREATE TABLE " . EB_AP_TABLE_RESTRICTIONS . " ( id int(11) NOT NULL AUTO_INCREMENT, room_id int(11) NOT NULL, restriction_date date NOT NULL, restriction_type varchar(50) NOT NULL, restriction_value text, created_at datetime DEFAULT CURRENT_TIMESTAMP, updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY room_id (room_id), KEY restriction_date (restriction_date), KEY restriction_type (restriction_type) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql_rates); dbDelta($sql_availability); dbDelta($sql_deals); dbDelta($sql_restrictions); } /** * Set default options */ private function set_default_options() { $defaults = array( 'eb_ap_enabled' => 'yes', 'eb_ap_calendar_view' => 'month', 'eb_ap_default_availability' => 10, 'eb_ap_pricing_model' => 'per_room', 'eb_ap_allow_overbooking' => 'no', 'eb_ap_auto_close_sold_out' => 'yes', 'eb_ap_deal_priority' => 'highest_discount', 'eb_ap_currency_display' => 'symbol', 'eb_ap_date_format' => 'Y-m-d', 'eb_ap_time_format' => 'H:i', ); foreach ($defaults as $key => $value) { if (!get_option($key)) { update_option($key, $value); } } } /** * Add admin menu */ public function admin_menu() { add_submenu_page( 'eagle-booking', __('Advanced Pricing', 'eb-advanced-pricing'), __('Advanced Pricing', 'eb-advanced-pricing'), 'manage_options', 'eb-advanced-pricing', array($this, 'admin_page') ); } /** * Admin page callback */ public function admin_page() { include EB_AP_PATH . 'includes/admin/views/main.php'; } /** * Enqueue admin scripts */ public function admin_enqueue_scripts($hook) { if (strpos($hook, 'eb-advanced-pricing') === false) { return; } wp_enqueue_script('jquery'); wp_enqueue_script('jquery-ui-core'); wp_enqueue_script('jquery-ui-datepicker'); wp_enqueue_script('jquery-ui-draggable'); wp_enqueue_script('jquery-ui-resizable'); wp_enqueue_script( 'eb-ap-admin', EB_AP_URL . 'assets/js/admin.js', array('jquery', 'jquery-ui-datepicker'), EB_AP_VERSION, true ); wp_enqueue_style( 'eb-ap-admin', EB_AP_URL . 'assets/css/admin.css', array(), EB_AP_VERSION ); wp_localize_script('eb-ap-admin', 'eb_ap_ajax', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('eb_ap_nonce'), 'strings' => array( 'save_success' => __('Settings saved successfully!', 'eb-advanced-pricing'), 'save_error' => __('Error saving settings. Please try again.', 'eb-advanced-pricing'), 'confirm_delete' => __('Are you sure you want to delete this item?', 'eb-advanced-pricing'), 'loading' => __('Loading...', 'eb-advanced-pricing'), ) )); } /** * AJAX: Update rates */ public function ajax_update_rates() { check_ajax_referer('eb_ap_nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_die(__('Insufficient permissions', 'eb-advanced-pricing')); } $room_id = intval($_POST['room_id']); $date = sanitize_text_field($_POST['date']); $rates = array_map('floatval', $_POST['rates']); $result = EB_AP_Rates::instance()->update_rates($room_id, $date, $rates); if ($result) { wp_send_json_success(array('message' => __('Rates updated successfully', 'eb-advanced-pricing'))); } else { wp_send_json_error(array('message' => __('Failed to update rates', 'eb-advanced-pricing'))); } } /** * AJAX: Update availability */ public function ajax_update_availability() { check_ajax_referer('eb_ap_nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_die(__('Insufficient permissions', 'eb-advanced-pricing')); } $room_id = intval($_POST['room_id']); $date = sanitize_text_field($_POST['date']); $availability = array_map('intval', $_POST['availability']); $result = EB_AP_Availability::instance()->update_availability($room_id, $date, $availability); if ($result) { wp_send_json_success(array('message' => __('Availability updated successfully', 'eb-advanced-pricing'))); } else { wp_send_json_error(array('message' => __('Failed to update availability', 'eb-advanced-pricing'))); } } /** * AJAX: Create deal */ public function ajax_create_deal() { check_ajax_referer('eb_ap_nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_die(__('Insufficient permissions', 'eb-advanced-pricing')); } $deal_data = array( 'room_id' => intval($_POST['room_id']), 'deal_type' => sanitize_text_field($_POST['deal_type']), 'deal_name' => sanitize_text_field($_POST['deal_name']), 'discount_type' => sanitize_text_field($_POST['discount_type']), 'discount_value' => floatval($_POST['discount_value']), 'date_from' => sanitize_text_field($_POST['date_from']), 'date_to' => sanitize_text_field($_POST['date_to']), 'min_stay' => intval($_POST['min_stay']), 'max_stay' => intval($_POST['max_stay']), 'advance_booking_days' => intval($_POST['advance_booking_days']), ); $result = EB_AP_Deals::instance()->create_deal($deal_data); if ($result) { wp_send_json_success(array('message' => __('Deal created successfully', 'eb-advanced-pricing'))); } else { wp_send_json_error(array('message' => __('Failed to create deal', 'eb-advanced-pricing'))); } } /** * AJAX: Get calendar data */ public function ajax_get_calendar_data() { check_ajax_referer('eb_ap_nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_die(__('Insufficient permissions', 'eb-advanced-pricing')); } $room_id = intval($_POST['room_id']); $start_date = sanitize_text_field($_POST['start_date']); $end_date = sanitize_text_field($_POST['end_date']); $calendar_data = EB_AP_Calendar::instance()->get_calendar_data($room_id, $start_date, $end_date); wp_send_json_success($calendar_data); } /** * Filter room price calculation */ public function calculate_room_price($price, $room_id, $date, $guests) { return EB_AP_Pricing::instance()->calculate_price($room_id, $date, $guests); } /** * Filter availability check */ public function check_availability($available, $room_id, $date) { return EB_AP_Availability::instance()->is_available($room_id, $date); } /** * Apply deals to search results */ public function apply_deals_to_results($results, $search_params) { return EB_AP_Deals::instance()->apply_deals_to_results($results, $search_params); } /** * Missing Eagle Booking notice */ public function missing_eagle_booking_notice() { ?>