Files
wrapartamenty.pl/wp-content/themes/hello-elementor/functions.php
Jacek Pyziak c49d3b39d4 Add MPHB iCal Sync plugin for automatic iCal synchronization and booking management
- 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.
2026-03-02 18:14:50 +01:00

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;
}