*/ class MEC_feature_events extends MEC_base { public $factory; public $main; public $db; public $PT; public $settings; public $render; /** * Constructor method * * @author Webnus */ public function __construct() { // Import MEC Factory $this->factory = $this->getFactory(); // Import MEC Main $this->main = $this->getMain(); // Import MEC DB $this->db = $this->getDB(); // MEC Post Type Name $this->PT = $this->main->get_main_post_type(); // MEC Settings $this->settings = $this->main->get_settings(); } /** * Initialize events feature * * @author Webnus */ public function init() { $this->factory->action('init', array($this, 'register_post_type')); $this->factory->action('mec_category_add_form_fields', array($this, 'add_category_fields'), 10, 2); $this->factory->action('mec_category_edit_form_fields', array($this, 'edit_category_fields'), 10, 2); $this->factory->action('edited_mec_category', array($this, 'save_metadata')); $this->factory->action('created_mec_category', array($this, 'save_metadata')); $this->factory->action('init', array($this, 'register_endpoints')); $this->factory->action('add_meta_boxes_' . $this->PT, array($this, 'remove_taxonomies_metaboxes')); $this->factory->action('save_post', array($this, 'save_event'), 10); $this->factory->action('edit_post', array($this, 'quick_edit'), 10); $this->factory->action('delete_post', array($this, 'delete_event'), 10); $this->factory->action('transition_post_status', array($this, 'event_published'), 10 , 3); $this->factory->filter('post_row_actions', array($this, 'action_links'), 10, 2); $this->factory->action('admin_init', array($this, 'duplicate_event')); $this->factory->action('add_meta_boxes', array($this, 'register_meta_boxes'), 1); $this->factory->action('restrict_manage_posts', array($this, 'add_filters')); $this->factory->action('manage_posts_extra_tablenav', array($this, 'add_buttons')); if(is_admin()) $this->factory->action('pre_get_posts', array($this, 'filter')); $this->factory->action('mec_metabox_details', array($this, 'meta_box_nonce'), 10); $this->factory->action('mec_metabox_details', array($this, 'meta_box_dates'), 20); $this->factory->action('mec_metabox_details', array($this, 'meta_box_hourly_schedule'), 30); $this->factory->action('mec_metabox_details', array($this, 'meta_box_links'), 40); $this->factory->action('mec_metabox_details', array($this, 'meta_box_cost'), 50); $this->factory->action('mec_metabox_details', array($this, 'meta_box_fields'), 60); // Hourly Schedule for FES if(!isset($this->settings['fes_section_hourly_schedule']) or (isset($this->settings['fes_section_hourly_schedule']) and $this->settings['fes_section_hourly_schedule'])) { $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_hourly_schedule'), 30); } // Data Fields for FES if(!isset($this->settings['fes_section_data_fields']) or (isset($this->settings['fes_section_data_fields']) and $this->settings['fes_section_data_fields'])) { $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_fields'), 20); } // Show exceptional days if enabled if(isset($this->settings['exceptional_days']) and $this->settings['exceptional_days']) { $this->factory->action('mec_metabox_details', array($this, 'meta_box_exceptional_days'), 25); $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_exceptional_days'), 25); } // Show Booking meta box only if booking module is enabled $booking_status = (isset($this->settings['booking_status']) and $this->settings['booking_status']); if($booking_status) { $this->factory->action('mec_metabox_booking', array($this, 'meta_box_booking_options'), 5); $this->factory->action('mec_metabox_booking', array($this, 'meta_box_tickets')); $this->factory->action('mec_metabox_booking', array($this, 'meta_box_regform'), 20); $this->factory->action('mec_metabox_booking', array($this, 'meta_box_attendees'), 22); $this->factory->action('wp_ajax_mec_event_bookings', array($this, 'mec_event_bookings'), 23); $this->factory->action('wp_ajax_mec_move_bookings', array($this, 'mec_move_bookings'), 24); $this->factory->action('wp_ajax_mec_manage_bookings', array($this, 'mec_manage_bookings'), 25); if(!isset($this->settings['fes_section_booking']) or (isset($this->settings['fes_section_booking']) and $this->settings['fes_section_booking'])) { // Booking Options for FES if(!isset($this->settings['fes_section_booking']) or (isset($this->settings['fes_section_booking']) and $this->settings['fes_section_booking'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_booking_options'), 35); // Ticket Options for FES if(!isset($this->settings['fes_section_tickets']) or (isset($this->settings['fes_section_tickets']) and $this->settings['fes_section_tickets'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_tickets'), 40); // Registration Form for FES if(!isset($this->settings['fes_section_reg_form']) or (isset($this->settings['fes_section_reg_form']) and $this->settings['fes_section_reg_form'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_regform'), 45); // Attendees for FES if(!isset($this->settings['fes_section_booking_att']) or (isset($this->settings['fes_section_booking_att']) and $this->settings['fes_section_booking_att'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_attendees'), 48); } } // Show fees meta box only if fees module is enabled if(isset($this->settings['taxes_fees_status']) and $this->settings['taxes_fees_status']) { $this->factory->action('mec_metabox_booking', array($this, 'meta_box_fees'), 15); // Fees for FES if(!isset($this->settings['fes_section_booking']) or (isset($this->settings['fes_section_booking']) and $this->settings['fes_section_booking'])) { if($booking_status and (!isset($this->settings['fes_section_fees']) or (isset($this->settings['fes_section_fees']) and $this->settings['fes_section_fees']))) { $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_fees'), 45); } } } // Show ticket variations meta box only if the module is enabled if($booking_status and isset($this->settings['ticket_variations_status']) and $this->settings['ticket_variations_status']) { $this->factory->action('mec_metabox_booking', array($this, 'meta_box_ticket_variations'), 16); // Ticket Variations for FES if(!isset($this->settings['fes_section_booking']) or (isset($this->settings['fes_section_booking']) and $this->settings['fes_section_booking'])) { if(!isset($this->settings['fes_section_ticket_variations']) or (isset($this->settings['fes_section_ticket_variations']) and $this->settings['fes_section_ticket_variations'])) { $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_ticket_variations'), 46); } } } $this->factory->filter('manage_' . $this->PT . '_posts_columns', array($this, 'filter_columns')); $this->factory->filter('manage_edit-' . $this->PT . '_sortable_columns', array($this, 'filter_sortable_columns')); $this->factory->action('manage_' . $this->PT . '_posts_custom_column', array($this, 'filter_columns_content'), 10, 2); $this->factory->action('admin_footer-edit.php', array($this, 'add_bulk_actions')); $this->factory->action('load-edit.php', array($this, 'do_bulk_actions')); $this->factory->action('pre_post_update', array($this, 'bulk_edit'), 10); // WPML Duplicate $this->factory->action('icl_make_duplicate', array($this, 'icl_duplicate'), 10, 4); $this->factory->action('icl_pro_translation_saved', array($this, 'wpml_pro_translation_saved'), 10, 3); // Image Fallback if(isset($this->settings['fallback_featured_image_status']) and $this->settings['fallback_featured_image_status']) { $this->factory->filter('get_post_metadata', array($this, 'set_fallback_image_id'), 10, 4); $this->factory->filter('post_thumbnail_html', array($this, 'show_fallback_image'), 20, 5); } // Event Gallery if(isset($this->settings['event_gallery_status']) and $this->settings['event_gallery_status']) { // AJAX $this->factory->action('wp_ajax_mec_event_gallery_image_upload', array($this, 'gallery_image_upload')); } // Related Events Per Event if(isset($this->settings['related_events_per_event']) and $this->settings['related_events_per_event']) { $this->factory->action('mec_metabox_details', array($this, 'meta_box_related_events'), 17); // Related Events Per Event for FES if(!isset($this->settings['fes_section_related_events']) or (isset($this->settings['fes_section_related_events']) and $this->settings['fes_section_related_events'])) { $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_related_events'), 33); } } // Event Banner if(isset($this->settings['banner_status']) && $this->settings['banner_status'] && (!isset($this->settings['banner_force_featured_image']) || !$this->settings['banner_force_featured_image'])) { $this->factory->action('mec_metabox_details', array($this, 'meta_box_banner'), 18); // Event Banner for FES if(!isset($this->settings['fes_section_banner']) or (isset($this->settings['fes_section_banner']) and $this->settings['fes_section_banner'])) { $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_banner'), 34); } } // Timezone Notice $timezone_string = get_option('timezone_string'); if(trim($timezone_string) === '') { add_action('admin_notices', function() { echo '

'.esc_html__('It is advisable to utilize a geographic timezone, such as "America/Los_Angeles" instead of a UTC timezone offset, like "UTC+0," while using The Modern Events Calendar. The latter may cause issues when importing events or with Daylight Saving Time.', 'modern-events-calendar-lite').'

'; }); } } /** * Registers events post type and assign it to some taxonomies * * @author Webnus */ public function register_post_type() { // Get supported features for event post type $supports = apply_filters('mec_event_supports', array('editor', 'title', 'excerpt', 'author', 'thumbnail', 'comments')); $args = apply_filters( 'mec_event_register_post_type_args', array( 'labels' => array( 'name' => esc_html__('Events', 'modern-events-calendar-lite'), 'singular_name' => esc_html__('Event', 'modern-events-calendar-lite'), 'add_new' => esc_html__('Add Event', 'modern-events-calendar-lite'), 'add_new_item' => esc_html__('Add New Event', 'modern-events-calendar-lite'), 'not_found' => esc_html__('No events found!', 'modern-events-calendar-lite'), 'all_items' => esc_html__('All Events', 'modern-events-calendar-lite'), 'edit_item' => esc_html__('Edit Event', 'modern-events-calendar-lite'), 'view_item' => esc_html__('View Event', 'modern-events-calendar-lite'), 'not_found_in_trash' => esc_html__('No events found in Trash!', 'modern-events-calendar-lite'), ), 'public' => true, 'has_archive' => ($this->main->get_archive_status() ? true : false), 'menu_icon' => plugin_dir_url(__FILE__ ) . '../../assets/img/mec.svg', 'menu_position' => 26, 'show_in_menu' => 'mec-intro', 'rewrite' => array( 'slug' => $this->main->get_main_slug(), 'ep_mask' => EP_MEC_EVENTS, 'with_front' => false, ), 'supports' => $supports, 'show_in_rest' => true, ) ); register_post_type( $this->PT, $args ); $singular_label = $this->main->m('taxonomy_category', esc_html__('Category', 'modern-events-calendar-lite')); $plural_label = $this->main->m('taxonomy_categories', esc_html__('Categories', 'modern-events-calendar-lite')); $category_args = apply_filters( 'mec_register_taxonomy_args', array( 'label' => $plural_label, 'labels' => array( 'name' => $plural_label, 'singular_name' => $singular_label, 'all_items' => sprintf(esc_html__('All %s', 'modern-events-calendar-lite'), $plural_label), 'edit_item' => sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $singular_label), 'view_item' => sprintf(esc_html__('View %s', 'modern-events-calendar-lite'), $singular_label), 'update_item' => sprintf(esc_html__('Update %s', 'modern-events-calendar-lite'), $singular_label), 'add_new_item' => sprintf(esc_html__('Add New %s', 'modern-events-calendar-lite'), $singular_label), 'new_item_name' => sprintf(esc_html__('New %s Name', 'modern-events-calendar-lite'), $singular_label), 'popular_items' => sprintf(esc_html__('Popular %s', 'modern-events-calendar-lite'), $plural_label), 'search_items' => sprintf(esc_html__('Search %s', 'modern-events-calendar-lite'), $plural_label), ), 'public' => true, 'show_ui' => true, 'show_in_rest' => true, 'hierarchical' => true, 'has_archive' => true, 'rewrite' => array('slug' => $this->main->get_category_slug()), ), 'mec_category' ); register_taxonomy( 'mec_category', $this->PT, $category_args ); register_taxonomy_for_object_type('mec_category', $this->PT); } /** * Register meta field to taxonomies * * @author Webnus */ public function add_category_fields() { add_thickbox(); // Fallback Status $fallback = (isset($this->settings['fallback_featured_image_status']) and $this->settings['fallback_featured_image_status']); ?>

*/ public function edit_category_fields($term) { add_thickbox(); // Fallback Status $fallback = (isset($this->settings['fallback_featured_image_status']) and $this->settings['fallback_featured_image_status']); // Fallback Image $fallback_image = get_metadata('term', $term->term_id, 'mec_cat_fallback_image', true); // Icon $icon = get_metadata('term', $term->term_id, 'mec_cat_icon', true); // Color $color = get_metadata('term', $term->term_id, 'mec_cat_color', true); ?>

'; ?>
* @param int $term_id */ public function save_metadata($term_id) { // Quick Edit if(!isset($_POST['mec_cat_icon'])) return; $icon = sanitize_text_field($_POST['mec_cat_icon']); update_term_meta($term_id, 'mec_cat_icon', $icon); $color = isset($_POST['mec_cat_color']) ? sanitize_text_field($_POST['mec_cat_color']) : ''; update_term_meta($term_id, 'mec_cat_color', $color); $fallback = isset($_POST['fallback']) ? sanitize_text_field($_POST['fallback']) : ''; update_term_meta($term_id, 'mec_cat_fallback_image', $fallback); } public function register_endpoints() { add_rewrite_endpoint('verify', EP_MEC_EVENTS); add_rewrite_endpoint('cancel', EP_MEC_EVENTS); add_rewrite_endpoint('gateway-cancel', EP_MEC_EVENTS); add_rewrite_endpoint('gateway-return', EP_MEC_EVENTS); } /** * Remove normal meta boxes for some taxonomies * * @author Webnus */ public function remove_taxonomies_metaboxes() { remove_meta_box('tagsdiv-mec_location', $this->PT, 'side'); remove_meta_box('tagsdiv-mec_organizer', $this->PT, 'side'); remove_meta_box('tagsdiv-mec_label', $this->PT, 'side'); } /** * Registers 2 meta boxes for event data * * @author Webnus */ public function register_meta_boxes() { // Event Details add_meta_box('mec_metabox_details', esc_html__('Event Details', 'modern-events-calendar-lite'), array($this, 'meta_box_details'), $this->main->get_main_post_type(), 'normal', 'high'); // Visibility $visibility_status = !isset($this->settings['event_visibility_status']) || $this->settings['event_visibility_status']; $style_per_event = isset($this->settings['style_per_event']) && $this->settings['style_per_event']; if($visibility_status || $style_per_event) { add_meta_box('mec_metabox_visibility', esc_html__('Visibility', 'modern-events-calendar-lite'), array($this, 'meta_box_visibility'), $this->main->get_main_post_type(), 'side'); } // Gallery if(isset($this->settings['event_gallery_status']) && $this->settings['event_gallery_status']) { add_meta_box('mec_metabox_gallery', esc_html__('Gallery', 'modern-events-calendar-lite'), array($this, 'meta_box_event_gallery'), $this->main->get_main_post_type(), 'side', 'low'); } // Show Booking meta box only if booking module is enabled if($this->getPRO() and isset($this->settings['booking_status']) and $this->settings['booking_status']) { add_meta_box('mec_metabox_booking', esc_html__('Booking', 'modern-events-calendar-lite'), array($this, 'meta_box_booking'), $this->main->get_main_post_type(), 'normal', 'high'); } } /** * Show content of details meta box * * @author Webnus * @param WP_Post $post */ public function meta_box_details($post) { global $post; $note = get_post_meta($post->ID, 'mec_note', true); $note_visibility = $this->main->is_note_visible($post->post_status); $fes_guest_email = get_post_meta($post->ID, 'fes_guest_email', true); $fes_guest_name = get_post_meta($post->ID, 'fes_guest_name', true); $event_fields = $this->main->get_event_fields(); ?>
'mec_meta_box_fes_form', esc_html__('Date And Time', 'modern-events-calendar-lite') => 'mec_meta_box_date_form', esc_html__('Event Repeating', 'modern-events-calendar-lite') => 'mec_meta_box_repeat_form', esc_html__('Event Data', 'modern-events-calendar-lite') => 'mec-event-data', esc_html__('Exceptional Days', 'modern-events-calendar-lite') => 'mec-exceptional-days', esc_html__('Hourly Schedule', 'modern-events-calendar-lite') => 'mec-hourly-schedule', esc_html__('Location/Venue', 'modern-events-calendar-lite') => 'mec-location', esc_html__('Links', 'modern-events-calendar-lite') => 'mec-read-more', esc_html__('Organizer', 'modern-events-calendar-lite') => 'mec-organizer', esc_html__('Cost', 'modern-events-calendar-lite') => 'mec-cost', esc_html__('SEO Schema / Event Status', 'modern-events-calendar-lite') => 'mec-schema', esc_html__('Notifications', 'modern-events-calendar-lite') => 'mec-notifications', esc_html__('Public Download', 'modern-events-calendar-lite') => 'mec-public-download-module-file', esc_html__('Related Events', 'modern-events-calendar-lite') => 'mec-event-related-events', esc_html__('Event Banner', 'modern-events-calendar-lite') => 'mec-event-banner', ); $single_event_meta_title = apply_filters('mec-single-event-meta-title', $tabs, $activated, $post); foreach($single_event_meta_title as $link_name => $link_address) { if($link_address == 'mec_meta_box_fes_form') { if(($note_visibility and trim($note)) || (trim($fes_guest_email) and trim($fes_guest_name))) echo ''.esc_html($link_name).''; } elseif($link_address == 'mec-exceptional-days') { if(isset($this->settings['exceptional_days']) and $this->settings['exceptional_days']) echo ''.esc_html($link_name).''; } elseif($link_address == 'mec-event-data') { if(count($event_fields) and isset($this->settings['display_event_fields_backend']) and $this->settings['display_event_fields_backend'] == 1) echo ''.esc_html($link_name).''; } elseif($link_address == 'mec-notifications') { if(isset($this->settings['notif_per_event']) and $this->settings['notif_per_event']) echo ''.esc_html($link_name).''; } elseif($link_address == 'mec-public-download-module-file') { if(isset($this->settings['public_download_module']) and $this->settings['public_download_module']) echo ''.esc_html($link_name).''; } elseif($link_address == 'mec-event-related-events') { if(isset($this->settings['related_events_per_event']) and $this->settings['related_events_per_event']) echo ''.esc_html($link_name).''; } elseif($link_address == 'mec-event-banner') { if(isset($this->settings['banner_status']) && $this->settings['banner_status'] && (!isset($this->settings['banner_force_featured_image']) || !$this->settings['banner_force_featured_image'])) echo ''.esc_html($link_name).''; } elseif($link_address === 'mec-organizer') { if((!isset($this->settings['organizers_status']) || $this->settings['organizers_status'])) echo ''.esc_html($link_name).''; } else { echo ''.esc_html($link_name).''; } } ?>
settings['display_event_fields_backend']) and $this->settings['display_event_fields_backend'] == 1): ?> */ public function meta_box_visibility($post) { // Public Event $public = get_post_meta($post->ID, 'mec_public', true); if(trim($public) === '') $public = 1; $style_per_event = get_post_meta($post->ID, 'mec_style_per_event', true); if(trim($style_per_event) == '') $style_per_event = 'global'; ?>
settings['event_visibility_status']) or (isset($this->settings['event_visibility_status']) and $this->settings['event_visibility_status'])): ?>
settings['style_per_event']) and $this->settings['style_per_event']): ?>
*/ public function meta_box_gallery($post) { } /** * Add a security nonce to the Add/Edit events page * * @author Webnus */ public function meta_box_nonce() { // Add a nonce field, so we can check for it later. wp_nonce_field('mec_event_data', 'mec_event_nonce'); } /** * Show date options of event into the Add/Edit event page * * @author Webnus * @param WP_Post $post */ public function meta_box_dates($post) { global $post; $allday = get_post_meta($post->ID, 'mec_allday', true); $one_occurrence = get_post_meta($post->ID, 'one_occurrence', true); $comment = get_post_meta($post->ID, 'mec_comment', true); $hide_time = get_post_meta($post->ID, 'mec_hide_time', true); $start_date = get_post_meta($post->ID, 'mec_start_date', true); $hide_end_time_global = isset($this->settings['hide_event_end_time']) && $this->settings['hide_event_end_time']; $hide_end_time = get_post_meta($post->ID, 'mec_hide_end_time', true); if($hide_end_time_global) $hide_end_time = 1; // This date format used for datepicker $datepicker_format = (isset($this->settings['datepicker_format']) and trim($this->settings['datepicker_format'])) ? $this->settings['datepicker_format'] : 'Y-m-d'; // Advanced Repeating Day $advanced_days = get_post_meta($post->ID, 'mec_advanced_days', true); $advanced_days = is_array($advanced_days) ? $advanced_days : []; $advanced_str = count($advanced_days) ? implode('-', $advanced_days) : ''; $start_time_hour = get_post_meta($post->ID, 'mec_start_time_hour', true); if(trim($start_time_hour) == '') $start_time_hour = 8; $start_time_minutes = get_post_meta($post->ID, 'mec_start_time_minutes', true); if(trim($start_time_minutes) == '') $start_time_minutes = 0; $start_time_ampm = get_post_meta($post->ID, 'mec_start_time_ampm', true); if(trim($start_time_ampm) == '') $start_time_ampm = 'AM'; $end_date = get_post_meta($post->ID, 'mec_end_date', true); $end_time_hour = get_post_meta($post->ID, 'mec_end_time_hour', true); if(trim($end_time_hour) == '') $end_time_hour = 6; $end_time_minutes = get_post_meta($post->ID, 'mec_end_time_minutes', true); if(trim($end_time_minutes) == '') $end_time_minutes = 0; $end_time_ampm = get_post_meta($post->ID, 'mec_end_time_ampm', true); if(trim($end_time_ampm) == '') $end_time_ampm = 'PM'; $repeat_status = get_post_meta($post->ID, 'mec_repeat_status', true); $repeat_type = get_post_meta($post->ID, 'mec_repeat_type', true); if(trim($repeat_type) == '') $repeat_type = 'daily'; $repeat_interval = get_post_meta($post->ID, 'mec_repeat_interval', true); if(trim($repeat_interval) == '' and in_array($repeat_type, array('daily', 'weekly'))) $repeat_interval = 1; $certain_weekdays = get_post_meta($post->ID, 'mec_certain_weekdays', true); if($repeat_type != 'certain_weekdays') $certain_weekdays = []; $in_days_str = get_post_meta($post->ID, 'mec_in_days', true); $in_days = trim($in_days_str) ? explode(',', $in_days_str) : []; $mec_repeat_end = get_post_meta($post->ID, 'mec_repeat_end', true); if(trim($mec_repeat_end) == '') $mec_repeat_end = 'never'; $repeat_end_at_occurrences = get_post_meta($post->ID, 'mec_repeat_end_at_occurrences', true); if(trim($repeat_end_at_occurrences) == '') $repeat_end_at_occurrences = 9; $repeat_end_at_date = get_post_meta($post->ID, 'mec_repeat_end_at_date', true); $note = get_post_meta($post->ID, 'mec_note', true); $note_visibility = $this->main->is_note_visible($post->post_status); $fes_guest_email = get_post_meta($post->ID, 'fes_guest_email', true); $fes_guest_name = get_post_meta($post->ID, 'fes_guest_name', true); $imported_from_google = get_post_meta($post->ID, 'mec_imported_from_google', true); $event_timezone = get_post_meta($post->ID, 'mec_timezone', true); if(trim($event_timezone) == '') $event_timezone = 'global'; $countdown_method = get_post_meta($post->ID, 'mec_countdown_method', true); if(trim($countdown_method) == '') $countdown_method = 'global'; ?>

:

:

main->timepicker(array( 'method' => $this->settings['time_format'] ?? 12, 'time_hour' => $start_time_hour, 'time_minutes' => $start_time_minutes, 'time_ampm' => $start_time_ampm, 'name' => 'mec[date][start]', 'id_key' => 'start_', 'include_h0' => true, )); ?>
main->timepicker(array( 'method' => $this->settings['time_format'] ?? 12, 'time_hour' => $end_time_hour, 'time_minutes' => $end_time_minutes, 'time_ampm' => $end_time_ampm, 'name' => 'mec[date][end]', 'id_key' => 'end_', )); ?>
ID); ?>

