Hotel Raxa - Advanced Booking System Implementation

🏨 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>
This commit is contained in:
Hotel Raxa Dev
2025-07-11 07:43:22 +02:00
commit 5b1e2453c7
9816 changed files with 2784509 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
<div class="col-lg-12">
<!-- Article -->
<article id="post-<?php the_ID(); ?>" <?php post_class('post-item post-classic-item');?>>
<!-- Image -->
<?php if (has_post_thumbnail()) : ?>
<figure class="post-thumbnail gradient-overlay-hover link-icon">
<a href="<?php esc_url( the_permalink() ) ?>">
<img src="<?php echo the_post_thumbnail_url('himara_image_size_1920_800') ?>" class="img-fluid" alt="<?php echo the_title_attribute() ?>">
</a>
</figure>
<?php endif ?>
<!-- Details -->
<div class="post-details<?php if( !has_post_thumbnail() ) : ?> no-thumbnail<?php endif ?> ">
<!-- Title -->
<?php the_title( sprintf( '<h2 class="post-title"><a href="%s">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
<!-- Info -->
<div class="post-meta">
<!-- Author -->
<?php
$post_author = get_the_author_meta('display_name');
$post_author_id = get_the_author_meta('ID');
$post_author_gravatar = get_avatar_url($post_author_id, array('size' => 14));
?>
<span class="author"><i class="icon-user"></i><?php echo '<a href="'.esc_url( get_author_posts_url( get_the_author_meta( 'ID', $post_author_id ) ) ).'">'.get_the_author_meta( 'display_name', $post_author_id ).'</a>' ?></span>
<!-- Date -->
<span class="date"><i class="icon-clock"></i><a href="<?php echo esc_url( get_permalink() ) ?>"><?php echo get_the_date() ?></a></span>
<!-- Comments -->
<?php
if ( comments_open() || get_comments_number() ) {
$ccount = (int) get_comments_number();
$rep = esc_html('comments', 'himara');
if($ccount === 1) $rep = esc_html('comment', 'himara');
?>
<span class="comments"><i class="icon-bubble"></i><a href="<?php echo esc_url( get_permalink()).'#comments' ?>"><?php echo esc_html($ccount .' '. $rep) ?></a></span>
<?php } ?>
<!-- Categories -->
<?php $cats = get_the_category_list( ', ' ); ?>
<?php if (!empty($cats)) : ?>
<span class="category"><i class="icon-folder"></i><?php echo wp_kses_post($cats) ?></span>
<?php endif ?>
</div>
</div>
<!-- Content -->
<div class="post-content">
<?php
if (himara_get_option('post_excerpt_limit')) {
echo himara_get_excerpt( himara_get_option( 'post_excerpt_limit' ) );
} else {
echo wp_trim_words( get_the_content(), 50, '...' );
}
?>
</div>
</article>
</div>

View File

@@ -0,0 +1,55 @@
<div class="col-lg-6">
<article id="post-<?php the_ID(); ?>" <?php post_class('post-item post-grid-item');?>>
<?php if (has_post_thumbnail()) : ?>
<figure class="post-thumbnail gradient-overlay-hover link-icon">
<a href="<?php esc_url( the_permalink() ) ?>">
<img src="<?php echo the_post_thumbnail_url('himara_image_size_600_400') ?>" class="img-fluid" alt="<?php echo the_title_attribute() ?>">
</a>
</figure>
<?php endif ?>
<div class="post-wrapper">
<div class="post-details<?php if( !has_post_thumbnail() ) : ?> no-thumbnail<?php endif ?> ">
<?php the_title( sprintf( '<h2 class="post-title"><a href="%s">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
<div class="post-meta">
<?php
$post_author = get_the_author_meta('display_name');
$post_author_id = get_the_author_meta('ID');
$post_author_gravatar = get_avatar_url($post_author_id, array('size' => 14));
?>
<span class="author"><i class="icon-user"></i><?php echo '<a href="'.esc_url( get_author_posts_url( get_the_author_meta( 'ID', $post_author_id ) ) ).'">'.get_the_author_meta( 'display_name', $post_author_id ).'</a>' ?></span>
<span class="date"><i class="icon-clock"></i><a href="<?php echo esc_url( get_permalink() ) ?>"><?php echo get_the_date() ?></a></span>
<?php
if ( comments_open() || get_comments_number() ) {
$ccount = (int) get_comments_number();
$rep = esc_html('comments', 'himara');
if($ccount === 1) $rep = esc_html('comment', 'himara');
?>
<span class="comments"><i class="icon-bubble"></i><a href="<?php echo esc_url( get_permalink()).'#comments' ?>"><?php echo esc_html($ccount .' '. $rep) ?></a></span>
<?php } ?>
<?php $cats = get_the_category_list( ', ' ); ?>
<?php if (!empty($cats)) : ?>
<span class="category"><i class="icon-folder-alt"></i><?php echo wp_kses_post($cats) ?></span>
<?php endif ?>
</div>
</div>
<div class="post-content">
<?php
if (himara_get_option('post_excerpt_limit')) {
echo himara_get_excerpt( himara_get_option( 'post_excerpt_limit' ) );
} else {
echo wp_trim_words( get_the_content(), 30, '...' );
}
?>
</div>
</div>
</article>
</div>

View File

@@ -0,0 +1,59 @@
<!-- Post List -->
<div class="col-lg-12">
<article id="post-<?php the_ID(); ?>" <?php post_class('post-item post-list-item');?>>
<div class="row">
<!-- Image -->
<div class="col-lg-4">
<?php if (has_post_thumbnail()) : ?>
<figure class="post-thumbnail gradient-overlay-hover link-icon">
<a href="<?php esc_url( the_permalink() ) ?>">
<img src="<?php echo the_post_thumbnail_url('himara_image_size_600_400') ?>" class="img-fluid" alt="<?php echo the_title_attribute() ?>">
</a>
</figure>
<?php endif ?>
</div>
<!-- Details -->
<div class="col-lg-8">
<div class="post-details<?php if( !has_post_thumbnail() ) : ?> no-thumbnail<?php endif ?> ">
<!-- Title -->
<?php the_title( sprintf( '<h2 class="post-title"><a href="%s">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
<!-- Info -->
<div class="post-meta">
<!-- Author -->
<?php
$post_author = get_the_author_meta('display_name');
$post_author_id = get_the_author_meta('ID');
$post_author_gravatar = get_avatar_url($post_author_id, array('size' => 14));
?>
<span class="author"><i class="icon-user"></i><?php echo '<a href="'.esc_url( get_author_posts_url( get_the_author_meta( 'ID', $post_author_id ) ) ).'">'.get_the_author_meta( 'display_name', $post_author_id ).'</a>' ?></span>
<span class="date"><i class="icon-clock"></i><a href="<?php echo esc_url( get_permalink() ) ?>"><?php echo get_the_date() ?></a></span>
<!-- Comments -->
<?php
if ( comments_open() || get_comments_number() ) {
$ccount = (int) get_comments_number();
$rep = esc_html('comments', 'himara');
if($ccount === 1) $rep = esc_html('comment', 'himara');
?>
<span class="comments"><i class="icon-bubble"></i><a href="<?php echo esc_url( get_permalink()).'#comments' ?>"><?php echo esc_html($ccount .' '. $rep) ?></a></span>
<?php } ?>
<!-- Categories -->
<?php $cats = get_the_category_list( ', ' ); ?>
<?php if (!empty($cats)) : ?>
<span class="category"><i class="icon-folder"></i><?php echo wp_kses_post($cats) ?></span>
<?php endif ?>
</div>
<!-- Content -->
<div class="post-content">
<?php
if (himara_get_option('post_excerpt_limit')) {
echo himara_get_excerpt( himara_get_option( 'post_excerpt_limit' ) );
} else {
echo wp_trim_words( get_the_content(), 30, '...' );
}
?>
</div>
</div>
</div>
</div>
</article>
</div>

View File

@@ -0,0 +1,5 @@
<?php if($pagination = get_the_posts_pagination(array('mid_size' => 2, 'prev_text' => esc_html__('Previous', 'himara'), 'next_text' => esc_html__('Next', 'himara')))) : ?>
<div class="blog-pagination mt100">
<?php echo wp_kses_post($pagination); ?>
</div>
<?php endif; ?>

View File

@@ -0,0 +1,52 @@
<?php
$commenter = wp_get_current_commenter();
$req = get_option( 'require_name_email' );
$aria_req = ( $req ? " aria-required='true'" : '' );
$current_user = wp_get_current_user();
$current_user_name = $current_user->display_name;
$current_user_avatar = get_avatar($current_user->user_email, 24);
$currnet_user_url = admin_url( 'profile.php' );
$logout_url = wp_logout_url( apply_filters( 'the_permalink', get_permalink( ) ) );
$comment_form_args = array(
'title_reply' => '<div class="section-title mt30"><h4 class="comments-title">'.esc_html__('Leave your comment', 'himara').'</h4><p class="section-subtitle">'.esc_html__('Join the discussion and tell us your opinion.', 'himara').'</p></div>',
'class_submit' => 'btn float-right mt20',
'label_submit' => esc_html__('Submit Your Comment', 'himara'),
'cancel_reply_link' => esc_html__('Cancel', 'himara'),
'comment_notes_before' => '',
'comment_notes_after' => '',
'must_log_in' => '<div class="alert alert-simple alert-dismissible mt50 text-center" role="alert">' . esc_html__('Login', 'himara') . ' <a href="'. esc_url(wp_login_url( apply_filters( 'the_permalink', esc_url( get_permalink() ) ) )) .'">' . esc_html__('Login', 'himara') . '</a> </div>',
'logged_in_as' => '
<div class="logged-in-as mt20 mb20">
<span class="new-comment-author"><a href="'.esc_url( $currnet_user_url ).'" class="author-name">'. $current_user_avatar . ' ' .esc_attr( $current_user_name ).'</a></span>
<a href="'.esc_url( $logout_url ).'" class="logout" data-toggle="tooltip" data-original-title="'. esc_html__('Logout', 'himara') .'"><i class="fa fa-sign-out" aria-hidden="true"></i></a>
</div>',
'fields' => apply_filters( 'comment_form_default_fields', array(
'author' =>
'<div class="row">' .
'<div class="col-md-4 mt20">' .
'<input id="author" class="form-control" name="author" type="text" placeholder="' . esc_html__('Your Name', 'himara') . ( $req ? '* ' : '' ) . '" value="' .esc_attr( $commenter['comment_author'] ) .
'"' . $aria_req . ' /></div>',
'email' =>
'<div class="col-md-4 mt20">' .
'<input id="email" class="form-control" name="email" type="text" placeholder="' . esc_html__('Your Email', 'himara'). ( $req ? '* ' : '' ).'" value="' . esc_attr( $commenter['comment_author_email'] ) .
'"' . $aria_req . ' /></div>',
'url' =>
'<div class="col-md-4 mt20">' .
'<input id="url" class="form-control" name="url" type="text" placeholder="' .
esc_html__('Website', 'himara') . '" value="' . esc_attr( $commenter['comment_author_url'] ) .
'" /></div>' .
'</div>'
) ),
'comment_field' =>
'<div class="comment-form-comment"><textarea id="comment" class="form-control" name="comment" aria-required="true" placeholder="'. esc_html('Your Comment', 'himara') . ( $req ? '* ' : '' ).'">' .'</textarea></div>',
);
comment_form( $comment_form_args );

View File

@@ -0,0 +1,24 @@
<?php
$himara_page_title = get_post_meta(get_the_id(), 'himara_mtb_title', true);
?>
<?php if ($himara_page_title == true) : ?>
<div class="page-title" style="<?php if (himara_get_option('page_header') == 'image' ) { ?> background: url(<?php echo esc_url( himara_get_option('page_header_image_bg') ) ?> ) <?php } else { ?> background: <?php echo esc_html( himara_get_option('page_header_color_bg') ); }?>; background-repeat: no-repeat;
background-size: cover; ">
<div class="container">
<div class="inner">
<?php if (is_search()) : ?>
<?php echo '<h1>' . esc_html__('Searh Results For', 'himara') . ' "' . get_search_query(). '" ' , '</h1>'; ?>
<?php else : ?>
<h1><?php echo single_post_title() ?></h1>
<?php if ( himara_get_option('page_breadcrumb')) : himara_get_breadcrumb(); endif ?>
<?php endif ?>
</div>
</div>
</div>
<?php endif ?>

View File

@@ -0,0 +1,36 @@
<?php $menuitems = wp_nav_menu(array ('menu' => 'himara_main_menu', 'echo' => FALSE, 'fallback_cb' => '__return_false')); ?>
<?php
$theme_location = 'himara_main_menu';
$locations = get_nav_menu_locations();
$menu_id = '';
if ( isset ( $locations[$theme_location] ) ) {
$menu_id = $locations[$theme_location];
}
?>
<?php if ( current_user_can( 'manage_options' ) && has_nav_menu( 'himara_main_menu' ) && empty ( $menuitems ) ) : ?>
<ul class="navbar-nav">
<li class="himara-no-menu">
<a href="<?php echo esc_url( admin_url( 'nav-menus.php?action=edit&menu='. $menu_id .'' )); ?>">
<?php echo esc_html__( 'Click here to add items to main navigation [Visible only to Admins]', 'himara' ); ?>
</a>
</li>
</ul>
<?php endif; ?>
<?php if ( has_nav_menu( 'himara_main_menu' ) ) : ?>
<?php wp_nav_menu( array( 'theme_location' => 'himara_main_menu', 'depth' => 3, 'container' => false, 'menu_class' => 'menu', 'walker' => new wp_bootstrap_navwalker()));?>
<?php else: ?>
<?php if ( current_user_can( 'manage_options' ) ): ?>
<ul class="navbar-nav">
<li class="himara-no-menu">
<a href="<?php echo esc_url( admin_url( 'nav-menus.php' )); ?>">
<?php echo esc_html__( 'Click here to add main navigation [Visible only to Admins]', 'himara' ); ?>
</a>
</li>
</ul>
<?php endif; ?>
<?php endif; ?>

View File

@@ -0,0 +1,49 @@
<?php
$himara_topbar = get_post_meta(get_the_id(), 'himara_mtb_topbar', true);
$himara_topbar_transparent = get_post_meta(get_the_id(), 'himara_mtb_topbar_transparent', true);
if ($himara_topbar_transparent == true) {
$himara_topabr_class = 'transparent';
} else {
$himara_topabr_class = '';
}
if ( $himara_topbar == true && himara_get_option('header_layout') === 'horizontal' ) :
?>
<div class="himara-top-bar topbar <?php echo esc_attr( $himara_topabr_class ) ?>">
<div class="container">
<div class="inner">
<?php if ( himara_get_option('topbar_welcome_mssg') ) : ?>
<div class="welcome-mssg <?php if ((himara_get_option('topbar_mobile_elements')['topbar_welcome_mssg_mobile']) == '1') echo esc_attr("d-none d-lg-block"); ?>"><?php echo himara_get_option('topbar_welcome_mssg') ?></div>
<?php endif ?>
<ul class="top-menu">
<?php if ( himara_get_option('topbar_phone') ) : ?>
<li class="<?php if ((himara_get_option('topbar_mobile_elements')['topbar_phone_mobile']) == '1') echo esc_attr("d-none d-lg-block"); ?>"><i class="fa fa-phone"></i><a href="tel:<?php echo esc_html( himara_get_option('topbar_phone_link') ) ?> "> <?php echo esc_html( himara_get_option('topbar_phone') ) ?> </a></li>
<?php endif ?>
<?php if ( himara_get_option('topbar_email') ) : ?>
<li class="email <?php if (( himara_get_option('topbar_mobile_elements')['topbar_email_mobile']) == '1') echo esc_attr("d-none d-lg-block"); ?>"><i class="fa fa-envelope"></i> <a href="mailto:<?php echo esc_html( himara_get_option('topbar_email') ) ?>"><?php echo esc_html( himara_get_option('topbar_email') ) ?></a></li>
<?php endif ?>
</ul>
</div>
</div>
</div>
<?php
endif;

View File

@@ -0,0 +1,10 @@
<div class="loader loader1">
<div class="loader-inner">
<div class="loader-logo">
<?php if (himara_get_option('preloader_image')) : ?>
<img src="<?php echo esc_url( himara_get_option('preloader_image') ) ?>" alt="<?php echo get_bloginfo() ?>" height="<?php echo esc_html( himara_get_option('preloader_logo_height') ) ?>">
<?php endif ?>
</div>
</div>
<div class="dot"></div>
</div>

View File

@@ -0,0 +1,15 @@
<div class="loader loader2">
<div class="loader-inner">
<div class="loader-logo">
<?php if (himara_get_option('preloader_image')) : ?>
<img src="<?php echo esc_url( himara_get_option('preloader_image') ) ?>" alt="<?php echo get_bloginfo() ?>" height="<?php echo esc_html( himara_get_option('preloader_logo_height') ) ?>">
<?php endif ?>
</div>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<div class="loader loader3">
<div class="loader-inner">
<div class="spin">
<span></span>
<?php if (himara_get_option('preloader_image')) : ?>
<img src="<?php echo esc_url( himara_get_option('preloader_image') ) ?>" alt="<?php echo get_bloginfo() ?>" height="<?php echo esc_html( himara_get_option('preloader_logo_height') ) ?>">
<?php endif ?>
</div>
</div>
</div>

View File

@@ -0,0 +1,31 @@
<?php $himara_author_id = get_post_field( 'post_author', get_the_ID() ); ?>
<?php $himara_author_description = get_the_author_meta( 'description' ); ?>
<?php if( himara_get_option( 'single_post_author' ) && !empty($himara_author_description) ): ?>
<div class="post-author">
<div class="section-title mt100">
<h4><?php echo esc_html__('About Author', 'himara') ?></h4>
<p class="section-subtitle"><?php echo esc_html__('More details about', 'himara') ?> <?php echo get_the_author_meta('nickname') ?></p>
</div>
<div class="post-author-box">
<div class="row">
<div class="col-md-2 col-sm-2">
<figure class="author-avatar">
<a href="<?php echo esc_url( get_author_posts_url($himara_author_id) ) ?>">
<?php echo get_avatar( get_the_author_meta('ID'), 130); ?>
</a>
</figure>
</div>
<div class="col-md-10 col-sm-10">
<div class="details">
<a href="<?php echo esc_url( get_author_posts_url($himara_author_id) ) ?>">
<?php echo '<h4 class="author-name">'.get_the_author_meta('display_name').'</h4>'; ?>
</a>
<div class="himara-author-desc">
<?php echo wpautop( get_the_author_meta('description') ); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php endif; ?>

View File

@@ -0,0 +1,36 @@
<?php if ( has_post_thumbnail() ) : ?>
<figure class="post-thumbnail">
<img src="<?php echo the_post_thumbnail_url('himara_image_size_1170_650') ?>" class="img-responsive" alt="<?php echo the_title_attribute() ?>">
</figure>
<?php endif ?>
<div class="post-header<?php if( !has_post_thumbnail() ) : ?> no-thumbnail<?php endif ?> ">
<h1 class="post-title"><?php echo get_the_title() ?></h1>
<div class="post-meta">
<?php
$post_author = get_the_author_meta('display_name');
$post_author_id = get_the_author_meta('ID');
$post_author_gravatar = get_avatar_url($post_author_id, array('size' => 14));
?>
<span class="author"><i class="icon-user"></i><?php echo '<a href="'.esc_url( get_author_posts_url( get_the_author_meta( 'ID', $post_author_id ) ) ).'">'.get_the_author_meta( 'display_name', $post_author_id ).'</a>' ?></span>
<span class="date"><i class="icon-clock"></i><a href="<?php echo esc_url( get_permalink() ) ?>"><?php echo get_the_date() ?></a></span>
<?php
if ( comments_open() || get_comments_number() ) {
$ccount = (int) get_comments_number();
$rep = esc_html('comments', 'himara');
if($ccount === 1) $rep = esc_html('comment', 'himara');
?>
<span class="comment"><i class="icon-bubble"></i><a href="<?php echo esc_url( get_permalink()).'#comments' ?>"><?php echo esc_html($ccount .' '. $rep) ?></a></span>
<?php } ?>
<?php $cats = get_the_category_list( ', ' ); ?>
<?php if (!empty($cats)) : ?>
<span class="category"><i class="icon-folder-alt"></i><?php echo wp_kses_post($cats) ?></span>
<?php endif ?>
</div>
</div>

View File

@@ -0,0 +1,25 @@
<div class="blog-post-hero gradient-overlay op5" data-src="<?php echo the_post_thumbnail_url('himara_image_size_1920_800') ?>" data-parallax="scroll" data-speed="0.3" data-mirror-selector=".wrapper" data-z-index="0">
<div class="container inner">
<h2 class="blog-post-title"><?php echo get_the_title() ?></h2>
<div class="blog-post-info">
<?php
$post_author = get_the_author_meta('display_name');
$post_author_id = get_the_author_meta('ID');
$post_author_gravatar = get_avatar_url($post_author_id, array('size' => 60));
?>
<img src="<?php echo esc_url( $post_author_gravatar ) ?>" alt="<?php echo esc_html( $post_author ) ?>" class="author-avatar">
<p>
<?php echo esc_html__('by', 'himara') ?>
<span>
<a href="<?php echo esc_url( get_author_posts_url( get_the_author_meta( 'ID', $post_author_id ) ) ) ?>">
<?php echo get_the_author_meta( 'display_name', $post_author_id ) ?>
</a>
</span>
</p>
<p>
<?php echo esc_html__('on', 'himara') ?>
<span><?php echo get_the_date() ?></span>
</p>
</div>
</div>
</div>