🏨 Hotel Booking Enhancements: - Implemented Eagle Booking Advanced Pricing add-on - Added Booking.com-style rate management system - Created professional calendar interface for pricing - Integrated deals and discounts functionality 💰 Advanced Pricing Features: - Dynamic pricing models (per room, per person, per adult) - Base rates, adult rates, and child rates management - Length of stay discounts and early bird deals - Mobile rates and secret deals implementation - Seasonal promotions and flash sales 📅 Availability Management: - Real-time availability tracking - Stop sell and restriction controls - Closed to arrival/departure functionality - Minimum/maximum stay requirements - Automatic sold-out management 💳 Payment Integration: - Maintained Redsys payment gateway integration - Seamless integration with existing Eagle Booking - No modifications to core Eagle Booking plugin 🛠️ Technical Implementation: - Custom database tables for advanced pricing - WordPress hooks and filters integration - AJAX-powered admin interface - Data migration from existing Eagle Booking - Professional calendar view for revenue management 📊 Admin Interface: - Booking.com-style management dashboard - Visual rate and availability calendar - Bulk operations for date ranges - Statistics and analytics dashboard - Modal dialogs for quick editing 🔧 Code Quality: - WordPress coding standards compliance - Secure database operations with prepared statements - Proper input validation and sanitization - Error handling and logging - Responsive admin interface 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
158 lines
4.6 KiB
PHP
158 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace Cmb2Grid;
|
|
|
|
if ( ! defined( 'CMB2GRID_DIR' ) ) {
|
|
define( 'CMB2GRID_DIR', trailingslashit( dirname( __FILE__ ) ) );
|
|
}
|
|
|
|
|
|
if ( ! class_exists( '\Cmb2Grid\Cmb2GridPlugin' ) ) {
|
|
|
|
require_once dirname( __FILE__ ) . '/DesignPatterns/Singleton.php';
|
|
|
|
class Cmb2GridPlugin extends DesignPatterns\Singleton {
|
|
|
|
const VERSION = '1.0';
|
|
private $url;
|
|
|
|
protected function __construct() {
|
|
spl_autoload_register( array( $this, 'auto_load' ) );
|
|
|
|
add_action( 'admin_head', array( $this, 'wpHead' ) );
|
|
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
|
|
//$this->test();
|
|
}
|
|
|
|
private function test() {
|
|
new Test\Test();
|
|
}
|
|
|
|
/**
|
|
* Auto load our class files.
|
|
*
|
|
* @param string $class Class name.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function auto_load( $class ) {
|
|
static $prefix;
|
|
static $base_dir;
|
|
static $sep;
|
|
static $length;
|
|
|
|
if ( ! isset( $prefix, $base_dir, $sep ) ) {
|
|
// Project-specific namespace prefix.
|
|
$prefix = __NAMESPACE__ . '\\';
|
|
|
|
// Base directory for the namespace prefix.
|
|
$base_dir = plugin_dir_path( __FILE__ ); // Has trailing slash.
|
|
|
|
// Set directory separator.
|
|
$sep = '/';
|
|
if ( defined( 'DIRECTORY_SEPARATOR' ) ) {
|
|
$sep = DIRECTORY_SEPARATOR;
|
|
}
|
|
$length = strlen( $prefix );
|
|
}
|
|
|
|
// Does the class use the namespace prefix?
|
|
if ( strncmp( $prefix, $class, $length ) !== 0 ) {
|
|
// No, move to the next registered autoloader.
|
|
return;
|
|
}
|
|
|
|
// Get the relative class name.
|
|
$relative_class = substr( $class, $length );
|
|
|
|
/*
|
|
* Add the base directory, replace namespace separators with directory
|
|
* separators in the relative class name and append with .php.
|
|
*/
|
|
$file = $base_dir . str_replace( '\\', $sep, $relative_class ) . '.php';
|
|
|
|
// If the file exists, require it.
|
|
if ( file_exists( $file ) ) {
|
|
require_once $file;
|
|
}
|
|
}
|
|
|
|
public function admin_enqueue_scripts() {
|
|
$suffix = ( ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min' );
|
|
wp_enqueue_style( 'cmb2_grid_bootstrap_light', $this->url( 'assets/css/bootstrap' . $suffix . '.css' ), null, self::VERSION );
|
|
}
|
|
|
|
public function wpHead() {
|
|
?>
|
|
<style>
|
|
.cmb2GridRow .cmb-row{border:none !important;padding:0 !important}
|
|
.cmb2GridRow .cmb-th label:after{border:none !important}
|
|
.cmb2GridRow .cmb-th{width:100% !important}
|
|
.cmb2GridRow .cmb-td{width:100% !important}
|
|
.cmb2GridRow input[type="text"]:not( '.hasDatepicker' ), .cmb2GridRow textarea, .cmb2GridRow select{width:100%}
|
|
|
|
.cmb2GridRow .cmb-repeat-group-wrap{max-width:100% !important;}
|
|
.cmb2GridRow .cmb-group-title{margin:0 !important;}
|
|
.cmb2GridRow .cmb-repeat-group-wrap .cmb-row .cmbhandle, .cmb2GridRow .postbox-container .cmb-row .cmbhandle{right:0 !important}
|
|
|
|
.cmb2GridRow .cmb-type-group .cmb-remove-field-row{padding-bottom: 1.8em !important;padding-top: 1.8em !important;}
|
|
.cmb2GridRow .cmb-td.cmb-nested{padding-left: 15px;padding-right: 15px;}
|
|
</style>
|
|
<?php
|
|
|
|
}
|
|
|
|
// Based on CMB2_Utils url() method.
|
|
public function url( $path = '' ) {
|
|
if ( isset( $this->url ) ) {
|
|
return $this->url . $path;
|
|
}
|
|
|
|
if ( 'WIN' === strtoupper( substr( PHP_OS, 0, 3 ) ) ) {
|
|
// Windows
|
|
$content_dir = str_replace( '/', DIRECTORY_SEPARATOR, WP_CONTENT_DIR );
|
|
$content_url = str_replace( $content_dir, WP_CONTENT_URL, CMB2GRID_DIR );
|
|
$cmb2_url = str_replace( DIRECTORY_SEPARATOR, '/', $content_url );
|
|
} else {
|
|
$cmb2_url = str_replace(
|
|
array( WP_CONTENT_DIR, WP_PLUGIN_DIR ),
|
|
array( WP_CONTENT_URL, WP_PLUGIN_URL ),
|
|
CMB2GRID_DIR
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Filter the CMB location url.
|
|
*
|
|
* @param string $cmb2_url Currently registered url.
|
|
*/
|
|
$this->url = trailingslashit( apply_filters( 'cmb2_meta_box_url', set_url_scheme( $cmb2_url ), CMB2_VERSION ) );
|
|
|
|
return $this->url . $path;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* Instantiate the class on plugins_loaded. */
|
|
// wp_installing() function was introduced in WP 4.4.
|
|
if ( ( function_exists( 'wp_installing' ) && wp_installing() === false ) || ( ! function_exists( 'wp_installing' ) && ( ! defined( 'WP_INSTALLING' ) || WP_INSTALLING === false ) ) ) {
|
|
add_action( 'plugins_loaded', '\\' . __NAMESPACE__ . '\init' );
|
|
}
|
|
|
|
if ( ! function_exists( '\Cmb2Grid\init' ) ) {
|
|
/**
|
|
* Initialize the class only if CMB2 is detected.
|
|
*
|
|
* @return void
|
|
*/
|
|
function init() {
|
|
if ( defined( 'CMB2_LOADED' ) ) {
|
|
if ( ! defined( 'CMB2GRID_DIR' ) ) {
|
|
define( 'CMB2GRID_DIR', trailingslashit( dirname( __FILE__ ) ) );
|
|
}
|
|
Cmb2GridPlugin::getInstance();
|
|
}
|
|
}
|
|
}
|
|
add_action( 'cmb2_init', '\Cmb2Grid\init' );
|