settings['countdown_status']) and $this->settings['countdown_status'] and isset($this->settings['countdown_method_per_event']) and $this->settings['countdown_method_per_event']): ?>

settings['tz_per_event']) and $this->settings['tz_per_event']): ?>

main->get_weekday_i18n_labels(); foreach($weekdays as $weekday): ?>
main->timepicker(array( 'method' => (isset($this->settings['time_format']) ? $this->settings['time_format'] : 12), 'time_hour' => $start_time_hour, 'time_minutes' => $start_time_minutes, 'time_ampm' => $start_time_ampm, 'name' => 'mec[exceptionsdays][start]', 'id_key' => 'exceptions_in_days_start_', 'include_h0' => true, )); ?>

main->timepicker(array( 'method' => ($this->settings['time_format'] ?? 12), 'time_hour' => $end_time_hour, 'time_minutes' => $end_time_minutes, 'time_ampm' => $end_time_ampm, 'name' => 'mec[exceptionsdays][end]', 'id_key' => 'exceptions_in_days_end_', )); ?>
main->standardize_format($in_day[0], $datepicker_format); $second_date = $this->main->standardize_format($in_day[1], $datepicker_format); $in_day_start_time = ''; $in_day_start_time_label = ''; $in_day_end_time = ''; $in_day_end_time_label = ''; if(isset($in_day[2]) and isset($in_day[3])) { $in_day_start_time = $in_day[2]; $in_day_end_time = $in_day[3]; // 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) { $in_day_ex_start = explode('-', $in_day_start_time); $in_day_ex_end = explode('-', $in_day_end_time); $in_day_start_time_label = $this->main->to_24hours($in_day_ex_start[0], $in_day_ex_start[2]).':'.$in_day_ex_start[1]; $in_day_end_time_label = $this->main->to_24hours($in_day_ex_end[0], $in_day_ex_end[2]).':'.$in_day_ex_end[1]; } else { $pos = strpos($in_day_start_time, '-'); if($pos !== false) $in_day_start_time_label = substr_replace($in_day_start_time, ':', $pos, 1); $pos = strpos($in_day_end_time, '-'); if($pos !== false) $in_day_end_time_label = substr_replace($in_day_end_time, ':', $pos, 1); $in_day_start_time_label = str_replace('-', ' ', $in_day_start_time_label); $in_day_end_time_label = str_replace('-', ' ', $in_day_end_time_label); } } $in_day = $first_date . ':' . $second_date.(trim($in_day_start_time) ? ':'.$in_day_start_time : '').(trim($in_day_end_time) ? ':'.$in_day_end_time : ''); $in_day_label = $first_date. (trim($in_day_start_time_label) ? ' '.esc_html($in_day_start_time_label).'' : '') . ' - ' . $second_date. (trim($in_day_end_time_label) ? ' '.esc_html($in_day_end_time_label).'' : ''); ?>
x
:label: x
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
    • "> .1-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
    • "> .1-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
    • "> .1-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
    • "> .1-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
    • "> .1-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
    • "> .1-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
    • "> .1-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
    • "> .2-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
    • "> .2-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
    • "> .2-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
    • "> .2-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
    • "> .2-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
    • "> .2-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
    • "> .2-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
    • "> .3-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
    • "> .3-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
    • "> .3-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
    • "> .3-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
    • "> .3-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
    • "> .3-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
    • "> .3-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
    • "> .4-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
    • "> .4-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
    • "> .4-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
    • "> .4-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
    • "> .4-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
    • "> .4-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
    • "> .4-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
    • "> .l-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
    • "> .l-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
    • "> .l-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
    • "> .l-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
    • "> .l-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
    • "> .l-
    • main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
    • "> .l-

* @param WP_Post $post */ public function meta_box_cost($post) { $cost = get_post_meta($post->ID, 'mec_cost', true); $cost_auto_calculate = get_post_meta($post->ID, 'mec_cost_auto_calculate', true); $currency = get_post_meta($post->ID, 'mec_currency', true); if(!is_array($currency)) $currency = []; $type = ((isset($this->settings['single_cost_type']) and trim($this->settings['single_cost_type'])) ? $this->settings['single_cost_type'] : 'numeric'); $currency_per_event = ((isset($this->settings['currency_per_event']) and trim($this->settings['currency_per_event'])) ? $this->settings['currency_per_event'] : 0); $currencies = $this->main->get_currencies(); $current_currency = ($currency['currency'] ?? ($this->settings['currency'] ?? 'USD')); ?>

main->m('event_cost', esc_html__('Event Cost', 'modern-events-calendar-lite'))); ?>

class="mec-col-3" name="mec[cost]" id="mec_cost" value="" title="" placeholder=""/>
getPRO()): ?>

