";
$headers[] = "Reply-To: {$from_email}";
// Send email
$sent = wp_mail($to, $subject, $message, $headers);
// Remove filter to avoid conflicts
remove_filter('wp_mail_content_type', 'eshb_html_email_filter_calback');
//return $sent; // Returns true if sent, false if failed
return $sent;
}
public function get_eshb_currency_symbol(){
$eshb_settings = get_option( 'eshb_settings' ,[]);
$booking_type = isset($eshb_settings['booking-type']) ? $eshb_settings['booking-type'] : '';
if( !empty($eshb_settings['currency_symbol']) ){
$currency_symbol = $eshb_settings['currency_symbol'];
}else if($booking_type == 'woocommerce' && class_exists('woocommerce')){
$currency_symbol = get_woocommerce_currency_symbol();
}else if($booking_type == 'surecart' && class_exists('SureCart')){
$currency = new Currency();
$currency_symbol = $currency->getCurrencySymbol();
}else {
$currency_symbol = '$';
}
$currency_symbol = apply_filters('eshb_currency_symbol', $currency_symbol, $booking_type);
return $currency_symbol;
}
public function get_eshb_currency_position(){
$currency_position = 'left';
$eshb_settings = get_option( 'eshb_settings' ,[]);
if(isset($eshb_settings['currency_position']) && !empty($eshb_settings['currency_position'])){
$currency_position = $eshb_settings['currency_position'];
}
return $currency_position;
}
public function get_eshb_default_start_end_date(){
$today_date = gmdate('Y-m-d'); // Get today's date
// Create a DateTime object from today's date
$date = new DateTime($today_date);
// Add one day
$date->modify('+1 day');
// Get the new date in 'Y-m-d' format
$tomorrow_date = $date->format('Y-m-d');
return array(
'start_date' => $today_date,
'end_date' => $tomorrow_date
);
}
public function has_upcoming_or_current_session_price($accomodation_id, $start_date, $end_date, $night = 1, $adult = 1, $children = '') {
$metaboxes = get_post_meta($accomodation_id, 'eshb_accomodation_metaboxes', true);
$regular_price = !empty($metaboxes['regular_price']) ? $metaboxes['regular_price'] : 0;
// Get all sessions
$qargs = array(
'post_type' => 'eshb_session',
'post_status' => 'publish',
'posts_per_page' => -1,
);
$query = new WP_Query($qargs);
$sessions = [];
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
$metaboxes = maybe_unserialize(get_post_meta($post_id, 'eshb_session_metaboxes', true));
if (empty($metaboxes['start_date']) || empty($metaboxes['end_date'])) continue;
$sessions[] = [
'id' => $post_id,
'start_date' => $metaboxes['start_date'],
'end_date' => $metaboxes['end_date'],
'price' => $metaboxes['session_price'] ?? $regular_price,
'accomodation_ids' => $metaboxes['accomodation_ids'] ?? [],
'longstay_pricing' => $metaboxes['longstay_pricing'] ?? [],
'variable_pricing' => $metaboxes['variable_pricing'] ?? [],
'days' => $metaboxes['days'] ?? [],
];
}
wp_reset_postdata();
}
// Create date range (exclude checkout date if multi-day)
$period = new DatePeriod(
new DateTime($start_date),
new DateInterval('P1D'),
(new DateTime($start_date) == new DateTime($end_date))
? (new DateTime($end_date))->modify('+1 day')
: new DateTime($end_date)
);
$total_nights = iterator_count($period);
// Initialize flags
$longstay_applied = false;
$variable_applied = false;
$session_price_applied = false;
foreach ($period as $day) {
$current_date = $day->format('Y-m-d');
$current_day_name = strtolower($day->format('l'));
foreach ($sessions as $session) {
if(empty($session['accomodation_ids'])){
continue;
}
if (!empty($session['accomodation_ids']) && !in_array($accomodation_id, $session['accomodation_ids'])) {
continue;
}
$session_days = !empty($session['days']) ? $session['days'] : ['saturday', 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday'];
if(is_array($session['days']) && in_array('all', $session['days'])){
$session_days = ['saturday', 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday'];
}
if ($current_date >= $session['start_date'] && $current_date <= $session['end_date'] && in_array($current_day_name, $session_days)) {
// 1. Longstay Pricing
if (!empty($session['longstay_pricing']) && $total_nights >= 1) {
// reverse the longstay_pricing array
$session['longstay_pricing'] = array_reverse($session['longstay_pricing']);
foreach ($session['longstay_pricing'] as $ls) {
if (!empty($ls['night']) && $total_nights >= $ls['night']) {
$longstay_applied = true;
break 2; // early return since found
}
}
}
// 2. Variable Pricing
if (!empty($session['variable_pricing'])) {
foreach ($session['variable_pricing'] as $vp) {
$vp_adult = $vp['adult_quantity'] ?? 0;
$vp_children = $vp['children_quantity'] ?? 0;
if ($vp_adult == $adult && $vp_children == $children) {
$variable_applied = true;
break 2;
}
}
}
// 3. Session Price (basic price)
if (!empty($session['price']) && $session['price'] != $regular_price) {
$session_price_applied = true;
break 2;
}
}
}
}
if ($longstay_applied || $variable_applied || $session_price_applied) {
return true;
}
return false;
}
public function get_eshb_price_by_session($accomodation_id, $start_date, $end_date, $night = '', $adult = '', $children = '') {
$metaboxes = get_post_meta($accomodation_id, 'eshb_accomodation_metaboxes', true);
$regular_price = !empty($metaboxes['regular_price']) ? $metaboxes['regular_price'] : 0;
// Get all sessions
$qargs = array(
'post_type' => 'eshb_session',
'post_status' => 'publish',
'posts_per_page' => -1,
);
$query = new WP_Query($qargs);
$sessions = [];
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
$metaboxes = maybe_unserialize(get_post_meta($post_id, 'eshb_session_metaboxes', true));
if (empty($metaboxes['start_date']) || empty($metaboxes['end_date'])) continue;
$sessions[] = [
'id' => $post_id,
'start_date' => $metaboxes['start_date'],
'end_date' => $metaboxes['end_date'],
'price' => $metaboxes['session_price'] ?? $regular_price,
'accomodation_ids' => $metaboxes['accomodation_ids'] ?? [],
'longstay_pricing' => $metaboxes['longstay_pricing'] ?? [],
'variable_pricing' => $metaboxes['variable_pricing'] ?? [],
'days' => $metaboxes['days'] ?? [],
];
}
wp_reset_postdata();
}
// Create date range (exclude checkout date if multi-day)
$period = new DatePeriod(
new DateTime($start_date),
new DateInterval('P1D'),
(new DateTime($start_date) == new DateTime($end_date))
? (new DateTime($end_date))->modify('+1 day') // same-day booking
: new DateTime($end_date) // exclude checkout
);
$total_nights = iterator_count($period);
$per_day_prices = [];
foreach ($period as $day) {
$current_date = $day->format('Y-m-d');
$current_day_name = strtolower($day->format('l'));
$matched_price = $regular_price;
foreach ($sessions as $session) {
if(empty($session['accomodation_ids'])){
continue;
}
if (!empty($session['accomodation_ids']) && !in_array($accomodation_id, $session['accomodation_ids'])) {
continue;
}
$session_days = !empty($session['days']) ? $session['days'] : ['saturday', 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday'];
if(in_array('all', $session_days)){
$session_days = ['saturday', 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday'];
}
if ($current_date >= $session['start_date'] && $current_date <= $session['end_date'] && in_array($current_day_name, $session_days)) {
// 1. Longstay Pricing (highest priority)
$longstay_applied = false;
if (!empty($session['longstay_pricing']) && $total_nights >= 1) {
$session['longstay_pricing'] = array_reverse($session['longstay_pricing']);
foreach ($session['longstay_pricing'] as $ls) {
if (!empty($ls['night']) && $total_nights >= $ls['night']) {
$matched_price = floatval($ls['price']);
$longstay_applied = true;
break;
}
}
}
if ($longstay_applied) break;
// 2. Variable Pricing
$variable_applied = false;
if (!empty($session['variable_pricing'])) {
foreach ($session['variable_pricing'] as $vp) {
$vp_adult = $vp['adult_quantity'] ?? 0;
$vp_children = $vp['children_quantity'] ?? 0;
if ($vp_adult == $adult && $vp_children == $children) {
$matched_price = floatval($vp['price']);
$variable_applied = true;
break;
}
}
}
if ($variable_applied) break;
// 3. Session price
$matched_price = floatval($session['price']);
break;
}
}
$per_day_prices[] = $matched_price;
}
$total_price = array_sum($per_day_prices);
$total_price = apply_filters('eshb_session_price', $total_price);
return $total_price;
}
public function get_eshb_price($start_date = null, $end_date = null, $accomodation_id = null, $session_price = true, $night = '', $adult = '', $children = '', $sale = true, $single_day = true) {
if($start_date == null || empty($start_date) || $end_date == null || empty($end_date)){
$dates = $this->get_eshb_default_start_end_date();
$start_date = $dates['start_date'];
$end_date = $dates['end_date'];
}
if( $accomodation_id == null || empty($accomodation_id) ){
global $post;
$accomodation_id = $post->ID;
}
$price = '';
$metaboxes = get_post_meta($accomodation_id, 'eshb_accomodation_metaboxes', true);
$regular_price = !empty($metaboxes['regular_price']) ? $metaboxes['regular_price'] : 0;
$sale_price = !empty($metaboxes['sale_price']) ? $metaboxes['sale_price'] : 0;
if($single_day){
$single_day_price = apply_filters( 'eshb_single_day_price', 0, $accomodation_id);
$eshb_single_day_sale_price = apply_filters( 'eshb_single_day_sale_price', 0, $accomodation_id);
$regular_price = !empty($single_day_price) ? $single_day_price : $regular_price;
$sale_price = !empty($eshb_single_day_sale_price) ? $eshb_single_day_sale_price : $sale_price;
}
$price = $regular_price;
if($sale == true){
$price = !empty($sale_price) ? $sale_price : $regular_price;
}
if($session_price == true){
$session_price = $this->get_eshb_price_by_session($accomodation_id, $start_date, $end_date, $night, $adult, $children);
$price = !empty($session_price) ? $session_price : $price;
}
$price = apply_filters('eshb_price', $price);
return $price;
}
public function eshb_price ($price, $currency_symbol = NULL){
if(!$currency_symbol || $currency_symbol = NULL || empty($currency_symbol)) {
// Get the currency symbol
$currency_symbol = $this->get_eshb_currency_symbol();
}
// Prepare the price HTML, with or without currency symbol
$currency_position = $this->get_eshb_currency_position();
$eshb_settings = get_option('eshb_settings');
$booking_type = isset($eshb_settings['booking-type']) ? $eshb_settings['booking-type'] : 'woocommerce';
if($booking_type == 'woocommerce' && class_exists('WooCommerce')){
$price = wc_price($price, []);
return $price;
}else{
if(!empty($price)){
$price = number_format($price,2);
}
$price_html = $currency_symbol . $price;
if($currency_position == 'right') {
$price_html = $price . $currency_symbol;
}
}
return $price_html;
}
public function get_eshb_price_html($start_date = null, $end_date = null, $accomodation_id = null, $show_currency = true, $include_single_day_price = true, $include_day_wise_price = true, $include_session_price = true, $format = 'sale') {
if($start_date == null || empty($start_date) || $end_date == null || empty($end_date)){
$dates = $this->get_eshb_default_start_end_date();
$start_date = $dates['start_date'];
$end_date = $dates['end_date'];
}
$eshb_settings = get_option('eshb_settings');
$booking_type = isset($eshb_settings['booking-type']) ? $eshb_settings['booking-type'] : 'woocommerce';
$is_wc_price = false;
if($booking_type == 'woocommerce' && class_exists('WooCommerce')){
$is_wc_price = true;
}
// Get the currency symbol
$currency_symbol = $this->get_eshb_currency_symbol();
// Get price values from different sources
$regular_price = $this->get_eshb_price($start_date, $end_date, $accomodation_id, false, '', '', '', false);
$sale_price = $this->get_eshb_price($start_date, $end_date, $accomodation_id, false, '', '', '', true);
$prices = [
'regular_price' => $regular_price,
'sale_price' => $sale_price
];
$day_wise_price = $this->get_eshb_day_wise_price($start_date, $end_date, $accomodation_id, false, 1, 1, 0);
$has_session_price = $this->has_upcoming_or_current_session_price($accomodation_id, $start_date, $end_date, 1, 1, 0);
if ($has_session_price && $include_session_price) {
$include_session_price = true;
} else {
$include_session_price = false;
}
$session_price = $this->get_eshb_price_by_session($accomodation_id, $start_date, $end_date);
$single_day_price = apply_filters( 'eshb_single_day_price', 0, $accomodation_id );
// Determine the price to use
if ($include_session_price === true && !empty($session_price) && ($session_price !== $regular_price && $session_price !== $sale_price)) {
$price = $session_price;
} elseif ($include_day_wise_price === true && !empty($day_wise_price) && ($day_wise_price !== $regular_price && $day_wise_price !== $sale_price)) {
$price = $day_wise_price;
} elseif ($include_single_day_price === true && !empty($single_day_price) && ($single_day_price !== $regular_price && $single_day_price !== $sale_price)) {
$price = $single_day_price;
} else {
if(!empty($sale_price ) && $sale_price !== $regular_price){
if($format == 'sale'){
$price = $prices;
}else{
$price = $sale_price;
}
}else{
$price = $regular_price;
}
}
// Return empty string if price is empty
if (empty($price)) {
return '';
}
// Prepare the price HTML, with or without currency symbol
$currency_position = $this->get_eshb_currency_position();
$price_html = '';
$price = apply_filters('eshb_price_html_price', $price);
if ( is_array( $price ) ) {
// Regular & Sale Price
$regular_price = $price['regular_price'];
$sale_price = $price['sale_price'];
if ( $show_currency && !$is_wc_price ) {
if ( $currency_position == 'right' ) {
$regular_price = $regular_price . $currency_symbol;
$sale_price = $sale_price . $currency_symbol;
} else {
$regular_price = $currency_symbol . $regular_price;
$sale_price = $currency_symbol . $sale_price;
}
}
if($is_wc_price){
$regular_price = wc_price($regular_price, []);
$sale_price = wc_price($sale_price, []);
}
$price_html = '';
$price_html .= '' . $regular_price . '';
$price_html .= 'Original price was: ' . $regular_price . '.';
$price_html .= '' . $sale_price . '';
$price_html .= 'Current price is: ' . $sale_price . '.';
$price_html .= '';
} else {
// Single Price (No Sale)
$single_price = $price;
if ( $show_currency && !$is_wc_price) {
if ( $currency_position == 'right' ) {
$single_price = $single_price . $currency_symbol;
} else {
$single_price = $currency_symbol . $single_price;
}
}
if($is_wc_price){
$single_price = wc_price($single_price, []);
}
$price_html = '';
$price_html .= '' . $single_price . '';
$price_html .= '';
}
$price_html = apply_filters('eshb_price_html', $price_html, $price);
return $price_html;
}
public function get_eshb_day_names_from_date_ranges($start_date, $end_date){
$period = new DatePeriod(
new DateTime($start_date),
new DateInterval('P1D'),
new DateTime($end_date) // Stop before the end date
);
$dayNames = [];
foreach ($period as $date) {
$dayNames[] = strtolower($date->format('l')); // Convert to lowercase
}
return $dayNames;
}
public function get_eshb_day_wise_price($start_date, $end_date, $accomodation_id, $fallback_regular_price = true, $night = '', $adult = '', $children = ''){
if($start_date == null || empty($start_date) || $end_date == null || empty($end_date) || $accomodation_id == null || empty($accomodation_id)) return 0;
$regular_price = $fallback_regular_price == true ? $this->get_eshb_price($start_date, $end_date, $accomodation_id, false, $night, $adult, $children,) : 0;
if ($start_date === $end_date) {
// Add 1 day to end date if they are the same
$end_date = gmdate('Y-m-d', strtotime($end_date . ' +1 day'));
}
$period = new DatePeriod(
new DateTime($start_date),
new DateInterval('P1D'),
new DateTime($end_date) // Stop before the end date
);
$dayNames = [];
$days_count = 0;
foreach ($period as $date) {
$dayNames[] = strtolower($date->format('l')); // Convert to lowercase
$days_count++;
}
// If only one day is selected, return the price for that day
// if(is_archive() || isset($_GET['eshb_global_nonce_action']) || isset($_GET['eshb_search_nonce'])){
// $todayName = strtolower(gmdate('l'));
// //remove all day names from the array but today's name
// $dayNames = array_filter($dayNames, function($day) use ($todayName) {
// return $day === $todayName;
// });
// }
$metaboxes = get_post_meta($accomodation_id, 'eshb_accomodation_metaboxes', true);
$day_wise_price = isset($metaboxes['day_wise_price']) && !empty($metaboxes['day_wise_price']) ? $metaboxes['day_wise_price'] : '';
$price_by_day = 0;
if(!empty($day_wise_price) && isset($day_wise_price[0]) && !empty($day_wise_price[0])){
$day_wise_price = $day_wise_price[0];
foreach ($dayNames as $key => $day) {
if( !empty($day_wise_price[$day]) ){
$price_by_day += $day_wise_price[$day];
}else{
$price_by_day += $regular_price;
}
}
}else{
$price_by_day = $regular_price * $days_count;
}
$price_by_day = apply_filters('eshb_day_wise_price', $price_by_day);
return $price_by_day;
}
}
ESHB_Core::instance();