- Implement SyncCron class for scheduling iCal sync every 15 minutes. - Create main plugin file with initialization and activation hooks. - Add admin booking modal for managing reservations, including AJAX functionality for searching available rooms and creating bookings. - Include necessary CSS and JS for modal functionality and user interaction. - Ensure compatibility with MotoPress Hotel Booking plugin.
485 lines
15 KiB
PHP
485 lines
15 KiB
PHP
<?php
|
|
/**
|
|
* Theme functions and definitions
|
|
*
|
|
* @package HelloElementor
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly.
|
|
}
|
|
|
|
define( 'HELLO_ELEMENTOR_VERSION', '3.0.1' );
|
|
|
|
if ( ! isset( $content_width ) ) {
|
|
$content_width = 800; // Pixels.
|
|
}
|
|
|
|
function get_current_page_id() {
|
|
global $post;
|
|
return is_singular() ? get_the_ID() : (isset($post->ID) ? $post->ID : null);
|
|
}
|
|
|
|
function wpc_elementor_booking( $atts ) {
|
|
$current_page = get_current_page_id();
|
|
$apartment_price = 0;
|
|
|
|
switch ($current_page) {
|
|
case 223:
|
|
$apartment_price = get_field('apartament_prima', 'option');
|
|
break;
|
|
case 372:
|
|
$apartment_price = get_field('apartament_prima_2', 'option');
|
|
break;
|
|
case 408:
|
|
$apartment_price = get_field('apartament_barcelona', 'option');
|
|
break;
|
|
case 492:
|
|
$apartment_price = get_field('apartament_mira', 'option');
|
|
break;
|
|
case 585:
|
|
$apartment_price = get_field('apartament_new_space', 'option');
|
|
break;
|
|
case 636:
|
|
$apartment_price = get_field('cosy_studio', 'option');
|
|
break;
|
|
default:
|
|
$apartment_price = 0;
|
|
}
|
|
|
|
?>
|
|
<script type="text/javascript">
|
|
jQuery( function($){
|
|
var apartmentPrice = <?php echo json_encode($apartment_price); ?>;
|
|
let bookingFormBox = $('.booking_form');
|
|
let bookingFormInputs = $(".booking_form_div .wpbc_structure_form", bookingFormBox)
|
|
let bookingCalendarBox = $(".booking_form_div .wpbc_structure_calendar", bookingFormBox)
|
|
let bookingCalendarCells = 'table.datepick tbody .datepick-days-cell'
|
|
var formId = $('.booking_form_div').attr('id').match(/\d+/)[0]
|
|
|
|
let bookingFormDateBtn = $('<a>Wybierz daty</a>').attr({
|
|
'href': '#',
|
|
'class': 'wpbc_button_light btn',
|
|
'id': 'booking_form_select_date'
|
|
})
|
|
var bookingFormStats = $('<div>', {id: 'booking-form-stats'});
|
|
|
|
let reservedDays = []
|
|
|
|
bookingCalendarBox.after(bookingFormDateBtn)
|
|
bookingFormInputs.hide()
|
|
|
|
$(document).on('click', '#booking_form_select_date', function(e) {
|
|
e.preventDefault()
|
|
|
|
if(reservedDays.length != 0) {
|
|
reservedDays.sort((a, b) => a - b);
|
|
bookingFormStats.empty()
|
|
bookingFormStats.remove()
|
|
$('#booking-other-rooms').remove()
|
|
|
|
if(areDatesConsecutive(reservedDays)) {
|
|
var firstDate = reservedDays[0];
|
|
var lastDate = reservedDays[reservedDays.length - 1];
|
|
|
|
if(reservedDays.length == 1) {
|
|
bookingFormStats.append($(`<p>Data: <strong>${convertTimestampToDate(firstDate)}</strong></p>`))
|
|
} else {
|
|
bookingFormStats.append($(`<p>Data od: <strong>${convertTimestampToDate(firstDate)}</strong></p>`))
|
|
bookingFormStats.append($(`<p>Data do: <strong>${convertTimestampToDate(lastDate)}</strong></p>`))
|
|
}
|
|
bookingFormStats.append($(`<p>Ilość dni: <strong>${reservedDays.length}</strong></p>`))
|
|
bookingFormStats.append($(`<p>Cena: <strong>${apartmentPrice * reservedDays.length} zł</strong></p>`))
|
|
bookingFormStats.append($(`<a href="#" class="wpbc_button_light btn" id="booking_form_reserv">Rezerwuj</a>`))
|
|
bookingFormDateBtn.after(bookingFormStats)
|
|
} else {
|
|
reservedDays.forEach(item => {
|
|
bookingFormStats.append($(`<p>Data: <strong>${convertTimestampToDate(item)}</strong></p>`))
|
|
})
|
|
bookingFormStats.append($(`<p>Ilość dni: <strong>${reservedDays.length}</strong></p>`))
|
|
bookingFormStats.append($(`<p>Cena: <strong>${apartmentPrice * reservedDays.length} zł</strong></p>`))
|
|
bookingFormStats.append($(`<a href="#" class="wpbc_button_light btn" id="booking_form_reserv">Rezerwuj</a>`))
|
|
bookingFormDateBtn.after(bookingFormStats)
|
|
}
|
|
|
|
fetch('/custom-api.php', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify(
|
|
{
|
|
id: formId,
|
|
reserved_days: reservedDays
|
|
}
|
|
)
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if(data.length) {
|
|
otherRooms(data)
|
|
}
|
|
})
|
|
.catch(error => console.error('Error:', error));
|
|
}
|
|
})
|
|
|
|
$(document).on('click', bookingCalendarCells, function(e) {
|
|
if(!$(this).hasClass("datepick-unselectable")) {
|
|
let thisDate = $(this).attr('cell_date')
|
|
let index = reservedDays.indexOf(thisDate);
|
|
if (index !== -1) {
|
|
reservedDays.splice(index, 1);
|
|
} else {
|
|
reservedDays.push(thisDate);
|
|
}
|
|
|
|
bookingFormInputs.hide()
|
|
bookingFormStats.empty()
|
|
bookingFormStats.remove()
|
|
$('#booking-other-rooms').remove()
|
|
}
|
|
});
|
|
|
|
$(document).on('click', '#booking_form_reserv', function(e) {
|
|
e.preventDefault()
|
|
bookingFormInputs.show()
|
|
});
|
|
|
|
function areDatesConsecutive(dates) {
|
|
for (let i = 1; i < dates.length; i++) {
|
|
let currentDate = parseInt(dates[i]);
|
|
let previousDate = parseInt(dates[i - 1]);
|
|
if (currentDate !== previousDate + 86400000) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function convertTimestampToDate(timestamp) {
|
|
var date = new Date(parseInt(timestamp));
|
|
|
|
var day = date.getDate();
|
|
var month = date.getMonth() + 1;
|
|
var year = date.getFullYear();
|
|
|
|
var formattedDate = (day < 10 ? '0' : '') + day + '.' + (month < 10 ? '0' : '') + month + '.' + year;
|
|
|
|
return formattedDate;
|
|
}
|
|
|
|
function otherRooms(rooms) {
|
|
var bookingOtherRooms = $('<div>', {id: 'booking-other-rooms'});
|
|
|
|
bookingOtherRooms.append($("<h3>Mieszkania dostępne w tych terminach</h3>"));
|
|
|
|
rooms.forEach(element => {
|
|
let otherRoom = $('<div>', {class: 'booking-other-room'});
|
|
otherRoom.append($(`<a class="room-name" href="${element.url}">${element.name}</a>`));
|
|
otherRoom.append($(`<p class="room-price">Cena: <strong>${element.price} zł</strong></p>`));
|
|
otherRoom.append($(`<a class="wpbc_button_light btn" href="${element.url}">Zobacz</a>`));
|
|
|
|
bookingOtherRooms.append(otherRoom);
|
|
});
|
|
$('.wpbc_booking_form_structure .wpbc_structure_form').after(bookingOtherRooms)
|
|
// $('#booking-form-stats').after(bookingOtherRooms);
|
|
}
|
|
});
|
|
</script>
|
|
<?
|
|
}
|
|
|
|
add_shortcode( 'my_elementor_booking', 'wpc_elementor_booking');
|
|
|
|
function theme_styles() {
|
|
wp_enqueue_style( 'main', get_template_directory_uri() . '/custom.css' );
|
|
}
|
|
add_action('wp_enqueue_scripts', 'theme_styles');
|
|
|
|
if ( ! function_exists( 'hello_elementor_setup' ) ) {
|
|
/**
|
|
* Set up theme support.
|
|
*
|
|
* @return void
|
|
*/
|
|
function hello_elementor_setup() {
|
|
if ( is_admin() ) {
|
|
hello_maybe_update_theme_version_in_db();
|
|
}
|
|
|
|
if ( apply_filters( 'hello_elementor_register_menus', true ) ) {
|
|
register_nav_menus( [ 'menu-1' => esc_html__( 'Header', 'hello-elementor' ) ] );
|
|
register_nav_menus( [ 'menu-2' => esc_html__( 'Footer', 'hello-elementor' ) ] );
|
|
}
|
|
|
|
if ( apply_filters( 'hello_elementor_post_type_support', true ) ) {
|
|
add_post_type_support( 'page', 'excerpt' );
|
|
}
|
|
|
|
if ( apply_filters( 'hello_elementor_add_theme_support', true ) ) {
|
|
add_theme_support( 'post-thumbnails' );
|
|
add_theme_support( 'automatic-feed-links' );
|
|
add_theme_support( 'title-tag' );
|
|
add_theme_support(
|
|
'html5',
|
|
[
|
|
'search-form',
|
|
'comment-form',
|
|
'comment-list',
|
|
'gallery',
|
|
'caption',
|
|
'script',
|
|
'style',
|
|
]
|
|
);
|
|
add_theme_support(
|
|
'custom-logo',
|
|
[
|
|
'height' => 100,
|
|
'width' => 350,
|
|
'flex-height' => true,
|
|
'flex-width' => true,
|
|
]
|
|
);
|
|
|
|
/*
|
|
* Editor Style.
|
|
*/
|
|
add_editor_style( 'classic-editor.css' );
|
|
|
|
/*
|
|
* Gutenberg wide images.
|
|
*/
|
|
add_theme_support( 'align-wide' );
|
|
|
|
/*
|
|
* WooCommerce.
|
|
*/
|
|
if ( apply_filters( 'hello_elementor_add_woocommerce_support', true ) ) {
|
|
// WooCommerce in general.
|
|
add_theme_support( 'woocommerce' );
|
|
// Enabling WooCommerce product gallery features (are off by default since WC 3.0.0).
|
|
// zoom.
|
|
add_theme_support( 'wc-product-gallery-zoom' );
|
|
// lightbox.
|
|
add_theme_support( 'wc-product-gallery-lightbox' );
|
|
// swipe.
|
|
add_theme_support( 'wc-product-gallery-slider' );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
add_action( 'after_setup_theme', 'hello_elementor_setup' );
|
|
|
|
function hello_maybe_update_theme_version_in_db() {
|
|
$theme_version_option_name = 'hello_theme_version';
|
|
// The theme version saved in the database.
|
|
$hello_theme_db_version = get_option( $theme_version_option_name );
|
|
|
|
// If the 'hello_theme_version' option does not exist in the DB, or the version needs to be updated, do the update.
|
|
if ( ! $hello_theme_db_version || version_compare( $hello_theme_db_version, HELLO_ELEMENTOR_VERSION, '<' ) ) {
|
|
update_option( $theme_version_option_name, HELLO_ELEMENTOR_VERSION );
|
|
}
|
|
}
|
|
|
|
if ( ! function_exists( 'hello_elementor_display_header_footer' ) ) {
|
|
/**
|
|
* Check whether to display header footer.
|
|
*
|
|
* @return bool
|
|
*/
|
|
function hello_elementor_display_header_footer() {
|
|
$hello_elementor_header_footer = true;
|
|
|
|
return apply_filters( 'hello_elementor_header_footer', $hello_elementor_header_footer );
|
|
}
|
|
}
|
|
|
|
if ( ! function_exists( 'hello_elementor_scripts_styles' ) ) {
|
|
/**
|
|
* Theme Scripts & Styles.
|
|
*
|
|
* @return void
|
|
*/
|
|
function hello_elementor_scripts_styles() {
|
|
$min_suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
|
|
|
if ( apply_filters( 'hello_elementor_enqueue_style', true ) ) {
|
|
wp_enqueue_style(
|
|
'hello-elementor',
|
|
get_template_directory_uri() . '/style' . $min_suffix . '.css',
|
|
[],
|
|
HELLO_ELEMENTOR_VERSION
|
|
);
|
|
}
|
|
|
|
if ( apply_filters( 'hello_elementor_enqueue_theme_style', true ) ) {
|
|
wp_enqueue_style(
|
|
'hello-elementor-theme-style',
|
|
get_template_directory_uri() . '/theme' . $min_suffix . '.css',
|
|
[],
|
|
HELLO_ELEMENTOR_VERSION
|
|
);
|
|
}
|
|
|
|
if ( hello_elementor_display_header_footer() ) {
|
|
wp_enqueue_style(
|
|
'hello-elementor-header-footer',
|
|
get_template_directory_uri() . '/header-footer' . $min_suffix . '.css',
|
|
[],
|
|
HELLO_ELEMENTOR_VERSION
|
|
);
|
|
}
|
|
}
|
|
}
|
|
add_action( 'wp_enqueue_scripts', 'hello_elementor_scripts_styles' );
|
|
|
|
if ( ! function_exists( 'hello_elementor_register_elementor_locations' ) ) {
|
|
/**
|
|
* Register Elementor Locations.
|
|
*
|
|
* @param ElementorPro\Modules\ThemeBuilder\Classes\Locations_Manager $elementor_theme_manager theme manager.
|
|
*
|
|
* @return void
|
|
*/
|
|
function hello_elementor_register_elementor_locations( $elementor_theme_manager ) {
|
|
if ( apply_filters( 'hello_elementor_register_elementor_locations', true ) ) {
|
|
$elementor_theme_manager->register_all_core_location();
|
|
}
|
|
}
|
|
}
|
|
add_action( 'elementor/theme/register_locations', 'hello_elementor_register_elementor_locations' );
|
|
|
|
if ( ! function_exists( 'hello_elementor_content_width' ) ) {
|
|
/**
|
|
* Set default content width.
|
|
*
|
|
* @return void
|
|
*/
|
|
function hello_elementor_content_width() {
|
|
$GLOBALS['content_width'] = apply_filters( 'hello_elementor_content_width', 800 );
|
|
}
|
|
}
|
|
add_action( 'after_setup_theme', 'hello_elementor_content_width', 0 );
|
|
|
|
if ( ! function_exists( 'hello_elementor_add_description_meta_tag' ) ) {
|
|
/**
|
|
* Add description meta tag with excerpt text.
|
|
*
|
|
* @return void
|
|
*/
|
|
function hello_elementor_add_description_meta_tag() {
|
|
if ( ! apply_filters( 'hello_elementor_description_meta_tag', true ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( ! is_singular() ) {
|
|
return;
|
|
}
|
|
|
|
$post = get_queried_object();
|
|
if ( empty( $post->post_excerpt ) ) {
|
|
return;
|
|
}
|
|
|
|
echo '<meta name="description" content="' . esc_attr( wp_strip_all_tags( $post->post_excerpt ) ) . '">' . "\n";
|
|
}
|
|
}
|
|
add_action( 'wp_head', 'hello_elementor_add_description_meta_tag' );
|
|
|
|
// Admin notice
|
|
if ( is_admin() ) {
|
|
require get_template_directory() . '/includes/admin-functions.php';
|
|
}
|
|
|
|
// Settings page
|
|
require get_template_directory() . '/includes/settings-functions.php';
|
|
|
|
// Header & footer styling option, inside Elementor
|
|
require get_template_directory() . '/includes/elementor-functions.php';
|
|
|
|
if ( ! function_exists( 'hello_elementor_customizer' ) ) {
|
|
// Customizer controls
|
|
function hello_elementor_customizer() {
|
|
if ( ! is_customize_preview() ) {
|
|
return;
|
|
}
|
|
|
|
if ( ! hello_elementor_display_header_footer() ) {
|
|
return;
|
|
}
|
|
|
|
require get_template_directory() . '/includes/customizer-functions.php';
|
|
}
|
|
}
|
|
add_action( 'init', 'hello_elementor_customizer' );
|
|
|
|
if ( ! function_exists( 'hello_elementor_check_hide_title' ) ) {
|
|
/**
|
|
* Check whether to display the page title.
|
|
*
|
|
* @param bool $val default value.
|
|
*
|
|
* @return bool
|
|
*/
|
|
function hello_elementor_check_hide_title( $val ) {
|
|
if ( defined( 'ELEMENTOR_VERSION' ) ) {
|
|
$current_doc = Elementor\Plugin::instance()->documents->get( get_the_ID() );
|
|
if ( $current_doc && 'yes' === $current_doc->get_settings( 'hide_title' ) ) {
|
|
$val = false;
|
|
}
|
|
}
|
|
return $val;
|
|
}
|
|
}
|
|
add_filter( 'hello_elementor_page_title', 'hello_elementor_check_hide_title' );
|
|
|
|
/**
|
|
* BC:
|
|
* In v2.7.0 the theme removed the `hello_elementor_body_open()` from `header.php` replacing it with `wp_body_open()`.
|
|
* The following code prevents fatal errors in child themes that still use this function.
|
|
*/
|
|
if ( ! function_exists( 'hello_elementor_body_open' ) ) {
|
|
function hello_elementor_body_open() {
|
|
wp_body_open();
|
|
}
|
|
}
|
|
|
|
// function add_jquery_ui_styles() {
|
|
// wp_enqueue_style('jquery-ui-style', get_template_directory_uri() . '/assets/jquery-ui/jquery-ui.min.css', array('theme-style'), null, true);
|
|
// wp_enqueue_style('jquery-ui-style-structure', get_template_directory_uri() . '/assets/jquery-ui/jquery-ui.structure.min.css', array('theme-style'), null, true);
|
|
// wp_enqueue_style('jquery-ui-style-theme', get_template_directory_uri() . '/assets/jquery-ui/jquery-ui.theme.min.css', array('theme-style'), null, true);
|
|
// }
|
|
// add_action('wp_enqueue_scripts', 'add_jquery_ui_styles');
|
|
|
|
function my_custom_enqueue_styles() {
|
|
wp_enqueue_style('daterangepicker-styles', get_template_directory_uri() . '/assets/plugin/DateRangePicker/daterangepicker.min.css', array(), '1.0.0', 'all');
|
|
}
|
|
add_action('wp_enqueue_scripts', 'my_custom_enqueue_styles');
|
|
|
|
function add_custom_js() {
|
|
wp_enqueue_script('moment-script', get_template_directory_uri() . '/assets/plugin/moment/moment.js', array('jquery'), null, true);
|
|
wp_enqueue_script('DateRangePicker-script', get_template_directory_uri() . '/assets/plugin/DateRangePicker/jquery.daterangepicker.min.js', array('jquery'), null, true);
|
|
wp_enqueue_script('custom-script', get_template_directory_uri() . '/assets/js/custom.js', array('jquery'), null, true);
|
|
}
|
|
add_action('wp_enqueue_scripts', 'add_custom_js');
|
|
|
|
add_action('admin_menu', function() {
|
|
remove_submenu_page('edit.php?post_type=mphb_room_type', 'mphb_room_attribute');
|
|
}, 999);
|
|
|
|
add_action('admin_menu', function() {
|
|
global $menu;
|
|
foreach ($menu as $key => $item) {
|
|
if (isset($item[2]) && $item[2] === 'mphb_customers') {
|
|
$menu[$key][0] = 'Klienci';
|
|
break;
|
|
}
|
|
}
|
|
}, 999);
|
|
|
|
$wrap_mphb_admin_booking_modal = get_template_directory() . '/includes/wrap-mphb-admin-booking-modal.php';
|
|
if ( file_exists( $wrap_mphb_admin_booking_modal ) ) {
|
|
require_once $wrap_mphb_admin_booking_modal;
|
|
}
|