* @param WP_Post $post */ public function meta_box_exceptional_days($post) { $not_in_days_str = get_post_meta($post->ID, 'mec_not_in_days', true); $not_in_days = trim($not_in_days_str) ? explode(',', $not_in_days_str) : []; ?>

getFormBuilder(); $builder->exceptionalDays([ 'values' => $not_in_days ]); ?>
* @param WP_Post $post */ public function meta_box_hourly_schedule($post) { FormBuilder::hourly_schedule( $post ); } /** * Display Related Events in the Add/Edit event page * * @author Webnus * @param WP_Post $post */ public function meta_box_related_events($post) { FormBuilder::related_events($post); } /** * Display Event Banner in the Add/Edit event page * * @author Webnus * @param WP_Post $post */ public function meta_box_banner($post) { FormBuilder::banner($post); } /** * Display Event Gallery form in the Add/Edit event page * * @author Webnus * @param WP_Post $post */ public function meta_box_event_gallery($post) { $gallery = get_post_meta($post->ID, 'mec_event_gallery', true); if(!is_array($gallery)) $gallery = []; ?> * @param WP_Post $post */ public function meta_box_links($post) { $read_more = get_post_meta($post->ID, 'mec_read_more', true); $more_info = get_post_meta($post->ID, 'mec_more_info', true); $more_info_title = get_post_meta($post->ID, 'mec_more_info_title', true); $more_info_target = get_post_meta($post->ID, 'mec_more_info_target', true); $trailer_url_status = isset($this->settings['trailer_url_status']) && $this->settings['trailer_url_status']; $trailer_url = get_post_meta($post->ID, 'mec_trailer_url', true); $trailer_title = get_post_meta($post->ID, 'mec_trailer_title', true); ?> * @param WP_Post $post */ public function meta_box_booking($post) { $gateway_settings = $this->main->get_gateways_options(); ?>
settings['taxes_fees_status']) and $this->settings['taxes_fees_status']): ?> settings['ticket_variations_status']) and $this->settings['ticket_variations_status']): ?> settings['downloadable_file_status']) and $this->settings['downloadable_file_status']): ?>
* @param WP_Post $post */ public function meta_box_booking_options($post) { $FES = !is_admin(); $booking_options = get_post_meta($post->ID, 'mec_booking', true); if(!is_array($booking_options)) $booking_options = []; $fes_booking_tbl = (!isset($this->settings['fes_section_booking_tbl']) or (isset($this->settings['fes_section_booking_tbl']) and $this->settings['fes_section_booking_tbl'])); $fes_booking_dspe = (!isset($this->settings['fes_section_booking_dspe']) or (isset($this->settings['fes_section_booking_dspe']) and $this->settings['fes_section_booking_dspe'])); $fes_booking_mtpb = (!isset($this->settings['fes_section_booking_mtpb']) or (isset($this->settings['fes_section_booking_mtpb']) and $this->settings['fes_section_booking_mtpb'])); $fes_booking_dpur = (!isset($this->settings['fes_section_booking_dpur']) or (isset($this->settings['fes_section_booking_dpur']) and $this->settings['fes_section_booking_dpur'])); $fes_booking_bao = (!isset($this->settings['fes_section_booking_bao']) or (isset($this->settings['fes_section_booking_bao']) and $this->settings['fes_section_booking_bao'])); $fes_booking_io = (!isset($this->settings['fes_section_booking_io']) or (isset($this->settings['fes_section_booking_io']) and $this->settings['fes_section_booking_io'])); $fes_booking_aa = (!isset($this->settings['fes_section_booking_aa']) or (isset($this->settings['fes_section_booking_aa']) and $this->settings['fes_section_booking_aa'])); $fes_booking_lftp = (!isset($this->settings['fes_section_booking_lftp']) or (isset($this->settings['fes_section_booking_lftp']) and $this->settings['fes_section_booking_lftp'])); $fes_booking_typ = (!isset($this->settings['fes_section_booking_typ']) or (isset($this->settings['fes_section_booking_typ']) and $this->settings['fes_section_booking_typ'])); $fes_booking_bbl = (!isset($this->settings['fes_section_booking_bbl']) or (isset($this->settings['fes_section_booking_bbl']) and $this->settings['fes_section_booking_bbl'])); $fes_booking_tubl = (!isset($this->settings['fes_section_booking_tubl']) or (isset($this->settings['fes_section_booking_tubl']) and $this->settings['fes_section_booking_tubl'])); $dpur_status = (!isset($this->settings['discount_per_user_role_status']) or (isset($this->settings['discount_per_user_role_status']) and $this->settings['discount_per_user_role_status'])); $partial_payment = $this->getPartialPayment(); $fes_booking_pp = $partial_payment->is_fes_pp_section_enabled(); ?>
settings['booking_date_selection_per_event']) and $this->settings['booking_date_selection_per_event'] and (!$FES or ($FES and $fes_booking_dspe))){ FormBuilder::booking_date_selection( $post ); } if($dpur_status and (!$FES or ($FES and $fes_booking_dpur))){ FormBuilder::discount_per_user_roles( $post ); } if(!$FES or ($FES and $fes_booking_bao)){ FormBuilder::book_all_occurrences( $post ); } if(!$FES or ($FES and $fes_booking_io)){ FormBuilder::interval_options( $post ); } if(!$FES or ($FES and $fes_booking_aa)){ FormBuilder::automatic_approval( $post ); } if((isset($this->settings['last_few_tickets_percentage_per_event']) && $this->settings['last_few_tickets_percentage_per_event']) or ($FES and $fes_booking_lftp)){ FormBuilder::last_few_tickets_percentage( $post ); } if((isset($this->settings['thankyou_page_per_event']) && $this->settings['thankyou_page_per_event']) && (!$FES || $fes_booking_typ)){ FormBuilder::thankyou_page( $post ); } if(!$FES or ($FES and $fes_booking_bbl)){ FormBuilder::booking_button_label( $post ); } if(!$FES or ($FES and $fes_booking_pp)){ FormBuilder::booking_partial_payment( $post ); } if(!$FES or ($FES and $fes_booking_tubl)){ FormBuilder::total_user_booking_limits( $post ); } ?>
* @param WP_Post $post */ public function meta_box_tickets($post){ FormBuilder::tickets( $post ); } /** * Show fees of event into the Add/Edit event page * * @author Webnus * @param WP_Post $post */ public function meta_box_fees($post){ FormBuilder::fees( $post ); } /** * Show ticket variations into the Add/Edit event page * * @author Webnus * @param WP_Post $post */ public function meta_box_ticket_variations($post){ FormBuilder::ticket_variations( $post ); } /** * Show registration form of event into the Add/Edit event page * * @author Webnus * @param WP_Post $post */ public function meta_box_regform($post){ FormBuilder::booking_form( $post ); } /** * Show attendees of event into the Add/Edit event page * * @author Webnus * @param WP_Post $post */ public function meta_box_attendees($post){ FormBuilder::attendees( $post ); } /** * Save event data * * @author Webnus * @param int $post_id * @return void */ public function save_event($post_id) { // Check if our nonce is set. if(!isset($_POST['mec_event_nonce'])) return; // It's from FES if(isset($_POST['action']) and sanitize_text_field($_POST['action']) === 'mec_fes_form') return; // Verify that the nonce is valid. if(!wp_verify_nonce(sanitize_text_field($_POST['mec_event_nonce']), 'mec_event_data')) return; // If this is an autosave, our form has not been submitted, so we don't want to do anything. if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return; // Get Modern Events Calendar Data $_mec = isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []; $start_date = (isset($_mec['date']['start']['date']) and trim($_mec['date']['start']['date'])) ? $this->main->standardize_format(sanitize_text_field($_mec['date']['start']['date'])) : date('Y-m-d'); $end_date = (isset($_mec['date']['end']['date']) and trim($_mec['date']['end']['date'])) ? $this->main->standardize_format(sanitize_text_field($_mec['date']['end']['date'])) : date('Y-m-d'); // Remove Cached Data wp_cache_delete($post_id, 'mec-events-data'); $location_id = isset($_mec['location_id']) ? sanitize_text_field($_mec['location_id']) : 0; $dont_show_map = isset($_mec['dont_show_map']) ? sanitize_text_field($_mec['dont_show_map']) : 0; $organizer_id = isset($_mec['organizer_id']) ? sanitize_text_field($_mec['organizer_id']) : 0; $read_more = isset($_mec['read_more']) ? sanitize_url($_mec['read_more']) : ''; $more_info = (isset($_mec['more_info']) and trim($_mec['more_info'])) ? sanitize_url($_mec['more_info']) : ''; $more_info_title = isset($_mec['more_info_title']) ? sanitize_text_field($_mec['more_info_title']) : ''; $more_info_target = isset($_mec['more_info_target']) ? sanitize_text_field($_mec['more_info_target']) : ''; $cost = isset($_mec['cost']) ? sanitize_text_field($_mec['cost']) : ''; $cost = apply_filters( 'mec_event_cost_sanitize', sanitize_text_field($cost), $cost ); $cost_auto_calculate = (isset($_mec['cost_auto_calculate']) ? sanitize_text_field($_mec['cost_auto_calculate']) : 0); $currency_options = ((isset($_mec['currency']) and is_array($_mec['currency'])) ? $_mec['currency'] : array()); update_post_meta($post_id, 'mec_location_id', $location_id); update_post_meta($post_id, 'mec_dont_show_map', $dont_show_map); update_post_meta($post_id, 'mec_organizer_id', $organizer_id); update_post_meta($post_id, 'mec_read_more', $read_more); update_post_meta($post_id, 'mec_more_info', $more_info); update_post_meta($post_id, 'mec_more_info_title', $more_info_title); update_post_meta($post_id, 'mec_more_info_target', $more_info_target); update_post_meta($post_id, 'mec_cost', $cost); update_post_meta($post_id, 'mec_cost_auto_calculate', $cost_auto_calculate); update_post_meta($post_id, 'mec_currency', $currency_options); do_action('update_custom_dev_post_meta', $_mec, $post_id); // Additional Organizers $additional_organizer_ids = $_mec['additional_organizer_ids'] ?? []; foreach($additional_organizer_ids as $additional_organizer_id) wp_set_object_terms($post_id, (int) $additional_organizer_id, 'mec_organizer', true); update_post_meta($post_id, 'mec_additional_organizer_ids', $additional_organizer_ids); // Additional locations $additional_location_ids = $_mec['additional_location_ids'] ?? []; foreach($additional_location_ids as $additional_location_id) wp_set_object_terms($post_id, (int) $additional_location_id, 'mec_location', true); update_post_meta($post_id, 'mec_additional_location_ids', $additional_location_ids); // Date Options $date = $_mec['date'] ?? []; $start_date = date('Y-m-d', strtotime($start_date)); // Fix Date End & Event Finish if(isset($date['repeat']['status']) && $date['repeat']['status']) { $days_diff = $this->main->get_days_diff($start_date, $end_date); // Daily if(isset($date['repeat']['type']) && $date['repeat']['type'] === 'daily' && $days_diff >= 5) { $date['repeat']['end'] = 'date'; $date['repeat']['end_at_date'] = $end_date; $end_date = $start_date; } // Weekly else if(isset($date['repeat']['type']) && $date['repeat']['type'] === 'weekly' && $days_diff >= 15) { $date['repeat']['end'] = 'date'; $date['repeat']['end_at_date'] = $end_date; $end_date = $start_date; } } // 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'; $end_date = date('Y-m-d', strtotime($end_date)); // 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'; } if($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'; } if($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; $one_occurrence = isset($date['one_occurrence']) ? 1 : 0; $hide_time = isset($date['hide_time']) ? 1 : 0; $hide_end_time = isset($date['hide_end_time']) ? 1 : 0; $comment = isset($date['comment']) ? sanitize_text_field($date['comment']) : ''; $timezone = (isset($_mec['timezone']) and trim($_mec['timezone']) != '') ? sanitize_text_field($_mec['timezone']) : 'global'; $countdown_method = (isset($_mec['countdown_method']) and trim($_mec['countdown_method']) != '') ? sanitize_text_field($_mec['countdown_method']) : 'global'; $style_per_event = (isset($_mec['style_per_event']) and trim($_mec['style_per_event']) != '') ? sanitize_text_field($_mec['style_per_event']) : 'global'; $trailer_url = (isset($_mec['trailer_url']) and trim($_mec['trailer_url']) != '') ? sanitize_url($_mec['trailer_url']) : ''; $trailer_title = isset($_mec['trailer_title']) ? sanitize_text_field($_mec['trailer_title']) : ''; $public = (isset($_mec['public']) and trim($_mec['public']) != '') ? sanitize_text_field($_mec['public']) : 1; // 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'; } // Repeat Options $repeat = $date['repeat'] ?? []; $certain_weekdays = $repeat['certain_weekdays'] ?? []; $repeat_status = isset($repeat['status']) ? 1 : 0; $repeat_type = ($repeat_status and isset($repeat['type'])) ? $repeat['type'] : ''; // Unset Repeat if no days are selected if($repeat_type == 'certain_weekdays' && (!is_array($certain_weekdays) || !count($certain_weekdays))) { $repeat_status = 0; $repeat['status'] = 0; $repeat['type'] = ''; } $repeat_interval = ($repeat_status and isset($repeat['interval']) and trim($repeat['interval'])) ? $repeat['interval'] : 1; // Advanced Repeat $advanced = isset($repeat['advanced']) ? sanitize_text_field($repeat['advanced']) : ''; if(!is_numeric($repeat_interval)) $repeat_interval = null; if($repeat_type == 'weekly') $interval_multiply = 7; else $interval_multiply = 1; // Reset certain weekdays if repeat type is not set to certain weekdays if($repeat_type != 'certain_weekdays') $certain_weekdays = []; if(!is_null($repeat_interval)) $repeat_interval = $repeat_interval * $interval_multiply; // String To Array if($repeat_type == 'advanced' and trim($advanced)) $advanced = explode('-', $advanced); else $advanced = []; $repeat_end = ($repeat_status and isset($repeat['end'])) ? $repeat['end'] : ''; $repeat_end_at_occurrences = ($repeat_status && isset($repeat['end_at_occurrences']) && is_numeric($repeat['end_at_occurrences'])) ? $repeat['end_at_occurrences'] - 1 : 9; $repeat_end_at_date = ($repeat_status and isset($repeat['end_at_date'])) ? $this->main->standardize_format( $repeat['end_at_date'] ) : ''; // Previous Date Times $prev_start_datetime = get_post_meta($post_id, 'mec_start_datetime', true); $prev_end_datetime = get_post_meta($post_id, 'mec_end_datetime', true); $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_date', $date); update_post_meta($post_id, 'mec_repeat', $repeat); update_post_meta($post_id, 'mec_certain_weekdays', $certain_weekdays); update_post_meta($post_id, 'mec_allday', $allday); update_post_meta($post_id, 'one_occurrence', $one_occurrence); update_post_meta($post_id, 'mec_hide_time', $hide_time); update_post_meta($post_id, 'mec_hide_end_time', $hide_end_time); update_post_meta($post_id, 'mec_comment', $comment); update_post_meta($post_id, 'mec_timezone', $timezone); update_post_meta($post_id, 'mec_countdown_method', $countdown_method); update_post_meta($post_id, 'mec_style_per_event', $style_per_event); update_post_meta($post_id, 'mec_trailer_url', $trailer_url); update_post_meta($post_id, 'mec_trailer_title', $trailer_title); update_post_meta($post_id, 'mec_public', $public); do_action('update_custom_post_meta', $date, $post_id); 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); update_post_meta($post_id, 'mec_repeat_status', $repeat_status); update_post_meta($post_id, 'mec_repeat_type', $repeat_type); update_post_meta($post_id, 'mec_repeat_interval', $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', $advanced); // Event Sequence (Used in iCal feed) $sequence = (int) get_post_meta($post_id, 'mec_sequence', true); update_post_meta($post_id, 'mec_sequence', ($sequence + 1)); // For Event Notification Badge. if(!current_user_can('administrator')) update_post_meta($post_id, 'mec_event_date_submit', date('YmdHis', current_time('timestamp', 0))); // Creating $event array for inserting in mec_events table $event = array( 'post_id' => $post_id, 'start' => $start_date, 'repeat' => $repeat_status, 'rinterval' => (!in_array($repeat_type, array('daily', 'weekly', 'monthly')) ? null : $repeat_interval), 'time_start' => $day_start_seconds, 'time_end' => $day_end_seconds, ); $year = null; $month = null; $day = null; $week = null; $weekday = null; $weekdays = null; // MEC weekdays $mec_weekdays = $this->main->get_weekdays(); // MEC weekends $mec_weekends = $this->main->get_weekends(); $plus_date = ''; if($repeat_type == 'daily') { $plus_date = '+' . $repeat_end_at_occurrences * $repeat_interval . ' Days'; } elseif($repeat_type == 'weekly') { $plus_date = '+' . $repeat_end_at_occurrences * ($repeat_interval) . ' Days'; } elseif($repeat_type == 'weekday') { $repeat_interval = 1; $plus_date = '+' . $repeat_end_at_occurrences * $repeat_interval . ' Weekdays'; $weekdays = ',' . implode(',', $mec_weekdays) . ','; } elseif($repeat_type == 'weekend') { $repeat_interval = 1; $plus_date = '+' . round($repeat_end_at_occurrences / 2) * ($repeat_interval * 7) . ' Days'; $weekdays = ',' . implode(',', $mec_weekends) . ','; } elseif($repeat_type == 'certain_weekdays') { $repeat_interval = 1; $plus_date = '+' . ceil(($repeat_end_at_occurrences * $repeat_interval) * (7 / count($certain_weekdays))) . ' days'; $weekdays = ',' . implode(',', $certain_weekdays) . ','; } elseif($repeat_type == 'monthly') { $plus_date = '+' . $repeat_end_at_occurrences * $repeat_interval . ' Months'; $year = '*'; $month = '*'; $s = $start_date; $e = $end_date; $_days = []; while(strtotime($s) <= strtotime($e)) { $_days[] = date('d', strtotime($s)); $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); } $day = ',' . implode(',', array_unique($_days)) . ','; $week = '*'; $weekday = '*'; } elseif($repeat_type == 'yearly') { $plus_date = '+' . $repeat_end_at_occurrences * $repeat_interval . ' Years'; $year = '*'; $s = $start_date; $e = $end_date; $_months = []; $_days = []; while(strtotime($s) <= strtotime($e)) { $_months[] = date('m', strtotime($s)); $_days[] = date('d', strtotime($s)); $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); } $_months = array_unique($_months); $month = ',' . implode(',', array($_months[0])) . ','; $day = ',' . implode(',', array_unique($_days)) . ','; $week = '*'; $weekday = '*'; } elseif($repeat_type == "advanced") { // Render class object $this->render = $this->getRender(); // Get finish date $event_info = array('start' => $date['start'], 'end' => $date['end']); $dates = $this->render->generate_advanced_days($advanced, $event_info, $repeat_end_at_occurrences, $start_date, 'events'); $period_date = $this->main->date_diff($start_date, end($dates)['end']['date']); $plus_date = '+' . $period_date->days . ' Days'; } $in_days_arr = (isset($_mec['in_days']) and is_array($_mec['in_days']) and count($_mec['in_days'])) ? array_unique($_mec['in_days']) : []; $not_in_days_arr = (isset($_mec['not_in_days']) and is_array($_mec['not_in_days']) and count($_mec['not_in_days'])) ? array_unique($_mec['not_in_days']) : []; $in_days = ''; if(count($in_days_arr)) { if(isset($in_days_arr[':i:'])) unset($in_days_arr[':i:']); $in_days_arr = array_map(function($value) { $ex = explode(':', $value); $in_days_times = ''; if(isset($ex[2]) and isset($ex[3])) { $in_days_start_time = $ex[2]; $in_days_end_time = $ex[3]; // 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) { $ex_start_time = explode('-', $in_days_start_time); $ex_end_time = explode('-', $in_days_end_time); $in_days_start_hour = $ex_start_time[0]; $in_days_start_minutes = $ex_start_time[1]; $in_days_start_ampm = $ex_start_time[2]; $in_days_end_hour = $ex_end_time[0]; $in_days_end_minutes = $ex_end_time[1]; $in_days_end_ampm = $ex_end_time[2]; if(trim($in_days_start_ampm) == '') { if($in_days_start_hour < 12) $in_days_start_ampm = 'AM'; elseif($in_days_start_hour == 12) $in_days_start_ampm = 'PM'; elseif($in_days_start_hour > 12) { $in_days_start_hour -= 12; $in_days_start_ampm = 'PM'; } elseif($in_days_start_hour == 0) { $in_days_start_hour = 12; $in_days_start_ampm = 'AM'; } } if(trim($in_days_end_ampm) == '') { if($in_days_end_hour < 12) $in_days_end_ampm = 'AM'; elseif($in_days_end_hour == 12) $in_days_end_ampm = 'PM'; elseif($in_days_end_hour > 12) { $in_days_end_hour -= 12; $in_days_end_ampm = 'PM'; } elseif($in_days_end_hour == 0) { $in_days_end_hour = 12; $in_days_end_ampm = 'AM'; } } if(strlen($in_days_start_hour) == 1) $in_days_start_hour = '0'.$in_days_start_hour; if(strlen($in_days_start_minutes) == 1) $in_days_start_minutes = '0'.$in_days_start_minutes; if(strlen($in_days_end_hour) == 1) $in_days_end_hour = '0'.$in_days_end_hour; if(strlen($in_days_end_minutes) == 1) $in_days_end_minutes = '0'.$in_days_end_minutes; $in_days_start_time = $in_days_start_hour.'-'.$in_days_start_minutes.'-'.$in_days_start_ampm; $in_days_end_time = $in_days_end_hour.'-'.$in_days_end_minutes.'-'.$in_days_end_ampm; } $in_days_times = ':'.$in_days_start_time.':'.$in_days_end_time; } return $this->main->standardize_format($ex[0]) . ':' . $this->main->standardize_format($ex[1]).$in_days_times; }, $in_days_arr); usort($in_days_arr, function($a, $b) { $ex_a = explode(':', $a); $ex_b = explode(':', $b); $date_a = $ex_a[0]; $date_b = $ex_b[0]; $in_day_a_time_label = ''; if(isset($ex_a[2])) { $in_day_a_time = $ex_a[2]; $pos = strpos($in_day_a_time, '-'); if($pos !== false) $in_day_a_time_label = substr_replace($in_day_a_time, ':', $pos, 1); $in_day_a_time_label = str_replace('-', ' ', $in_day_a_time_label); } $in_day_b_time_label = ''; if(isset($ex_b[2])) { $in_day_b_time = $ex_b[2]; $pos = strpos($in_day_b_time, '-'); if($pos !== false) $in_day_b_time_label = substr_replace($in_day_b_time, ':', $pos, 1); $in_day_b_time_label = str_replace('-', ' ', $in_day_b_time_label); } return strtotime(trim($date_a.' '.$in_day_a_time_label)) - strtotime(trim($date_b.' '.$in_day_b_time_label)); }); if(!isset($in_days_arr[':i:'])) $in_days_arr[':i:'] = ':val:'; foreach($in_days_arr as $key => $in_day_arr) { if(is_numeric($key)) $in_days .= $in_day_arr . ','; } } $not_in_days = ''; if(count($not_in_days_arr)) { foreach($not_in_days_arr as $key => $not_in_day_arr) { if(is_numeric($key)) $not_in_days .= $this->main->standardize_format( $not_in_day_arr ) . ','; } } $in_days = trim($in_days, ', '); $not_in_days = trim($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 if($repeat_end == 'date') $repeat_end_date = $repeat_end_at_date; elseif($repeat_end == 'occurrences') { if($plus_date) $repeat_end_date = date('Y-m-d', strtotime($plus_date, strtotime($end_date))); else $repeat_end_date = '0000-00-00'; } else $repeat_end_date = '0000-00-00'; // If event is not repeating then set the end date of event correctly if(!$repeat_status or $repeat_type == 'custom_days') $repeat_end_date = $end_date; // 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; // Update MEC Events Table $mec_event_id = $this->db->select("SELECT `id` FROM `#__mec_events` WHERE `post_id`='$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',"; } $this->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',"; } $this->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 $raw_hourly_schedules = $_mec['hourly_schedules'] ?? []; unset($raw_hourly_schedules[':d:']); $hourly_schedules = []; foreach($raw_hourly_schedules as $raw_hourly_schedule) { if(isset($raw_hourly_schedule['schedules'][':i:'])) unset($raw_hourly_schedule['schedules'][':i:']); $hourly_schedules[] = $raw_hourly_schedule; } update_post_meta($post_id, 'mec_hourly_schedules', $hourly_schedules); // Booking and Ticket Options $booking = $_mec['booking'] ?? []; update_post_meta($post_id, 'mec_booking', $booking); $tickets = $_mec['tickets'] ?? []; if(isset($tickets[':i:'])) unset($tickets[':i:']); // Unset Ticket Dats if(count($tickets)) { $new_tickets = []; foreach($tickets as $key => $ticket) { unset($ticket['dates'][':j:']); $ticket_start_time_ampm = ((isset($ticket['ticket_start_time_hour']) and (intval($ticket['ticket_start_time_hour']) > 0 and intval($ticket['ticket_start_time_hour']) < 13) and isset($ticket['ticket_start_time_ampm'])) ? $ticket['ticket_start_time_ampm'] : ''); $ticket_render_start_time = ((isset($ticket['ticket_start_time_hour']) and $ticket['ticket_start_time_hour']) ? date('h:ia', strtotime(sprintf('%02d', $ticket['ticket_start_time_hour']) . ':' . sprintf('%02d', $ticket['ticket_start_time_minute']) . $ticket_start_time_ampm)) : ''); $ticket_end_time_ampm = ((isset($ticket['ticket_end_time_hour']) and (intval($ticket['ticket_end_time_hour']) > 0 and intval($ticket['ticket_end_time_hour']) < 13) and isset($ticket['ticket_end_time_ampm'])) ? $ticket['ticket_end_time_ampm'] : ''); $ticket_render_end_time = ((isset($ticket['ticket_end_time_hour']) and $ticket['ticket_end_time_hour']) ? date('h:ia', strtotime(sprintf('%02d', $ticket['ticket_end_time_hour']) . ':' . sprintf('%02d', $ticket['ticket_end_time_minute']) . $ticket_end_time_ampm)) : ''); $ticket['ticket_start_time_hour'] = substr($ticket_render_start_time, 0, 2); $ticket['ticket_start_time_ampm'] = strtoupper(substr($ticket_render_start_time, 5, 6)); $ticket['ticket_end_time_hour'] = substr($ticket_render_end_time, 0, 2); $ticket['ticket_end_time_ampm'] = strtoupper(substr($ticket_render_end_time, 5, 6)); $ticket['price'] = trim($ticket['price']); $ticket['limit'] = trim($ticket['limit']); $ticket['minimum_ticket'] = trim($ticket['minimum_ticket']); $ticket['stop_selling_value'] = trim($ticket['stop_selling_value']); $ticket['category_ids'] = !empty( $ticket['category_ids'] ) ? (array) $ticket['category_ids'] : []; // Bellow conditional block code is used to change ticket dates format to compatible ticket past dates structure for store in db. foreach($ticket['dates'] as $dates_ticket_key => $dates_ticket_values) { if(isset($dates_ticket_values['start']) and trim($dates_ticket_values['start'])) { $ticket['dates'][$dates_ticket_key]['start'] = $this->main->standardize_format($dates_ticket_values['start']); } if(isset($dates_ticket_values['end']) and trim($dates_ticket_values['end'])) { $ticket['dates'][$dates_ticket_key]['end'] = $this->main->standardize_format($dates_ticket_values['end']); } } $ticket['id'] = $key; $new_tickets[$key] = $ticket; } $tickets = $new_tickets; } update_post_meta($post_id, 'mec_tickets', $tickets); update_post_meta($post_id, 'mec_global_tickets_applied', 1); // Fee options $fees_global_inheritance = isset($_mec['fees_global_inheritance']) ? sanitize_text_field($_mec['fees_global_inheritance']) : 1; update_post_meta($post_id, 'mec_fees_global_inheritance', $fees_global_inheritance); $fees = $_mec['fees'] ?? []; if(isset($fees[':i:'])) unset($fees[':i:']); update_post_meta($post_id, 'mec_fees', $fees); // Ticket Variations options $ticket_variations_global_inheritance = isset($_mec['ticket_variations_global_inheritance']) ? sanitize_text_field($_mec['ticket_variations_global_inheritance']) : 1; update_post_meta($post_id, 'mec_ticket_variations_global_inheritance', $ticket_variations_global_inheritance); $ticket_variations = $_mec['ticket_variations'] ?? []; if(isset($ticket_variations[':i:'])) unset($ticket_variations[':i:']); update_post_meta($post_id, 'mec_ticket_variations', $ticket_variations); // Registration Fields options $reg_fields_global_inheritance = isset($_mec['reg_fields_global_inheritance']) ? sanitize_text_field($_mec['reg_fields_global_inheritance']) : 1; update_post_meta($post_id, 'mec_reg_fields_global_inheritance', $reg_fields_global_inheritance); $reg_fields = $_mec['reg_fields'] ?? []; if($reg_fields_global_inheritance) $reg_fields = []; do_action('mec_save_reg_fields', $post_id, $reg_fields); update_post_meta($post_id, 'mec_reg_fields', $reg_fields); $bfixed_fields = $_mec['bfixed_fields'] ?? []; if($reg_fields_global_inheritance) $bfixed_fields = []; do_action('mec_save_bfixed_fields', $post_id, $bfixed_fields); update_post_meta($post_id, 'mec_bfixed_fields', $bfixed_fields); // Organizer Payment Options $op = $_mec['op'] ?? []; update_post_meta($post_id, 'mec_op', $op); update_user_meta(get_post_field('post_author', $post_id), 'mec_op', $op); // MEC Fields $fields = (isset($_mec['fields']) and is_array($_mec['fields'])) ? $_mec['fields'] : []; update_post_meta($post_id, 'mec_fields', $fields); // Save fields one by one foreach($fields as $field_id=>$values) { if(is_array($values)) { $values = array_unique($values); $values = implode(',', $values); } update_post_meta($post_id, 'mec_fields_'.$field_id, sanitize_text_field($values)); } // Downloadable File if(isset($_mec['downloadable_file'])) { $dl_file = sanitize_text_field($_mec['downloadable_file']); update_post_meta($post_id, 'mec_dl_file', $dl_file); } // Public Download Module File if(isset($_mec['public_download_module_file'])) { $public_dl_file = isset($_mec['public_download_module_file']) ? sanitize_text_field($_mec['public_download_module_file']) : ''; update_post_meta($post_id, 'mec_public_dl_file', $public_dl_file); $public_dl_title = isset($_mec['public_download_module_title']) ? sanitize_text_field($_mec['public_download_module_title']) : ''; update_post_meta($post_id, 'mec_public_dl_title', $public_dl_title); $public_dl_description = isset($_mec['public_download_module_description']) ? sanitize_text_field($_mec['public_download_module_description']) : ''; update_post_meta($post_id, 'mec_public_dl_description', $public_dl_description); } // Event Gallery $gallery = (isset($_mec['event_gallery']) and is_array($_mec['event_gallery'])) ? $_mec['event_gallery'] : []; update_post_meta($post_id, 'mec_event_gallery', $gallery); // Related Events $related_events = (isset($_mec['related_events']) and is_array($_mec['related_events'])) ? $_mec['related_events'] : []; update_post_meta($post_id, 'mec_related_events', $related_events); // Event Banner $event_banner = (isset($_mec['banner']) and is_array($_mec['banner'])) ? $_mec['banner'] : []; update_post_meta($post_id, 'mec_banner', $event_banner); // Notifications if(isset($_mec['notifications'])) { $notifications = (isset($_mec['notifications']) and is_array($_mec['notifications'])) ? $_mec['notifications'] : []; update_post_meta($post_id, 'mec_notifications', $notifications); } // Event Dates Changed? if($prev_start_datetime and $prev_end_datetime and !$repeat_status and $prev_start_datetime != $start_datetime and $prev_end_datetime != $end_datetime) { $this->main->event_date_updated($post_id, $prev_start_datetime, $prev_end_datetime); } $mec_update = (isset($_REQUEST['original_publish']) and strtolower(trim(sanitize_text_field($_REQUEST['original_publish']))) == 'publish') ? false : true; do_action('mec_after_publish_admin_event', $post_id, $mec_update); // Save Event Data do_action('mec_save_event_data', $post_id, $_mec); } public function quick_edit($post_id) { // Validating And Verifying if((!isset($_POST['screen']) || trim($_POST['screen']) != 'edit-mec-events') and !check_ajax_referer('inlineeditnonce', '_inline_edit', false)) return; $mec_locations = (isset($_POST['tax_input']['mec_location']) and trim($_POST['tax_input']['mec_location'])) ? array_filter(explode(',', sanitize_text_field($_POST['tax_input']['mec_location']))) : NULL; $mec_organizers = (isset($_POST['tax_input']['mec_organizer']) and trim($_POST['tax_input']['mec_organizer'])) ? array_filter(explode(',', sanitize_text_field($_POST['tax_input']['mec_organizer']))) : NULL; // MEC Locations Quick Edit $this->mec_locations_edit($post_id, $mec_locations, 'quick_edit'); // MEC Organizers Quick Edit $this->mec_organizers_edit($post_id, $mec_organizers, 'quick_edit'); } /** * Publish an event * @author Webnus * @param string $new * @param string $old * @param WP_Post $post * @return void */ public function event_published($new, $old, $post) { if($post->post_type !== $this->PT) return; // Fires after publish an event to send notifications etc. do_action('mec_event_published', $new, $old, $post); // Update Status $this->db->q("UPDATE `#__mec_dates` SET `status`='".esc_sql($new)."' WHERE `post_id`='".esc_sql($post->ID)."'"); } /** * Remove MEC event data after deleting a post permanently * * @author Webnus * @param int $post_id * @return boolean */ public function delete_event($post_id) { $post = get_post($post_id); if($post->post_type !== $this->PT) return false; $this->db->q("DELETE FROM `#__mec_events` WHERE `post_id`='$post_id'"); $this->db->q("DELETE FROM `#__mec_dates` WHERE `post_id`='$post_id'"); $this->db->q("DELETE FROM `#__mec_occurrences` WHERE `post_id`='$post_id'"); return true; } public function add_buttons($which) { $screen = get_current_screen(); if($which === 'top' and $screen->post_type === $this->PT) { echo ''.esc_html__('Expired Events', 'modern-events-calendar-lite').''; echo ' '.esc_html__('Upcoming Events', 'modern-events-calendar-lite').''; } } /** * Add filter options in manage events page * * @author Webnus * @param string $post_type * @return void */ public function add_filters($post_type) { if($post_type != $this->PT) return; $datepicker_format = 'Y-m-d'; $start_date = isset( $_GET['mec_start_date'] ) ? $_GET['mec_start_date'] : ''; echo ''; $taxonomy = 'mec_label'; if(wp_count_terms($taxonomy)) { wp_dropdown_categories( array( 'show_option_all' => sprintf(esc_html__('Show all %s', 'modern-events-calendar-lite'), $this->main->m('taxonomy_labels', esc_html__('labels', 'modern-events-calendar-lite'))), 'taxonomy' => $taxonomy, 'name' => $taxonomy, 'value_field' => 'slug', 'orderby' => 'name', 'order' => 'ASC', 'selected' => (isset($_GET[$taxonomy]) ? sanitize_text_field($_GET[$taxonomy]) : ''), 'show_count' => false, 'hide_empty' => false, ) ); } $taxonomy = 'mec_location'; if(wp_count_terms($taxonomy)) { wp_dropdown_categories( array( 'show_option_all' => sprintf(esc_html__('Show all %s', 'modern-events-calendar-lite'), $this->main->m('taxonomy_locations', esc_html__('locations', 'modern-events-calendar-lite'))), 'taxonomy' => $taxonomy, 'name' => $taxonomy, 'value_field' => 'slug', 'orderby' => 'name', 'order' => 'ASC', 'selected' => (isset($_GET[$taxonomy]) ? sanitize_text_field($_GET[$taxonomy]) : ''), 'show_count' => false, 'hide_empty' => false, ) ); } $taxonomy = 'mec_organizer'; if(wp_count_terms($taxonomy)) { wp_dropdown_categories( array( 'show_option_all' => sprintf(esc_html__('Show all %s', 'modern-events-calendar-lite'), $this->main->m('taxonomy_organizers', esc_html__('organizers', 'modern-events-calendar-lite'))), 'taxonomy' => $taxonomy, 'name' => $taxonomy, 'value_field' => 'slug', 'orderby' => 'name', 'order' => 'ASC', 'selected' => (isset($_GET[$taxonomy]) ? sanitize_text_field($_GET[$taxonomy]) : ''), 'show_count' => false, 'hide_empty' => false, ) ); } $taxonomy = 'mec_category'; if(wp_count_terms($taxonomy)) { wp_dropdown_categories( array( 'show_option_all' => sprintf(esc_html__('Show all %s', 'modern-events-calendar-lite'), $this->main->m('taxonomy_categorys', esc_html__('Categories', 'modern-events-calendar-lite'))), 'taxonomy' => $taxonomy, 'name' => $taxonomy, 'value_field' => 'slug', 'orderby' => 'name', 'order' => 'ASC', 'selected' => (isset($_GET[$taxonomy]) ? sanitize_text_field($_GET[$taxonomy]) : ''), 'show_count' => false, 'hide_empty' => false, ) ); } // Lightbox echo '
'. esc_html__('Attendees List', 'modern-events-calendar-lite') .'
'; } /** * Filters columns of events feature * * @author Webnus * @param array $columns * @return array */ public function filter_columns($columns) { unset($columns['comments']); unset($columns['date']); unset($columns['tags']); $columns['title'] = esc_html__('Title', 'modern-events-calendar-lite'); $columns['category'] = esc_html__('Category', 'modern-events-calendar-lite'); $columns['location'] = $this->main->m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite')); $columns['organizer'] = $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')); $columns['start_date'] = esc_html__('Start Date', 'modern-events-calendar-lite'); $columns['end_date'] = esc_html__('End Date', 'modern-events-calendar-lite'); // Sold Tickets if($this->getPRO() && isset($this->settings['booking_status']) && $this->settings['booking_status']) $columns['tickets'] = esc_html__('Tickets', 'modern-events-calendar-lite'); $columns['repeat'] = esc_html__('Repeat', 'modern-events-calendar-lite'); return $columns; } /** * Filters sortable columns of events feature * * @author Webnus * @param array $columns * @return array */ public function filter_sortable_columns($columns) { $columns['start_date'] = 'start_date'; $columns['end_date'] = 'end_date'; return $columns; } /** * Filters columns content of events feature * * @author Webnus * @param string $column_name * @param int $post_id * @return string */ public function filter_columns_content($column_name, $post_id) { if($column_name == 'location') { $location = get_term(get_post_meta($post_id, 'mec_location_id', true)); echo (isset($location->name) && 'uncategorized' !== $location->slug ? esc_html($location->name) : '----'); } elseif($column_name == 'organizer') { $organizer = get_term(get_post_meta($post_id, 'mec_organizer_id', true)); echo (isset($organizer->name) && 'uncategorized' !== $organizer->slug ? esc_html($organizer->name) : '----'); } elseif($column_name == 'start_date') { $datetime_format = get_option('date_format', 'Y-n-d').' '.get_option('time_format', 'H:i'); $date = get_post_meta($post_id, 'mec_start_date', true); echo esc_html($this->main->date_i18n($datetime_format, (strtotime($date) + ((int) get_post_meta($post_id, 'mec_start_day_seconds', true))), $post_id)); } elseif($column_name == 'end_date') { $datetime_format = get_option('date_format', 'Y-n-d').' '.get_option('time_format', 'H:i'); $date = get_post_meta($post_id, 'mec_end_date', true); echo esc_html($this->main->date_i18n($datetime_format, (strtotime($date) + ((int) get_post_meta($post_id, 'mec_end_day_seconds', true))), $post_id)); } elseif($column_name == 'tickets') { $book = $this->getBook(); echo esc_html($book->get_all_sold_tickets($post_id)).' / '.$book->get_total_tickets($post_id); } elseif($column_name == 'repeat') { $repeat_type = get_post_meta($post_id, 'mec_repeat_type', true); echo esc_html(ucwords(str_replace('_', ' ', $repeat_type))); } elseif($column_name == 'category') { $post_categories = get_the_terms($post_id, 'mec_category'); if($post_categories) foreach($post_categories as $post_category) $categories[] = $post_category->name; if(!empty($categories)) { $category_name = implode(",", $categories); echo esc_html($category_name); } } } /** * Sort events if sorted by custom columns * * @author Webnus * @param object $query * @return void */ public function filter($query) { if(!is_admin() or $query->get('post_type') != $this->PT) return; $meta_query = []; $order_query = []; $orderby = $query->get('orderby'); $order = $query->get('order'); $expired = (isset($_REQUEST['mec-expired']) ? sanitize_text_field($_REQUEST['mec-expired']) : 0); if($expired) { $today = current_time('Y-m-d'); $today_seconds = $this->main->time_to_seconds(current_time('H'), current_time('i'), current_time('s')); $expired_ids = $this->db->select("SELECT post_id FROM `#__mec_events` WHERE `end` != '0000-00-00' AND `end` < '".$today."' OR (`end` = '".$today."' AND `time_end` <= '".$today_seconds."')", 'loadColumn'); $filtered_ids = []; foreach($expired_ids as $expired_id) { $custom_days = $this->db->select("SELECT days FROM `#__mec_events` WHERE `post_id` = '".esc_sql($expired_id)."'", 'loadResult'); if(!$custom_days) $filtered_ids[] = $expired_id; else { $ex = explode(',', $custom_days); $last = end($ex); $parts = explode(':', $last); $last_date = $parts[1] ?? ''; $last_time = $parts[3] ?? ''; $last_time = str_replace('-AM', ' AM', $last_time); $last_time = str_replace('-PM', ' PM', $last_time); $last_time = str_replace('-', ':', $last_time); $last_datetime = $last_date.' '.$last_time; if(trim($last_datetime) === '' || strtotime($last_datetime) < current_time('timestamp')) $filtered_ids[] = $expired_id; } } if(!count($filtered_ids)) $filtered_ids = [0]; $query->set('post__in', $filtered_ids); if(!trim($orderby)) $orderby = 'end_date'; if(!trim($order)) $order = 'asc'; } $upcoming = (isset($_REQUEST['mec-upcoming']) ? sanitize_text_field($_REQUEST['mec-upcoming']) : 0); if($upcoming) { $now = current_time('Y-m-d H:i:s'); $post_id_rows = $this->db->select("SELECT `post_id` FROM `#__mec_dates` WHERE `tstart` >= '".strtotime($now)."' GROUP BY `post_id`", 'loadObjectList'); $post_ids = []; foreach($post_id_rows as $post_id_row) $post_ids[] = $post_id_row->post_id; $post_ids = array_unique($post_ids); $query->set('post__in', $post_ids); if(!trim($orderby)) $orderby = 'start_date'; } if($orderby == 'start_date') { $meta_query['mec_start_date'] = array( 'key' => 'mec_start_date', ); $meta_query['mec_start_day_seconds'] = array( 'key' => 'mec_start_day_seconds', ); $order_query = array( 'mec_start_date' => $query->get('order'), 'mec_start_day_seconds' => $query->get('order'), ); } elseif($orderby == 'end_date') { $meta_query['mec_end_date'] = array( 'key' => 'mec_end_date', ); $meta_query['mec_end_day_seconds'] = array( 'key' => 'mec_end_day_seconds', ); $order_query = array( 'mec_end_date' => $order, 'mec_end_day_seconds' => $order, ); } $start_date = isset( $_GET['mec_start_date'] ) ? $_GET['mec_start_date'] : ''; if( !empty( $start_date ) ){ $meta_query['mec_start_date'] = array( 'key' => 'mec_start_date', 'value' => date( 'Y-m-d', strtotime( $start_date ) ), 'compare' => '=', 'type' => 'DATE' ); } if(count($meta_query)) $query->set('meta_query', $meta_query); if(count($order_query)) $query->set('orderby', $order_query); } public function add_bulk_actions() { global $post_type; if ($post_type == $this->PT) { ?> current_action(); if(!$action) return false; $post_type = isset($_GET['post_type']) ? sanitize_text_field($_GET['post_type']) : 'post'; if($post_type != $this->PT) return false; check_admin_referer('bulk-posts'); switch($action) { case 'ical-export': $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; $events = ''; foreach($post_ids as $post_id) $events .= $this->main->ical_single((int) $post_id); $ical_calendar = $this->main->ical_calendar($events); header('Content-type: application/force-download; charset=utf-8'); header('Content-Disposition: attachment; filename="mec-events-' . date('YmdTHi') . '.ics"'); echo MEC_kses::full($ical_calendar); exit; case 'ms-excel-export': $filename = 'mec-events-' . md5(time() . mt_rand(100, 999)) . '.xlsx'; $rows = $this->csvexcel(); $this->main->generate_download_excel($rows, $filename); exit; case 'csv-export': $filename = 'mec-events-' . md5(time() . mt_rand(100, 999)) . '.csv'; $rows = $this->csvexcel(); $this->main->generate_download_csv($rows, $filename); exit; case 'g-cal-csv-export': header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=mec-events-' . md5(time() . mt_rand(100, 999)) . '.csv'); $this->gcalcsv(); exit; case 'xml-export': $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; $events = []; foreach($post_ids as $post_id) $events[] = $this->main->export_single((int) $post_id); $xml_feed = $this->main->xml_convert(array('events' => $events)); header('Content-type: application/force-download; charset=utf-8'); header('Content-Disposition: attachment; filename="mec-events-' . date('YmdTHi') . '.xml"'); echo $xml_feed; exit; case 'json-export': $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; $events = []; foreach($post_ids as $post_id) $events[] = $this->main->export_single((int) $post_id); header('Content-type: application/force-download; charset=utf-8'); header('Content-Disposition: attachment; filename="mec-events-' . date('YmdTHi') . '.json"'); echo json_encode($events); exit; case 'duplicate': $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; foreach($post_ids as $post_id) $this->main->duplicate((int) $post_id); break; default: return false; } wp_redirect('edit.php?post_type=' . $this->main->get_main_post_type()); exit; } public function csvexcel($export_all = false) { // MEC Render Library $render = $this->getRender(); if($export_all) $post_ids = get_posts('post_type=mec-events&fields=ids&posts_per_page=-1'); else $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; $columns = array( esc_html__('ID', 'modern-events-calendar-lite'), esc_html__('Title', 'modern-events-calendar-lite'), esc_html__('Description', 'modern-events-calendar-lite'), esc_html__('Start Date', 'modern-events-calendar-lite'), esc_html__('Start Time', 'modern-events-calendar-lite'), esc_html__('End Date', 'modern-events-calendar-lite'), esc_html__('End Time', 'modern-events-calendar-lite'), esc_html__('Link', 'modern-events-calendar-lite'), $this->main->m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite')), esc_html__('Address', 'modern-events-calendar-lite'), $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')), sprintf(esc_html__('%s Tel', 'modern-events-calendar-lite'), $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite'))), sprintf(esc_html__('%s Email', 'modern-events-calendar-lite'), $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite'))), $this->main->m('event_cost', esc_html__('Event Cost', 'modern-events-calendar-lite')), esc_html__('Featured Image', 'modern-events-calendar-lite'), esc_html__('Labels', 'modern-events-calendar-lite'), esc_html__('Categories', 'modern-events-calendar-lite'), esc_html__('Tags', 'modern-events-calendar-lite'), ); // Speakers if(isset($this->settings['speakers_status']) and $this->settings['speakers_status']) $columns[] = esc_html__('Speakers', 'modern-events-calendar-lite'); // Event Fields $fields = $this->main->get_event_fields(); if(!is_array($fields)) $fields = []; foreach($fields as $f => $field) { if(!is_numeric($f)) continue; if(!isset($field['label']) or trim($field['label']) == '') continue; $columns[] = stripslashes($field['label']); } $rows = []; $rows[] = $columns; foreach($post_ids as $post_id) { $post_id = (int) $post_id; $data = $render->data($post_id); $dates = $render->dates($post_id, $data); $date = $dates[0] ?? []; // No Date if(!count($date)) continue; $location = $data->locations[$data->meta['mec_location_id']] ?? []; $organizer = $data->organizers[$data->meta['mec_organizer_id']] ?? []; $cost = $data->meta['mec_cost'] ?? null; $taxonomies = array('mec_label', 'mec_category', apply_filters('mec_taxonomy_tag', '')); if(isset($this->settings['speakers_status']) and $this->settings['speakers_status']) $taxonomies[] = 'mec_speaker'; $labels = []; $categories = []; $tags = []; $speakers = []; $terms = wp_get_post_terms($post_id, $taxonomies, array('fields'=>'all')); foreach($terms as $term) { // First Validation if(!isset($term->taxonomy)) continue; if($term->taxonomy == 'mec_label') $labels[] = $term->name; elseif($term->taxonomy == 'mec_category') $categories[] = $term->name; elseif($term->taxonomy == apply_filters('mec_taxonomy_tag', '')) $tags[] = $term->name; elseif($term->taxonomy == 'mec_speaker') $speakers[] = $term->name; } $event = array( $post_id, html_entity_decode($data->title, ENT_QUOTES | ENT_HTML5), html_entity_decode(strip_tags($data->content), ENT_QUOTES | ENT_HTML5), $date['start']['date'], $data->time['start'], $date['end']['date'], $data->time['end'], $data->permalink, ($location['name'] ?? ''), ($location['address'] ?? ''), ($organizer['name'] ?? ''), ($organizer['tel'] ?? ''), ($organizer['email'] ?? ''), (is_numeric($cost) ? $this->main->render_price($cost, $post_id) : $cost), $this->main->get_post_thumbnail_url($post_id), implode(', ', $labels), implode(', ', $categories), implode(', ', $tags), ); // Speakers if(isset($this->settings['speakers_status']) and $this->settings['speakers_status']) $event[] = implode(', ', $speakers); // Event Fields if(isset($data->fields) and is_array($data->fields) and count($data->fields)) { foreach($data->fields as $field) $event[] = $field['value']; } $rows[] = $event; } return $rows; } public function gcalcsv($export_all = false) { // MEC Render Library $render = $this->getRender(); if($export_all) $post_ids = get_posts('post_type=mec-events&fields=ids&posts_per_page=-1'); else $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; // Do not translate these column names $columns = array( 'Subject', 'Start Date', 'Start Time', 'End Date', 'End Time', 'All Day Event', 'Description', 'Location', 'Private', ); $delimiter = ','; $output = fopen('php://output', 'w'); fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); fputcsv($output, $columns, $delimiter); foreach($post_ids as $post_id) { $post_id = (int) $post_id; $data = $render->data($post_id); $dates = $render->dates($post_id, $data); $date = $dates[0]; $start_date = $date['start']['date']; $start_time = $data->time['start']; $end_date = $date['end']['date']; $end_time = $data->time['end']; $start_timestamp = isset($date['start'], $date['start']['timestamp']) ? $date['start']['timestamp'] : NULL; $end_timestamp = isset($date['end'], $date['end']['timestamp']) ? $date['end']['timestamp'] : NULL; if($start_timestamp) { $start_date = date('m/d/Y', $start_timestamp); $start_time = date('h:i A', $start_timestamp); } if($end_timestamp) { $end_date = date('m/d/Y', $end_timestamp); $end_time = date('h:i A', $end_timestamp); } $location = $data->locations[$data->meta['mec_location_id']] ?? []; $allday = (boolean) get_post_meta($post_id, 'mec_allday', true); $public = get_post_meta($post_id, 'mec_public', true); if(trim($public) === '') $public = 1; $event = array( html_entity_decode($data->title, ENT_QUOTES | ENT_HTML5), $start_date, $start_time, $end_date, $end_time, ($allday ? 'True' : 'False'), html_entity_decode(strip_tags($data->content), ENT_QUOTES | ENT_HTML5), $location['address'] ?? '', ($public ? 'True' : 'False') ); fputcsv($output, $event, $delimiter); } } public function action_links($actions, $post) { if($post->post_type != $this->PT) return $actions; // Editor and Higher if(current_user_can('edit_post', $post->ID)) { // Duplicate Button $actions['mec-duplicate'] = ''.esc_html__('Duplicate', 'modern-events-calendar-lite').''; } // Booking Button if($this->getPRO() && current_user_can('edit_others_posts') && isset($this->settings['booking_status']) && $this->settings['booking_status']) $actions['mec-bookings'] = ''.esc_html__('Bookings', 'modern-events-calendar-lite').''; // Certificate Button if($this->getPRO() && isset($this->settings['certificate_status']) && $this->settings['certificate_status']) $actions['mec-send-certificate'] = ''.esc_html__('Send Certificates', 'modern-events-calendar-lite').''; return $actions; } public function duplicate_event() { // It's not a duplicate request if(!isset($_GET['mec-action']) or sanitize_text_field($_GET['mec-action']) != 'duplicate-event') return false; // Event ID to duplicate $id = isset($_GET['id']) ? (int) sanitize_text_field($_GET['id']) : 0; if(!$id) return false; // Only editor and higher if(!current_user_can('edit_post', $id)) return false; // Duplicate $new_post_id = $this->main->duplicate($id); wp_redirect('post.php?post=' . $new_post_id . '&action=edit'); exit; } /** * Do bulk edit Action * * @author Webnus * @return void */ public function bulk_edit() { $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; if(!count($post_ids)) return; $mec_locations = (isset($_GET['tax_input']['mec_location']) and trim($_GET['tax_input']['mec_location'])) ? array_filter(explode(',', sanitize_text_field($_GET['tax_input']['mec_location']))) : NULL; $mec_organizers = (isset($_GET['tax_input']['mec_organizer']) and trim($_GET['tax_input']['mec_organizer'])) ? array_filter(explode(',', sanitize_text_field($_GET['tax_input']['mec_organizer']))) : NULL; if(!$mec_locations and !$mec_organizers) return; $taxonomies = []; if(is_array($mec_locations)) $taxonomies[] = 'mec_location'; if(is_array($mec_organizers)) $taxonomies[] = 'mec_organizer'; $terms = get_terms(array( 'taxonomy' => $taxonomies, )); foreach($post_ids as $post_id) { foreach($terms as $term) { $term_objects = get_objects_in_term($term->term_id, $term->taxonomy); if(in_array($post_id, $term_objects)) wp_remove_object_terms($post_id, $term->term_id, $term->taxonomy); } // MEC Locations Bulk Edit $this->mec_locations_edit($post_id, $mec_locations); // MEC Organizers Bulk Edit $this->mec_organizers_edit($post_id, $mec_organizers); } } // MEC Locations Edit. public function mec_locations_edit($post_id, $mec_locations, $action = 'bulk_edit') { if(!is_null($mec_locations)) { $term_location = current($mec_locations); if(!term_exists($term_location, 'mec_location')) wp_insert_term($term_location, 'mec_location', array()); $location_id = get_term_by('name', $term_location, 'mec_location')->term_id; wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); update_post_meta($post_id, 'mec_location_id', $location_id); if(count($mec_locations) > 1) { // Additional locations $additional_location_ids = []; for($i = 1; $i < count($mec_locations); $i++) { if(!term_exists($mec_locations[$i], 'mec_location')) wp_insert_term($mec_locations[$i], 'mec_location', array()); $additional_location_id = get_term_by('name', $mec_locations[$i], 'mec_location')->term_id; wp_set_object_terms($post_id, (int)$additional_location_id, 'mec_location', true); $additional_location_ids[] = (int)$additional_location_id; } update_post_meta($post_id, 'mec_additional_location_ids', $additional_location_ids); } } elseif($action == 'quick_edit') { update_post_meta($post_id, 'mec_location_id', 0); update_post_meta($post_id, 'mec_additional_location_ids', array()); } } // MEC Organizers Edit. public function mec_organizers_edit($post_id, $mec_organizers, $action = 'bulk_edit') { if(!is_null($mec_organizers)) { $term_organizer = current($mec_organizers); if(!term_exists($term_organizer, 'mec_organizer')) wp_insert_term($term_organizer, 'mec_organizer', array()); $organizer_id = get_term_by('name', current($mec_organizers), 'mec_organizer')->term_id; wp_set_object_terms($post_id, (int)$organizer_id, 'mec_organizer'); update_post_meta($post_id, 'mec_organizer_id', $organizer_id); if(count($mec_organizers) > 1) { // Additional organizers $additional_organizer_ids = []; for($i = 1; $i < count($mec_organizers); $i++) { if(!term_exists($mec_organizers[$i], 'mec_organizer')) wp_insert_term($mec_organizers[$i], 'mec_organizer', array()); $additional_organizer_id = get_term_by('name', $mec_organizers[$i], 'mec_organizer')->term_id; wp_set_object_terms($post_id, (int)$additional_organizer_id, 'mec_organizer', true); $additional_organizer_ids[] = (int)$additional_organizer_id; } update_post_meta($post_id, 'mec_additional_organizer_ids', $additional_organizer_ids); } } elseif($action == 'quick_edit') { update_post_meta($post_id, 'mec_organizer_id', 0); update_post_meta($post_id, 'mec_additional_organizer_ids', array()); } } public function icl_duplicate($master_post_id, $lang, $post, $id) { $master = get_post($master_post_id); $target = get_post($id); if($master->post_type != $this->PT) return; if($target->post_type != $this->PT) return; $already_duplicated = get_post_meta($id, 'mec_icl_duplicated', true); if($already_duplicated) return; $master_location_id = get_post_meta($master_post_id, 'mec_location_id', true); $target_location_id = apply_filters('wpml_object_id', $master_location_id, 'mec_location', true, $lang); update_post_meta($id, 'mec_location_id', $target_location_id); $master_additional_location_ids = get_post_meta($master_post_id, 'mec_additional_location_ids', true); if(!is_array($master_additional_location_ids)) $master_additional_location_ids = []; $target_additional_location_ids = []; foreach($master_additional_location_ids as $master_additional_location_id) { $target_additional_location_ids[] = apply_filters('wpml_object_id', $master_additional_location_id, 'mec_location', true, $lang); } update_post_meta($id, 'mec_additional_location_ids', $target_additional_location_ids); $master_organizer_id = get_post_meta($master_post_id, 'mec_organizer_id', true); $target_organizer_id = apply_filters('wpml_object_id', $master_organizer_id, 'mec_organizer', true, $lang); update_post_meta($id, 'mec_organizer_id', $target_organizer_id); $master_additional_organizer_ids = get_post_meta($master_post_id, 'mec_additional_organizer_ids', true); if(!is_array($master_additional_organizer_ids)) $master_additional_organizer_ids = []; $target_additional_organizer_ids = []; foreach($master_additional_organizer_ids as $master_additional_organizer_id) { $target_additional_organizer_ids[] = apply_filters('wpml_object_id', $master_additional_organizer_id, 'mec_location', true, $lang); } update_post_meta($id, 'mec_additional_organizer_ids', $target_additional_organizer_ids); // MEC Tables $this->db->q("INSERT INTO `#__mec_events` (`post_id`, `start`, `end`, `repeat`, `rinterval`, `year`, `month`, `day`, `week`, `weekday`, `weekdays`, `days`, `not_in_days`, `time_start`, `time_end`) SELECT '".$id."', `start`, `end`, `repeat`, `rinterval`, `year`, `month`, `day`, `week`, `weekday`, `weekdays`, `days`, `not_in_days`, `time_start`, `time_end` FROM `#__mec_events` WHERE `post_id`='".$master_post_id."'"); update_post_meta($id, 'mec_icl_duplicated', 1); // Update Schedule $schedule = $this->getSchedule(); $schedule->reschedule($id); } public function wpml_pro_translation_saved($new_post_id, $fields, $job) { global $iclTranslationManagement; $master_post_id = NULL; if(is_object($job) and $iclTranslationManagement) { $element_type_prefix = $iclTranslationManagement->get_element_type_prefix_from_job($job); $original_post = $iclTranslationManagement->get_post($job->original_doc_id, $element_type_prefix); if($original_post) $master_post_id = $original_post->ID; } // Target Language $lang_options = apply_filters('wpml_post_language_details', NULL, $new_post_id); $lang = (is_array($lang_options) and isset($lang_options['language_code'])) ? $lang_options['language_code'] : ''; // Duplicate Content if($master_post_id) $this->icl_duplicate($master_post_id, $lang, (new stdClass()), $new_post_id); } public function set_fallback_image_id($value, $post_id, $meta_key, $single) { // Only on frontend if(is_admin() and (!defined('DOING_AJAX') or (defined('DOING_AJAX') and !DOING_AJAX))) return $value; // Only for empty _thumbnail_id keys if(!empty($meta_key) && '_thumbnail_id' !== $meta_key) return $value; // Only For Events if(get_post_type($post_id) != $this->PT) return $value; // Get current Cache $meta_cache = wp_cache_get($post_id, 'post_meta'); if(!$meta_cache) { $meta_cache = update_meta_cache('post', array($post_id)); $meta_cache = $meta_cache[$post_id] ?? []; } // Is the _thumbnail_id present in cache? if(!empty($meta_cache['_thumbnail_id'][0])) return $value; $fallback_image_id = $this->get_fallback_image_id($post_id); if(!$fallback_image_id) return $value; // Set the Fallback Image in cache $meta_cache['_thumbnail_id'][0] = $fallback_image_id; wp_cache_set($post_id, $meta_cache, 'post_meta'); return $value; } public function show_fallback_image($html, $post_id, $post_thumbnail_id, $size, $attr) { // Only on frontend if((is_admin() && (!defined('DOING_AJAX') || !DOING_AJAX))) return $html; // Only For Events if(get_post_type($post_id) != $this->PT) return $html; $fallback_image_id = $this->get_fallback_image_id($post_id); // if an image is set return that image. if((int) $fallback_image_id !== (int) $post_thumbnail_id) return $html; if(isset($attr['class'])) $attr['class'] .= ' mec-fallback-img'; else { $size_class = $size; if(is_array($size_class)) $size_class = 'size-'.implode('x', $size_class); $attr = array('class' => 'attachment-'.$size_class.' default-featured-img'); } return wp_get_attachment_image($fallback_image_id, $size, false, $attr); } public function get_fallback_image_id($event_id) { // Categories $categories = get_the_terms($event_id, 'mec_category'); if(!is_array($categories) or !count($categories)) return NULL; // Fallback Image ID $fallback_image_id = NULL; foreach($categories as $category) { $fallback_image = get_term_meta($category->term_id, 'mec_cat_fallback_image', true); if(trim($fallback_image)) { $fallback_image_id = attachment_url_to_postid($fallback_image); if($fallback_image_id) break; } } return $fallback_image_id; } public function mec_event_bookings() { $id = isset($_POST['id']) ? sanitize_text_field($_POST['id']) : 0; $backend = isset($_POST['backend']) ? sanitize_text_field($_POST['backend']) : 0; $p_occurrence = isset($_POST['occurrence']) ? sanitize_text_field($_POST['occurrence']) : NULL; $occurrence = explode(':', $p_occurrence)[0]; if($occurrence == 'all') $occurrence = strtotime('+100 years'); $bookings = $this->main->get_bookings($id, $occurrence); $book = $this->getBook(); $html = ''; $total_attendees = 0; if(count($bookings)) { $html .= '
'.esc_html__('Title', 'modern-events-calendar-lite').'
'.esc_html__('Transaction ID', 'modern-events-calendar-lite').'
'.esc_html__('Price', 'modern-events-calendar-lite').'
'; /** @var WP_Post $booking */ foreach($bookings as $booking) { $attendees = $book->get_attendees($booking->ID); $attendees = apply_filters('mec_filter_event_bookings', $attendees, $booking->ID, $p_occurrence); $total_attendees += count($attendees); $unique_attendees = []; foreach($attendees as $attendee) { if(!isset($unique_attendees[$attendee['email']])) $unique_attendees[$attendee['email']] = $attendee; else $unique_attendees[$attendee['email']]['count'] += 1; } $attendees_html = ''.count($attendees).''; $attendees_html .= '
'; $attendees_html .= '
    '; foreach($unique_attendees as $unique_attendee) { $attendees_html .= '
  • '; $attendees_html .= '
    '.esc_html($unique_attendee['name']).((isset($unique_attendee['count']) and $unique_attendee['count'] > 1) ? ' ('.esc_html($unique_attendee['count']).')' : '').'
    '; $attendees_html .= ''; $attendees_html .= '
  • '; } $attendees_html .= '
'; $attendees_html .= '
'; $transaction_id = get_post_meta($booking->ID, 'mec_transaction_id', true); $price = get_post_meta($booking->ID, 'mec_price', true); $event_id = get_post_meta($booking->ID, 'mec_event_id', true); $price_html = $this->main->render_price(($price ?: 0), $event_id); $price_html .= ' ('.get_post_meta($booking->ID, 'mec_gateway_label', true).')'; $all_dates = get_post_meta($booking->ID, 'mec_all_dates', true); if(is_array($all_dates) and count($all_dates) > 1) $price_html .= ' '.sprintf(esc_html__('for %s dates', 'modern-events-calendar-lite'), count($all_dates)); $html .= '
'; $html .= '
'.($backend ? ''.esc_html($booking->post_title).'' : esc_html($booking->post_title)).'
'; $html .= '
'.MEC_kses::form($attendees_html).'
'; $html .= '
'.esc_html($transaction_id).'
'; $html .= '
'.MEC_kses::element($price_html).'
'; $html .= '
'; } } else { $html .= '

'.esc_html__("No Bookings Found!", 'modern-events-calendar-lite').'

'; } $html = apply_filters('mec_event_bookings_report', $html, $bookings, $id, $backend, $occurrence, $total_attendees); echo json_encode(array('html' => $html, 'found' => (bool) count($bookings))); exit; } public function gallery_image_upload() { // Check if our nonce is set. if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); // Verify that the nonce is valid. if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_event_gallery_image_upload')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); $images = (isset($_FILES['images']) and is_array($_FILES['images'])) ? $_FILES['images'] : []; // No file if(!count($images)) $this->main->response(array('success'=>0, 'code'=>'NO_FILE', 'message'=>esc_html__('Please upload an image.', 'modern-events-calendar-lite'))); // Include the functions if(!function_exists('wp_handle_upload')) { require_once ABSPATH.'wp-admin/includes/file.php'; require_once(ABSPATH.'wp-admin/includes/image.php'); } // Upload Restrictions $max_file_size = isset($this->settings['fes_max_file_size']) ? (int) ($this->settings['fes_max_file_size'] * 1000) : (5000 * 1000); $allowed = array('jpeg', 'jpg', 'png', 'gif', 'webp'); $success = 0; $data = []; $count = count($images['name']); for($i = 0; $i < $count; $i++) { $image = array( 'name' => $images['name'][$i], 'type' => $images['type'][$i], 'tmp_name' => $images['tmp_name'][$i], 'error' => $images['error'][$i], 'size' => $images['size'][$i], ); $ex = explode('.', $image['name']); $extension = end($ex); // Invalid Extension if(!in_array(strtolower($extension), $allowed)) continue; // Invalid Size if($image['size'] > $max_file_size) continue; $uploaded = wp_handle_upload($image, array('test_form' => false)); if($uploaded and !isset($uploaded['error'])) { $success = 1; $attachment = array( 'post_mime_type' => $uploaded['type'], 'post_title' => '', 'post_content' => '', 'post_status' => 'inherit' ); // Add as Attachment $attachment_id = wp_insert_attachment($attachment, $uploaded['file']); // Update Metadata wp_update_attachment_metadata($attachment_id, wp_generate_attachment_metadata($attachment_id, $uploaded['file'])); $data[] = array( 'id' => $attachment_id, 'url' => $uploaded['url'] ); } } $message = $success ? esc_html__('The images are uploaded!', 'modern-events-calendar-lite') : esc_html__('An error occurred!', 'modern-events-calendar-lite'); $this->main->response(array('success'=>$success, 'message'=>$message, 'data'=>$data)); } public function mec_move_bookings() { // Check if our nonce is set. if(!isset($_POST['_wpnonce'])) $this->main->response(['success'=>0, 'code'=>'NONCE_MISSING']); // Verify that the nonce is valid. if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_move_bookings')) $this->main->response(['success'=>0, 'code'=>'NONCE_IS_INVALID']); $event_id = isset($_POST['id']) ? (int) sanitize_text_field($_POST['id']) : 0; $from = isset($_POST['from']) ? (int) sanitize_text_field($_POST['from']) : 0; $to_start = isset($_POST['to']) ? (int) sanitize_text_field($_POST['to']) : 0; if(!$event_id || !$from || !$to_start) $this->main->response(['success' => 0, 'code' => 'MISS_INFORMATION']); // Booking Library $book = $this->getBook(); $bookings = $this->main->get_bookings($event_id, $from); foreach($bookings as $booking) { $book->move($booking->ID, $from, $to_start); $book->move_notify($booking->ID, $to_start); } $message = '

