modern-events-calendar-lite/app/features/popup.php

681 lines
No EOL
28 KiB
PHP
Executable file

<?php
/** no direct access **/
defined('MECEXEC') or die();
/**
* @author Webnus <info@webnus.net>
*/
class MEC_feature_popup extends MEC_base
{
public $factory;
public $main;
public $settings;
/**
* Constructor method
* @author Webnus <info@webnus.net>
*/
public function __construct()
{
// Import MEC Factory
$this->factory = $this->getFactory();
// Import MEC Main
$this->main = $this->getMain();
// MEC Settings
$this->settings = $this->main->get_settings();
}
/**
* Initialize popup feature
* @author Webnus <info@webnus.net>
*/
public function init()
{
// Shortcode & Event Popup
$this->factory->action('restrict_manage_posts', array($this, 'add_popup'));
// Shortcode Save
$this->factory->action('wp_ajax_mec_popup_shortcode', array($this, 'shortcode_save'));
// Event Save
$this->factory->action('wp_ajax_mec_popup_event', array($this, 'event_save'));
$this->factory->action('wp_ajax_mec_popup_event_category', array($this, 'save_category'));
}
public function add_popup($post_type)
{
// Shortcode Popup
if($post_type == $this->main->get_shortcode_post_type())
{
$path = MEC::import('app.features.popup.shortcode', true, true);
include $path;
}
//Event Popup
elseif($post_type == $this->main->get_main_post_type())
{
$path = MEC::import('app.features.popup.event', true, true);
include $path;
}
}
public function shortcode_save()
{
// Security Nonce
$wpnonce = isset($_POST['_mecnonce']) ? sanitize_text_field($_POST['_mecnonce']) : NULL;
// Check if our nonce is set.
if(!trim($wpnonce)) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING'));
// Verify that the nonce is valid.
if(!wp_verify_nonce($wpnonce, 'mec_shortcode_popup')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID'));
$params = (isset($_POST['shortcode']) and is_array($_POST['shortcode'])) ? $this->main->sanitize_deep_array($_POST['shortcode']) : [];
$skin = isset($params['skin']) ? sanitize_text_field($params['skin']) : 'list';
$title = isset($params['name']) ? sanitize_text_field($params['name']) : ucwords(str_replace('_', ' ', $skin));
$show_past_events = isset($params['show_past_events']) ? sanitize_text_field($params['show_past_events']) : 1;
$show_only_past_events = isset($params['show_only_past_events']) ? sanitize_text_field($params['show_only_past_events']) : 0;
$show_only_ongoing_events = isset($params['show_only_ongoing_events']) ? sanitize_text_field($params['show_only_ongoing_events']) : 0;
$sed = isset($params['sed']) ? sanitize_text_field($params['sed']) : 0;
$style = isset($params['style']) ? sanitize_text_field($params['style']) : 'clean';
$event = isset($params['event']) ? sanitize_text_field($params['event']) : 0;
$custom_style = isset($params['custom_style']) ? sanitize_text_field($params['custom_style']) : '';
$skin_options = array(
'list' => array(
'style' => $style,
'start_date_type' => 'today',
'start_date' => '',
'maximum_date_range' => '',
'include_events_times' => 0,
'pagination_method' => 'loadmore',
'month_divider' => 1,
'map_on_top' => 0,
'set_geolocation' => 0,
'toggle_month_divider' => 0,
),
'grid' => array(
'style' => $style,
'start_date_type' => 'today',
'start_date' => '',
'maximum_date_range' => '',
'count' => 3,
'pagination_method' => 'loadmore',
'map_on_top' => 0,
'set_geolocation' => 0,
),
'agenda' => array(
'style' => $style,
'start_date_type' => 'today',
'start_date' => '',
'maximum_date_range' => '',
'month_divider' => 1,
'pagination_method' => 'loadmore',
),
'full_calendar' => array(
'start_date_type' => 'start_current_month',
'default_view' => 'list',
'monthly_style' => $style,
'list' => 1,
'yearly' => 0,
'monthly' => 1,
'weekly' => 1,
'daily' => 1,
'display_price' => 0,
),
'yearly_view' => array(
'style' => $style,
'start_date_type' => 'start_current_year',
'start_date' => '',
'next_previous_button' => 1,
),
'monthly_view' => array(
'style' => $style,
'start_date_type' => 'start_current_month',
'start_date' => '',
'next_previous_button' => 1,
),
'map' => array(
'start_date_type' => 'today',
'start_date' => '',
'limit' => 200,
'geolocation' => 0,
),
'daily_view' => array(
'start_date_type' => 'today',
'start_date' => '',
'next_previous_button' => 1,
),
'weekly_view' => array(
'start_date_type' => 'start_current_week',
'start_date' => '',
'next_previous_button' => 1,
),
'timetable' => array(
'style' => $style,
'start_date_type' => 'start_current_week',
'start_date' => '',
'number_of_days' => 5,
'week_start' => -1,
'start_time' => 8,
'end_time' => 20,
'next_previous_button' => 1,
),
'masonry' => array(
'start_date_type' => 'today',
'start_date' => '',
'maximum_date_range' => '',
'filter_by' => '',
'fit_to_row' => 0,
'masonry_like_grid' => 0,
'pagination_method' => 'loadmore',
),
'cover' => array(
'style' => $style,
'event_id' => $event,
),
'countdown' => array(
'style' => $style,
'event_id' => $event,
),
'available_spot' => array(
'event_id' => $event,
),
'carousel' => array(
'style' => $style,
'start_date_type' => 'today',
'start_date' => '',
'count' => 3,
'autoplay' => 1,
),
'slider' => array(
'style' => $style,
'start_date_type' => 'today',
'start_date' => '',
'autoplay' => 1,
),
'timeline' => array(
'start_date_type' => 'today',
'start_date' => '',
'maximum_date_range' => '',
'pagination_method' => 'loadmore',
'month_divider' => 0,
),
'tile' => array(
'start_date_type' => 'start_current_month',
'start_date' => '',
'count' => 4,
'next_previous_button' => 1,
),
'custom' => array(
'style' => $custom_style,
),
);
$sk = $skin_options[$skin] ?? ['style' => $style, 'start_date_type' => 'today', 'start_date' => ''];
$sk['sed_method'] = $sed;
$sk['image_popup'] = 0;
$sf = [];
$sf_status = 0;
$sf_display_label = '';
if($skin == 'full_calendar')
{
$sf = array('month_filter'=>array('type'=>'dropdown'), 'text_search'=>array('type'=>'text_input'));
$sf_status = 1;
}
// Create Default Calendars
$metas = array(
'label' => '',
'category' => '',
'location' => '',
'organizer' => '',
'tag' => '',
'author' => '',
'skin' => $skin,
'sk-options' => array(
$skin => $sk
),
'sf-options' => array($skin => $sf),
'sf_status' => $sf_status,
'sf_display_label' => $sf_display_label,
'show_past_events' => $show_past_events,
'show_only_past_events' => $show_only_past_events,
'show_only_ongoing_events' => $show_only_ongoing_events,
);
$post = array('post_title'=>$title, 'post_content'=>'', 'post_type'=>'mec_calendars', 'post_status'=>'publish');
$post_id = wp_insert_post($post);
foreach($metas as $key=>$value) update_post_meta($post_id, $key, $value);
$this->main->response(array('success'=>1, 'id'=>$post_id));
}
public function event_save()
{
// Security Nonce
$wpnonce = isset($_POST['_mecnonce']) ? sanitize_text_field($_POST['_mecnonce']) : NULL;
// Check if our nonce is set.
if(!trim($wpnonce)) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING'));
// Verify that the nonce is valid.
if(!wp_verify_nonce($wpnonce, 'mec_event_popup')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID'));
$mec = (isset($_POST['mec']) and is_array($_POST['mec'])) ? $this->main->sanitize_deep_array($_POST['mec'], 'text', array('content', 'excerpt')) : [];
$post_title = isset($mec['title']) ? sanitize_text_field($mec['title']) : '';
$post_content = isset($mec['content']) ? MEC_kses::page($mec['content']) : '';
$featured_image = isset($mec['featured_image']) ? sanitize_text_field($mec['featured_image']) : '';
// Post Status
$status = 'pending';
if(current_user_can('publish_posts')) $status = 'publish';
$post = array('post_title'=>$post_title, 'post_content'=>$post_content, 'post_type'=>$this->main->get_main_post_type(), 'post_status'=>$status);
$post_id = wp_insert_post($post);
// Categories
$categories = (isset($_POST['tax_input']) and isset($_POST['tax_input']['mec_category']) and is_array($_POST['tax_input']['mec_category'])) ? $this->main->sanitize_deep_array($_POST['tax_input']['mec_category']) : [];
wp_set_post_terms($post_id, $categories, 'mec_category');
// Color
$color = isset($mec['color']) ? sanitize_text_field(trim($mec['color'], '# ')) : '';
update_post_meta($post_id, 'mec_color', $color);
// Featured Image
if($featured_image) set_post_thumbnail($post_id, $featured_image);
// Location
$location_id = isset($mec['location_id']) ? sanitize_text_field($mec['location_id']) : 0;
// Selected a saved location
if($location_id)
{
// Set term to the post
wp_set_object_terms($post_id, (int) $location_id, 'mec_location');
}
else
{
$address = (isset($mec['location']['address']) and trim($mec['location']['address'])) ? sanitize_text_field($mec['location']['address']) : '';
$name = (isset($mec['location']['name']) and trim($mec['location']['name'])) ? sanitize_text_field($mec['location']['name']) : (trim($address) ? $address : esc_html__('Location Name', 'modern-events-calendar-lite'));
$term = get_term_by('name', $name, 'mec_location');
// Term already exists
if(is_object($term) and isset($term->term_id))
{
// Set term to the post
wp_set_object_terms($post_id, (int) $term->term_id, 'mec_location');
$location_id = (int) $term->term_id;
}
else
{
$term = wp_insert_term($name, 'mec_location');
$location_id = $term['term_id'];
if($location_id)
{
// Set term to the post
wp_set_object_terms($post_id, (int) $location_id, 'mec_location');
$latitude = (isset($mec['location']['latitude']) and trim($mec['location']['latitude'])) ? sanitize_text_field($mec['location']['latitude']) : 0;
$longitude = (isset($mec['location']['longitude']) and trim($mec['location']['longitude'])) ? sanitize_text_field($mec['location']['longitude']) : 0;
$thumbnail = (isset($mec['location']['thumbnail']) and trim($mec['location']['thumbnail'])) ? sanitize_text_field($mec['location']['thumbnail']) : '';
if(!trim($latitude) or !trim($longitude))
{
$geo_point = $this->main->get_lat_lng($address);
$latitude = $geo_point[0];
$longitude = $geo_point[1];
}
update_term_meta($location_id, 'address', $address);
update_term_meta($location_id, 'latitude', $latitude);
update_term_meta($location_id, 'longitude', $longitude);
update_term_meta($location_id, 'thumbnail', $thumbnail);
}
else $location_id = 1;
}
}
update_post_meta($post_id, 'mec_location_id', $location_id);
$dont_show_map = isset($mec['dont_show_map']) ? sanitize_text_field($mec['dont_show_map']) : 0;
update_post_meta($post_id, 'mec_dont_show_map', $dont_show_map);
// Organizer
$organizer_id = isset($mec['organizer_id']) ? sanitize_text_field($mec['organizer_id']) : 0;
if(!isset($this->settings['organizers_status']) || $this->settings['organizers_status'])
{
// Selected a saved organizer
if($organizer_id)
{
// Set term to the post
wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer');
}
else
{
$name = (isset($mec['organizer']['name']) and trim($mec['organizer']['name'])) ? sanitize_text_field($mec['organizer']['name']) : esc_html__('Organizer Name', 'modern-events-calendar-lite');
$term = get_term_by('name', $name, 'mec_organizer');
// Term already exists
if(is_object($term) and isset($term->term_id))
{
// Set term to the post
wp_set_object_terms($post_id, (int) $term->term_id, 'mec_organizer');
$organizer_id = (int) $term->term_id;
}
else
{
$term = wp_insert_term($name, 'mec_organizer');
$organizer_id = $term['term_id'];
if($organizer_id)
{
// Set term to the post
wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer');
$tel = (isset($mec['organizer']['tel']) and trim($mec['organizer']['tel'])) ? sanitize_text_field($mec['organizer']['tel']) : '';
$email = (isset($mec['organizer']['email']) and trim($mec['organizer']['email'])) ? sanitize_text_field($mec['organizer']['email']) : '';
$url = (isset($mec['organizer']['url']) and trim($mec['organizer']['url'])) ? sanitize_url($mec['organizer']['url']) : '';
$thumbnail = (isset($mec['organizer']['thumbnail']) and trim($mec['organizer']['thumbnail'])) ? sanitize_text_field($mec['organizer']['thumbnail']) : '';
update_term_meta($organizer_id, 'tel', $tel);
update_term_meta($organizer_id, 'email', $email);
update_term_meta($organizer_id, 'url', $url);
update_term_meta($organizer_id, 'thumbnail', $thumbnail);
}
else $organizer_id = 1;
}
}
}
update_post_meta($post_id, 'mec_organizer_id', $organizer_id);
// Date Options
$date = $mec['date'] ?? [];
$start_date = (isset($date['start']['date']) and trim($date['start']['date'])) ? $this->main->standardize_format(sanitize_text_field($date['start']['date'])) : date('Y-m-d');
$end_date = (isset($date['end']['date']) and trim($date['end']['date'])) ? $this->main->standardize_format(sanitize_text_field($date['end']['date'])) : date('Y-m-d');
// Set the start date
$date['start']['date'] = $start_date;
$start_time_hour = isset($date['start']) ? sanitize_text_field($date['start']['hour']) : '8';
$start_time_minutes = isset($date['start']) ? sanitize_text_field($date['start']['minutes']) : '00';
$start_time_ampm = (isset($date['start']) and isset($date['start']['ampm'])) ? sanitize_text_field($date['start']['ampm']) : 'AM';
// Fix end_date if it's smaller than start_date
if(strtotime($end_date) < strtotime($start_date)) $end_date = $start_date;
// Set the end date
$date['end']['date'] = $end_date;
$end_time_hour = isset($date['end']) ? sanitize_text_field($date['end']['hour']) : '6';
$end_time_minutes = isset($date['end']) ? sanitize_text_field($date['end']['minutes']) : '00';
$end_time_ampm = (isset($date['end']) and isset($date['end']['ampm'])) ? sanitize_text_field($date['end']['ampm']) : 'PM';
if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24)
{
$day_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($start_time_hour, NULL, 'start'), $start_time_minutes);
$day_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($end_time_hour, NULL, 'end'), $end_time_minutes);
}
else
{
$day_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($start_time_hour, $start_time_ampm, 'start'), $start_time_minutes);
$day_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($end_time_hour, $end_time_ampm, 'end'), $end_time_minutes);
}
if($end_date === $start_date and $day_end_seconds < $day_start_seconds)
{
$day_end_seconds = $day_start_seconds;
$end_time_hour = $start_time_hour;
$end_time_minutes = $start_time_minutes;
$end_time_ampm = $start_time_ampm;
$date['end']['hour'] = $start_time_hour;
$date['end']['minutes'] = $start_time_minutes;
$date['end']['ampm'] = $start_time_ampm;
}
// If 24 hours format is enabled then convert it back to 12 hours
if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24)
{
if($start_time_hour < 12) $start_time_ampm = 'AM';
elseif($start_time_hour == 12) $start_time_ampm = 'PM';
elseif($start_time_hour > 12)
{
$start_time_hour -= 12;
$start_time_ampm = 'PM';
}
elseif($start_time_hour == 0)
{
$start_time_hour = 12;
$start_time_ampm = 'AM';
}
if($end_time_hour < 12) $end_time_ampm = 'AM';
elseif($end_time_hour == 12) $end_time_ampm = 'PM';
elseif($end_time_hour > 12)
{
$end_time_hour -= 12;
$end_time_ampm = 'PM';
}
elseif($end_time_hour == 0)
{
$end_time_hour = 12;
$end_time_ampm = 'AM';
}
// Set converted values to date array
$date['start']['hour'] = $start_time_hour;
$date['start']['ampm'] = $start_time_ampm;
$date['end']['hour'] = $end_time_hour;
$date['end']['ampm'] = $end_time_ampm;
}
$allday = isset($date['allday']) ? 1 : 0;
// Set start time and end time if event is all day
if($allday == 1)
{
$start_time_hour = '8';
$start_time_minutes = '00';
$start_time_ampm = 'AM';
$end_time_hour = '6';
$end_time_minutes = '00';
$end_time_ampm = 'PM';
}
$start_datetime = $start_date.' '.sprintf('%02d', $start_time_hour).':'.sprintf('%02d', $start_time_minutes).' '.$start_time_ampm;
$end_datetime = $end_date.' '.sprintf('%02d', $end_time_hour).':'.sprintf('%02d', $end_time_minutes).' '.$end_time_ampm;
update_post_meta($post_id, 'mec_start_date', $start_date);
update_post_meta($post_id, 'mec_start_time_hour', $start_time_hour);
update_post_meta($post_id, 'mec_start_time_minutes', $start_time_minutes);
update_post_meta($post_id, 'mec_start_time_ampm', $start_time_ampm);
update_post_meta($post_id, 'mec_start_day_seconds', $day_start_seconds);
update_post_meta($post_id, 'mec_start_datetime', $start_datetime);
update_post_meta($post_id, 'mec_end_date', $end_date);
update_post_meta($post_id, 'mec_end_time_hour', $end_time_hour);
update_post_meta($post_id, 'mec_end_time_minutes', $end_time_minutes);
update_post_meta($post_id, 'mec_end_time_ampm', $end_time_ampm);
update_post_meta($post_id, 'mec_end_day_seconds', $day_end_seconds);
update_post_meta($post_id, 'mec_end_datetime', $end_datetime);
// Repeat Options
$repeat = [];
$repeat_type = NULL;
$repeat_status = 0;
$repeat_end = '';
$repeat_end_at_occurrences = '';
$repeat_end_at_date = '';
update_post_meta($post_id, 'mec_date', $date);
update_post_meta($post_id, 'mec_repeat', $repeat);
update_post_meta($post_id, 'mec_certain_weekdays', '');
update_post_meta($post_id, 'mec_allday', $allday);
update_post_meta($post_id, 'mec_hide_time', 0);
update_post_meta($post_id, 'mec_hide_end_time', 0);
update_post_meta($post_id, 'mec_comment', '');
update_post_meta($post_id, 'mec_repeat_status', $repeat_status);
update_post_meta($post_id, 'mec_repeat_type', '');
update_post_meta($post_id, 'mec_repeat_interval', '');
update_post_meta($post_id, 'mec_repeat_end', $repeat_end);
update_post_meta($post_id, 'mec_repeat_end_at_occurrences', $repeat_end_at_occurrences);
update_post_meta($post_id, 'mec_repeat_end_at_date', $repeat_end_at_date);
update_post_meta($post_id, 'mec_advanced_days', '');
// Creating $event array for inserting in mec_events table
$event = array('post_id'=>$post_id, 'start'=>$start_date, 'repeat'=>$repeat_status, 'rinterval'=>NULL, 'time_start'=>$day_start_seconds, 'time_end'=>$day_end_seconds);
$year = NULL;
$month = NULL;
$day = NULL;
$week = NULL;
$weekday = NULL;
$weekdays = NULL;
$in_days = '';
$not_in_days = '';
update_post_meta($post_id, 'mec_in_days', $in_days);
update_post_meta($post_id, 'mec_not_in_days', $not_in_days);
// Repeat End Date
$repeat_end_date = '0000-00-00';
// Add parameters to the $event
$event['end'] = $repeat_end_date;
$event['year'] = $year;
$event['month'] = $month;
$event['day'] = $day;
$event['week'] = $week;
$event['weekday'] = $weekday;
$event['weekdays'] = $weekdays;
$event['days'] = $in_days;
$event['not_in_days'] = $not_in_days;
// DB Library
$db = $this->getDB();
// Update MEC Events Table
$mec_event_id = $db->select("SELECT `id` FROM `#__mec_events` WHERE `post_id`='".$db->escape($post_id)."'", 'loadResult');
if(!$mec_event_id)
{
$q1 = "";
$q2 = "";
foreach($event as $key=>$value)
{
$q1 .= "`$key`,";
if(is_null($value)) $q2 .= "NULL,";
else $q2 .= "'$value',";
}
$db->q("INSERT INTO `#__mec_events` (".trim($q1, ', ').") VALUES (".trim($q2, ', ').")", 'INSERT');
}
else
{
$q = "";
foreach($event as $key=>$value)
{
if(is_null($value)) $q .= "`$key`=NULL,";
else $q .= "`$key`='$value',";
}
$db->q("UPDATE `#__mec_events` SET ".trim($q, ', ')." WHERE `id`='$mec_event_id'");
}
// Update Schedule
$schedule = $this->getSchedule();
$schedule->reschedule($post_id, $schedule->get_reschedule_maximum($repeat_type));
// Hourly Schedule Options
$hourly_schedules = [];
update_post_meta($post_id, 'mec_hourly_schedules', $hourly_schedules);
// Booking and Ticket Options
$booking = [];
update_post_meta($post_id, 'mec_booking', $booking);
$tickets = [];
update_post_meta($post_id, 'mec_tickets', $tickets);
// Fee options
$fees_global_inheritance = 1;
update_post_meta($post_id, 'mec_fees_global_inheritance', $fees_global_inheritance);
$fees = [];
update_post_meta($post_id, 'mec_fees', $fees);
// Ticket Variation options
$ticket_variations_global_inheritance = 1;
update_post_meta($post_id, 'mec_ticket_variations_global_inheritance', $ticket_variations_global_inheritance);
$ticket_variations = [];
update_post_meta($post_id, 'mec_ticket_variations', $ticket_variations);
// Registration Fields options
$reg_fields_global_inheritance = 1;
update_post_meta($post_id, 'mec_reg_fields_global_inheritance', $reg_fields_global_inheritance);
$reg_fields = [];
update_post_meta($post_id, 'mec_reg_fields', $reg_fields);
// Organizer Payment Options
$op = [];
update_post_meta($post_id, 'mec_op', $op);
update_user_meta(get_post_field('post_author', $post_id), 'mec_op', $op);
// For Event Notification Badge.
update_post_meta($post_id, 'mec_event_date_submit', date('YmdHis', current_time('timestamp', 0)));
do_action('mec_after_publish_admin_event', $post_id, false);
// Save Event Data
do_action('mec_save_event_data', $post_id, $mec);
$this->main->response(array(
'success' => 1,
'id' => $post_id,
'link' => get_post_permalink($post_id),
));
}
public function save_category()
{
$category = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : '';
$term = term_exists($category, 'mec_category');
if(!$term)
{
$term = wp_insert_term($category, 'mec_category');
$category_id = $term['term_id'];
}
else $category_id = $term['term_id'];
$this->main->response(array('success' => 1, 'id' => $category_id, 'name' => $category));
}
}