'.sprintf(esc_html__('%s bookings moved to new date', 'modern-events-calendar-lite'), count($bookings)).'

'; $this->main->response(['success' => 1, 'message' => $message]); } public function mec_manage_bookings() { // Check if our nonce is set. if(!isset($_POST['_wpnonce'])) $this->main->response(['success'=>0, 'code'=>'NONCE_MISSING']); // Verify that the nonce is valid. if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_manage_bookings')) $this->main->response(['success'=>0, 'code'=>'NONCE_IS_INVALID']); $event_id = isset($_POST['id']) ? (int) sanitize_text_field($_POST['id']) : 0; $mode = isset($_POST['mode']) ? sanitize_text_field($_POST['mode']) : 'cancel'; $date = isset($_POST['date']) ? (int) sanitize_text_field($_POST['date']) : 0; if(!$event_id or !$mode or !$date or !in_array($mode, ['cancel', 'refund'])) $this->main->response(['success' => 0, 'code' => 'MISS_INFORMATION']); // Booking Library $book = $this->getBook(); $bookings = $this->main->get_bookings($event_id, $date); foreach($bookings as $booking) { if($mode === 'refund') $book->cancel($booking->ID, true); else $book->cancel($booking->ID, false); } if($mode === 'refund') $message = '

'.sprintf(esc_html__('%s bookings canceled (and refunded).', 'modern-events-calendar-lite'), count($bookings)).'

'; else $message = '

'.sprintf(esc_html__('%s bookings canceled.', 'modern-events-calendar-lite'), count($bookings)).'

'; $this->main->response(['success' => 1, 'message' => $message]); } }