4062 lines
208 KiB
PHP
Executable file
4062 lines
208 KiB
PHP
Executable file
<?php
|
|
/** no direct access **/
|
|
|
|
use MEC\FES\FormBuilder;
|
|
|
|
defined('MECEXEC') or die();
|
|
|
|
/**
|
|
* Webnus MEC events class.
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
*/
|
|
class MEC_feature_events extends MEC_base
|
|
{
|
|
public $factory;
|
|
public $main;
|
|
public $db;
|
|
public $PT;
|
|
public $settings;
|
|
public $render;
|
|
|
|
/**
|
|
* Constructor method
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
*/
|
|
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 <info@webnus.net>
|
|
*/
|
|
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 '<div class="notice notice-warning is-dismissible">
|
|
<p>'.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').'</p>
|
|
</div>';
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Registers events post type and assign it to some taxonomies
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
*/
|
|
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 <info@webnus.net>
|
|
*/
|
|
public function add_category_fields()
|
|
{
|
|
add_thickbox();
|
|
|
|
// Fallback Status
|
|
$fallback = (isset($this->settings['fallback_featured_image_status']) and $this->settings['fallback_featured_image_status']);
|
|
?>
|
|
<div class="form-field">
|
|
<label for="mec_cat_icon"><?php esc_html_e('Category Icon', 'modern-events-calendar-lite'); ?></label>
|
|
<input type="hidden" name="mec_cat_icon" id="mec_cat_icon" value=""/>
|
|
<a href="<?php echo esc_url($this->main->asset('icon.html')); ?>?&width=680&height=450&inlineId=my-content-id"
|
|
class="thickbox mec_category_icon button"><?php echo esc_html__('Select icon', 'modern-events-calendar-lite'); ?></a>
|
|
</div>
|
|
<div class="form-field">
|
|
<label for="mec_cat_color"><?php esc_html_e('Color', 'modern-events-calendar-lite'); ?></label>
|
|
<input type="text" name="mec_cat_color" id="mec_cat_color" class="mec-color-picker" />
|
|
<p class="description"><?php esc_html_e('Optional category color', 'modern-events-calendar-lite'); ?></p>
|
|
</div>
|
|
<?php if($fallback): ?>
|
|
<div class="form-field">
|
|
<label for="mec_thumbnail_button"><?php esc_html_e('Fallback Image', 'modern-events-calendar-lite'); ?></label>
|
|
<div id="mec_thumbnail_img"></div>
|
|
<input type="hidden" name="fallback" id="mec_thumbnail" value="" />
|
|
<button type="button" class="mec_upload_image_button button" id="mec_thumbnail_button"><?php echo esc_html__('Upload/Add image', 'modern-events-calendar-lite'); ?></button>
|
|
<button type="button" class="mec_remove_image_button button mec-util-hidden"><?php echo esc_html__('Remove image', 'modern-events-calendar-lite'); ?></button>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Edit icon meta for categories
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
*/
|
|
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);
|
|
?>
|
|
<tr class="form-field">
|
|
<th scope="row" >
|
|
<label for="mec_cat_icon"><?php esc_html_e('Category Icon', 'modern-events-calendar-lite'); ?></label>
|
|
</th>
|
|
<td>
|
|
<input type="hidden" name="mec_cat_icon" id="mec_cat_icon" value="<?php echo esc_attr($icon); ?>"/>
|
|
<a href="<?php echo esc_url($this->main->asset('icon.html')); ?>?&width=680&height=450&inlineId=my-content-id"
|
|
class="thickbox mec_category_icon button"><?php echo esc_html__('Select icon', 'modern-events-calendar-lite'); ?></a>
|
|
<?php if (isset($icon)) : ?>
|
|
<div class="mec-webnus-icon"><i class="<?php echo esc_attr($icon); ?> mec-color"></i></div>
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
<tr class="form-field">
|
|
<th scope="row" >
|
|
<label for="mec_cat_color"><?php esc_html_e('Color', 'modern-events-calendar-lite'); ?></label>
|
|
</th>
|
|
<td>
|
|
<input type="text" name="mec_cat_color" id="mec_cat_color" value="<?php echo esc_attr($color); ?>" data-default-color="<?php echo esc_attr($color); ?>" class="mec-color-picker" />
|
|
<p class="description"><?php esc_html_e('Optional category color', 'modern-events-calendar-lite'); ?></p>
|
|
</td>
|
|
</tr>
|
|
<?php if($fallback): ?>
|
|
<tr class="form-field">
|
|
<th scope="row" >
|
|
<label for="mec_thumbnail_button"><?php esc_html_e('Fallback Image', 'modern-events-calendar-lite'); ?></label>
|
|
</th>
|
|
<td>
|
|
<div id="mec_thumbnail_img"><?php if(trim($fallback_image) != '') echo '<img src="'.esc_url($fallback_image).'" />'; ?></div>
|
|
<input type="hidden" name="fallback" id="mec_thumbnail" value="<?php echo esc_attr($fallback_image); ?>" />
|
|
<button type="button" class="mec_upload_image_button button" id="mec_thumbnail_button"><?php echo esc_html__('Upload/Add image', 'modern-events-calendar-lite'); ?></button>
|
|
<button type="button" class="mec_remove_image_button button <?php echo (!trim($fallback_image) ? 'mec-util-hidden' : ''); ?>"><?php echo esc_html__('Remove image', 'modern-events-calendar-lite'); ?></button>
|
|
</td>
|
|
</tr>
|
|
<?php endif; ?>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Save meta data for mec categories
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
*/
|
|
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 <info@webnus.net>
|
|
*/
|
|
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 <info@webnus.net>
|
|
* @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();
|
|
?>
|
|
<div class="mec-add-event-tabs-wrap">
|
|
<div class="mec-add-event-tabs-left">
|
|
<?php
|
|
$activated = '';
|
|
$tabs = array(
|
|
esc_html__('FES Details', 'modern-events-calendar-lite') => '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 '<a class="mec-add-event-tabs-link" data-href="'.esc_attr($link_address).'" href="#">'.esc_html($link_name).'</a>';
|
|
}
|
|
elseif($link_address == 'mec-exceptional-days')
|
|
{
|
|
if(isset($this->settings['exceptional_days']) and $this->settings['exceptional_days']) echo '<a class="mec-add-event-tabs-link" data-href="'.esc_attr($link_address).'" href="#">'.esc_html($link_name).'</a>';
|
|
}
|
|
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 '<a class="mec-add-event-tabs-link" data-href="'.esc_attr($link_address).'" href="#">'.esc_html($link_name).'</a>';
|
|
}
|
|
elseif($link_address == 'mec-notifications')
|
|
{
|
|
if(isset($this->settings['notif_per_event']) and $this->settings['notif_per_event']) echo '<a class="mec-add-event-tabs-link" data-href="'.esc_attr($link_address).'" href="#">'.esc_html($link_name).'</a>';
|
|
}
|
|
elseif($link_address == 'mec-public-download-module-file')
|
|
{
|
|
if(isset($this->settings['public_download_module']) and $this->settings['public_download_module']) echo '<a class="mec-add-event-tabs-link" data-href="'.esc_attr($link_address).'" href="#">'.esc_html($link_name).'</a>';
|
|
}
|
|
elseif($link_address == 'mec-event-related-events')
|
|
{
|
|
if(isset($this->settings['related_events_per_event']) and $this->settings['related_events_per_event']) echo '<a class="mec-add-event-tabs-link" data-href="'.esc_attr($link_address).'" href="#">'.esc_html($link_name).'</a>';
|
|
}
|
|
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 '<a class="mec-add-event-tabs-link" data-href="'.esc_attr($link_address).'" href="#">'.esc_html($link_name).'</a>';
|
|
}
|
|
elseif($link_address === 'mec-organizer')
|
|
{
|
|
if((!isset($this->settings['organizers_status']) || $this->settings['organizers_status'])) echo '<a class="mec-add-event-tabs-link" data-href="'.esc_attr($link_address).'" href="#">'.esc_html($link_name).'</a>';
|
|
}
|
|
else
|
|
{
|
|
echo '<a class="mec-add-event-tabs-link" data-href="'.esc_attr($link_address).'" href="#">'.esc_html($link_name).'</a>';
|
|
}
|
|
}
|
|
?>
|
|
</div>
|
|
<div class="mec-add-event-tabs-right">
|
|
<?php do_action('mec_metabox_details', $post); ?>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
jQuery(".mec-meta-box-fields .mec-event-tab-content:first-of-type,.mec-add-event-tabs-left .mec-add-event-tabs-link:first-of-type").addClass("mec-tab-active");
|
|
jQuery(".mec-add-event-tabs-link").on("click", function (e) {
|
|
e.preventDefault();
|
|
var href = jQuery(this).attr("data-href");
|
|
jQuery(".mec-event-tab-content,.mec-add-event-tabs-link").removeClass("mec-tab-active");
|
|
jQuery(this).addClass("mec-tab-active");
|
|
jQuery("#" + href ).addClass("mec-tab-active");
|
|
});
|
|
</script>
|
|
|
|
<?php if(isset($this->settings['display_event_fields_backend']) and $this->settings['display_event_fields_backend'] == 1): ?>
|
|
<script>
|
|
jQuery("#publish").on("click", function()
|
|
{
|
|
var xdf = jQuery("#mec_metabox_details .mec-add-event-tabs-left .mec-add-event-tabs-link[data-href='mec-event-data']");
|
|
jQuery("#mec_metabox_details .mec-add-event-tabs-left .mec-add-event-tabs-link").removeClass("mec-tab-active");
|
|
jQuery("#mec_metabox_details .mec-add-event-tabs-right .mec-event-tab-content").removeClass("mec-tab-active");
|
|
jQuery(xdf).addClass("mec-tab-active");
|
|
jQuery(".mec-add-event-tabs-right #mec-event-data").addClass("mec-tab-active");
|
|
});
|
|
</script>
|
|
<?php
|
|
endif;
|
|
}
|
|
|
|
/**
|
|
* Show content of visibility meta box
|
|
*
|
|
* @param WP_Post $post
|
|
*@author Webnus <info@webnus.net>
|
|
*/
|
|
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';
|
|
?>
|
|
<div class="mec-metabox-visibility">
|
|
<?php if(!isset($this->settings['event_visibility_status']) or (isset($this->settings['event_visibility_status']) and $this->settings['event_visibility_status'])): ?>
|
|
<label class="post-attributes-label"><?php esc_html_e('Visibility', 'modern-events-calendar-lite'); ?></label class="post-attributes-label">
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-12">
|
|
<select name="mec[public]" id="mec_public" title="<?php esc_attr_e('Event Visibility', 'modern-events-calendar-lite'); ?>">
|
|
<option value="1" <?php if('1' == $public) echo 'selected="selected"'; ?>><?php esc_html_e('Show on Shortcodes', 'modern-events-calendar-lite'); ?></option>
|
|
<option value="0" <?php if('0' == $public) echo 'selected="selected"'; ?>><?php esc_html_e('Hide on Shortcodes', 'modern-events-calendar-lite'); ?></option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php if(isset($this->settings['style_per_event']) and $this->settings['style_per_event']): ?>
|
|
<label class="post-attributes-label"><?php esc_html_e('Details Page Style', 'modern-events-calendar-lite'); ?></label>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-12">
|
|
<select name="mec[style_per_event]" id="mec_style_per_event" title="<?php esc_attr_e('Event Style', 'modern-events-calendar-lite'); ?>">
|
|
<option value="global"><?php esc_html_e('Inherit from global options', 'modern-events-calendar-lite'); ?></option>
|
|
<option value="default" <?php echo $style_per_event === 'default' ? 'selected="selected"' : ''; ?>><?php esc_html_e('Default Style', 'modern-events-calendar-lite'); ?></option>
|
|
<option value="modern" <?php echo $style_per_event === 'modern' ? 'selected="selected"' : ''; ?>><?php esc_html_e('Modern Style', 'modern-events-calendar-lite'); ?></option>
|
|
<?php do_action('mec_single_style', array('style_per_event' => $style_per_event), 'style_per_event'); ?>
|
|
<?php if(is_plugin_active( 'mec-single-builder/mec-single-builder.php')): ?>
|
|
<option value="builder" <?php echo $style_per_event === 'builder' ? 'selected="selected"' : ''; ?>><?php esc_html_e('Elementor Single Builder', 'modern-events-calendar-lite'); ?></option>
|
|
<?php endif; ?>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Show content of gallery meta box
|
|
*
|
|
* @param WP_Post $post
|
|
*@author Webnus <info@webnus.net>
|
|
*/
|
|
public function meta_box_gallery($post)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Add a security nonce to the Add/Edit events page
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
*/
|
|
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 <info@webnus.net>
|
|
* @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';
|
|
?>
|
|
<div class="mec-meta-box-fields" id="mec-date-time">
|
|
<?php if(($note_visibility and trim($note)) || (trim($fes_guest_email) and trim($fes_guest_name))): ?>
|
|
<div id="mec_meta_box_fes_form" class="mec-event-tab-content">
|
|
<?php endif; ?>
|
|
<?php if($note_visibility and trim($note)): ?>
|
|
<div class="mec-event-note">
|
|
<h4><?php esc_html_e('Note for reviewer', 'modern-events-calendar-lite'); ?></h4>
|
|
<p><?php echo esc_html($note); ?></p>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php if(trim($fes_guest_email) and trim($fes_guest_name)): ?>
|
|
<div class="mec-guest-data">
|
|
<h4><?php esc_html_e('Guest Data', 'modern-events-calendar-lite'); ?></h4>
|
|
<p><strong><?php esc_html_e('Name', 'modern-events-calendar-lite'); ?>:</strong> <?php echo esc_html($fes_guest_name); ?></p>
|
|
<p><strong><?php esc_html_e('Email', 'modern-events-calendar-lite'); ?>:</strong> <?php echo esc_html($fes_guest_email); ?></p>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php if(($note_visibility and trim($note)) || (trim($fes_guest_email) and trim($fes_guest_name))): ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php do_action('start_mec_custom_fields', $post); ?>
|
|
|
|
<?php if($imported_from_google): ?>
|
|
<p class="info-msg"><?php esc_html_e("This event is imported from Google calendar so if you modify it, it would overwrite in the next import from Google.", 'modern-events-calendar-lite'); ?></p>
|
|
<?php endif; ?>
|
|
|
|
<div id="mec_meta_box_date_form" class="mec-event-tab-content">
|
|
<div class="mec-backend-tab-wrap mec-basvanced-toggle" data-for="#mec_meta_box_date_form">
|
|
<div class="mec-backend-tab">
|
|
<div class="mec-backend-tab-item mec-b-active-tab"><?php esc_html_e('Basic', 'modern-events-calendar-lite'); ?></div>
|
|
<div class="mec-backend-tab-item"><?php esc_html_e('Advanced', 'modern-events-calendar-lite'); ?></div>
|
|
</div>
|
|
</div>
|
|
<h4><?php esc_html_e('Date and Time', 'modern-events-calendar-lite'); ?></h4>
|
|
<div class="mec-basvanced-basic">
|
|
<div class="mec-title">
|
|
<span class="mec-dashicons dashicons dashicons-calendar-alt"></span>
|
|
<label for="mec_start_date"><?php esc_html_e('Start Date', 'modern-events-calendar-lite'); ?></label>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-4">
|
|
<input type="text" name="mec[date][start][date]" id="mec_start_date" data-end="#mec_end_date" value="<?php echo esc_attr($this->main->standardize_format($start_date, $datepicker_format)); ?>" placeholder="<?php esc_html_e('Start Date', 'modern-events-calendar-lite'); ?>" autocomplete="off"/>
|
|
</div>
|
|
<div class="mec-col-6 mec-time-picker <?php echo ($allday == 1) ? 'mec-util-hidden' : ''; ?>">
|
|
<?php $this->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,
|
|
)); ?>
|
|
</div>
|
|
</div>
|
|
<div class="mec-title">
|
|
<span class="mec-dashicons dashicons dashicons-calendar-alt"></span>
|
|
<label for="mec_end_date"><?php esc_html_e('End Date', 'modern-events-calendar-lite'); ?></label>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-4">
|
|
<input type="text" name="mec[date][end][date]" id="mec_end_date" data-start="#mec_start_date" value="<?php echo esc_attr($this->main->standardize_format($end_date, $datepicker_format)); ?>" placeholder="<?php esc_html_e('End Date', 'modern-events-calendar-lite'); ?>" autocomplete="off"/>
|
|
</div>
|
|
<div class="mec-col-6 mec-time-picker <?php echo ($allday == 1) ? 'mec-util-hidden' : ''; ?>">
|
|
<?php $this->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_',
|
|
)); ?>
|
|
</div>
|
|
</div>
|
|
<?php do_action('add_event_after_time_and_date', $post->ID); ?>
|
|
<div class="mec-form-row mec-all-day-event">
|
|
<label for="mec_allday">
|
|
<input
|
|
<?php
|
|
if ($allday == '1') {
|
|
echo 'checked="checked"';
|
|
}
|
|
?>
|
|
type="checkbox" name="mec[date][allday]" id="mec_allday" value="1"
|
|
onchange="jQuery('.mec-time-picker, .mec-time-picker-label').toggle(); jQuery('#mec_add_in_days').data('allday', (jQuery(this).is(':checked') ? 1 : 0));"/>
|
|
<?php esc_html_e('All-day Event', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="mec-basvanced-advanced w-hidden">
|
|
<div class="mec-form-row">
|
|
<label for="mec_hide_time">
|
|
<input
|
|
<?php
|
|
if ($hide_time == '1') {
|
|
echo 'checked="checked"';
|
|
}
|
|
?>
|
|
type="checkbox" name="mec[date][hide_time]" id="mec_hide_time" value="1"/>
|
|
<?php esc_html_e('Hide Event Time', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
<div class="mec-form-row <?php echo $hide_end_time_global ? 'w-hidden' : ''; ?>">
|
|
<label for="mec_hide_end_time">
|
|
<input
|
|
<?php
|
|
if ($hide_end_time == '1') {
|
|
echo 'checked="checked"';
|
|
}
|
|
?>
|
|
type="checkbox" name="mec[date][hide_end_time]" id="mec_hide_end_time" value="1"/>
|
|
<?php esc_html_e('Hide Event End Time', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-4">
|
|
<input type="text" class="" name="mec[date][comment]" id="mec_comment"
|
|
placeholder="<?php esc_html_e('Notes on the time', 'modern-events-calendar-lite'); ?>"
|
|
value="<?php echo esc_attr($comment); ?>"/>
|
|
<span class="mec-tooltip">
|
|
<div class="box top">
|
|
<h5 class="title"><?php esc_html_e('Notes on the time', 'modern-events-calendar-lite'); ?></h5>
|
|
<div class="content">
|
|
<p><?php esc_attr_e('It appears next to the event time on the Single Event Page. You can enter notes such as the timezone name in this field.', 'modern-events-calendar-lite'); ?>
|
|
<a href="https://webnus.net/dox/modern-events-calendar/add-event/#Date_and_Time" target="_blank"><?php esc_html_e('Read More', 'modern-events-calendar-lite'); ?></a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<i title="" class="dashicons-before dashicons-editor-help"></i>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if(isset($this->settings['countdown_status']) and $this->settings['countdown_status'] and isset($this->settings['countdown_method_per_event']) and $this->settings['countdown_method_per_event']): ?>
|
|
<h4><?php esc_html_e('Countdown Method', 'modern-events-calendar-lite'); ?></h4>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-4">
|
|
<select name="mec[countdown_method]" id="mec_countdown_method" title="<?php esc_attr_e('Countdown Method', 'modern-events-calendar-lite'); ?>">
|
|
<option value="global" <?php if('global' == $countdown_method) echo 'selected="selected"'; ?>><?php esc_html_e('Inherit from global options', 'modern-events-calendar-lite'); ?></option>
|
|
<option value="start" <?php if('start' == $countdown_method) echo 'selected="selected"'; ?>><?php esc_html_e('Count to Event Start', 'modern-events-calendar-lite'); ?></option>
|
|
<option value="end" <?php if('end' == $countdown_method) echo 'selected="selected"'; ?>><?php esc_html_e('Count to Event End', 'modern-events-calendar-lite'); ?></option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php if(isset($this->settings['tz_per_event']) and $this->settings['tz_per_event']): ?>
|
|
<div class="mec-form-row mec-timezone-event">
|
|
<h4><label for="mec_event_timezone"><?php esc_html_e('Timezone', 'modern-events-calendar-lite'); ?></label></h4>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-4">
|
|
<select name="mec[timezone]" id="mec_event_timezone">
|
|
<option value="global"><?php esc_html_e('Inherit from global options'); ?></option>
|
|
<?php echo MEC_kses::form($this->main->timezones($event_timezone)); ?>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
<div id="mec_meta_box_repeat_form" class="mec-event-tab-content">
|
|
<h4><?php esc_html_e('Repeating', 'modern-events-calendar-lite'); ?></h4>
|
|
<div class="mec-form-row">
|
|
<label for="mec_repeat">
|
|
<input
|
|
<?php
|
|
if ($repeat_status == '1') {
|
|
echo 'checked="checked"';
|
|
}
|
|
?>
|
|
type="checkbox" name="mec[date][repeat][status]" id="mec_repeat" value="1"/>
|
|
<?php esc_html_e('Event Repeating (Recurring events)', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
<div class="mec-form-repeating-event-row">
|
|
<div class="mec-form-row">
|
|
<label class="mec-col-3" for="mec_repeat_type"><?php esc_html_e('Repeats', 'modern-events-calendar-lite'); ?></label>
|
|
<select class="mec-col-2" name="mec[date][repeat][type]" id="mec_repeat_type">
|
|
<option
|
|
<?php
|
|
if ($repeat_type == 'daily') {
|
|
echo 'selected="selected"';
|
|
}
|
|
?>
|
|
value="daily"><?php esc_html_e('Daily', 'modern-events-calendar-lite'); ?></option>
|
|
<option
|
|
<?php
|
|
if ($repeat_type == 'weekday') {
|
|
echo 'selected="selected"';
|
|
}
|
|
?>
|
|
value="weekday"><?php esc_html_e('Every Weekday', 'modern-events-calendar-lite'); ?></option>
|
|
<option
|
|
<?php
|
|
if ($repeat_type == 'weekend') {
|
|
echo 'selected="selected"';
|
|
}
|
|
?>
|
|
value="weekend"><?php esc_html_e('Every Weekend', 'modern-events-calendar-lite'); ?></option>
|
|
<option
|
|
<?php
|
|
if ($repeat_type == 'certain_weekdays') {
|
|
echo 'selected="selected"';
|
|
}
|
|
?>
|
|
value="certain_weekdays"><?php esc_html_e('Certain Weekdays', 'modern-events-calendar-lite'); ?></option>
|
|
<option
|
|
<?php
|
|
if ($repeat_type == 'weekly') {
|
|
echo 'selected="selected"';
|
|
}
|
|
?>
|
|
value="weekly"><?php esc_html_e('Weekly', 'modern-events-calendar-lite'); ?></option>
|
|
<option
|
|
<?php
|
|
if ($repeat_type == 'monthly') {
|
|
echo 'selected="selected"';
|
|
}
|
|
?>
|
|
value="monthly"><?php esc_html_e('Monthly', 'modern-events-calendar-lite'); ?></option>
|
|
<option
|
|
<?php
|
|
if ($repeat_type == 'yearly') {
|
|
echo 'selected="selected"';
|
|
}
|
|
?>
|
|
value="yearly"><?php esc_html_e('Yearly', 'modern-events-calendar-lite'); ?></option>
|
|
<option
|
|
<?php
|
|
if ($repeat_type == 'custom_days') {
|
|
echo 'selected="selected"';
|
|
}
|
|
?>
|
|
value="custom_days"><?php esc_html_e('Custom Days', 'modern-events-calendar-lite'); ?></option>
|
|
<option
|
|
<?php
|
|
if ($repeat_type == 'advanced') {
|
|
echo 'selected="selected"';
|
|
}
|
|
?>
|
|
value="advanced"><?php esc_html_e('Advanced', 'modern-events-calendar-lite'); ?></option>
|
|
</select>
|
|
</div>
|
|
<div class="mec-form-row" id="mec_repeat_interval_container">
|
|
<label class="mec-col-3"
|
|
for="mec_repeat_interval"><?php esc_html_e('Repeat Interval', 'modern-events-calendar-lite'); ?></label>
|
|
<input class="mec-col-2" type="text" name="mec[date][repeat][interval]" id="mec_repeat_interval"
|
|
placeholder="<?php esc_html_e('Repeat interval', 'modern-events-calendar-lite'); ?>"
|
|
value="<?php echo($repeat_type == 'weekly' ? ($repeat_interval / 7) : $repeat_interval); ?>"/>
|
|
</div>
|
|
<div class="mec-form-row" id="mec_repeat_certain_weekdays_container">
|
|
<label class="mec-col-3"><?php esc_html_e('Week Days', 'modern-events-calendar-lite'); ?></label>
|
|
<?php
|
|
$weekdays = $this->main->get_weekday_i18n_labels();
|
|
foreach($weekdays as $weekday):
|
|
?>
|
|
<label>
|
|
<input type="checkbox" name="mec[date][repeat][certain_weekdays][]"
|
|
value="<?php echo intval($weekday[0]); ?>" <?php echo(in_array($weekday[0], $certain_weekdays) ? 'checked="checked"' : ''); ?> /><?php echo esc_html($weekday[1]); ?>
|
|
</label>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<div class="mec-form-row" id="mec_exceptions_in_days_container">
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-12">
|
|
<div class="mec-form-row mec-in-days-add-mode" id="mec-in-days-form">
|
|
<div class="mec-col-4">
|
|
<input type="text" id="mec_exceptions_in_days_start_date" value="" placeholder="<?php esc_html_e('Start', 'modern-events-calendar-lite'); ?>" title="<?php esc_html_e('Start', 'modern-events-calendar-lite'); ?>" class="mec_date_picker_dynamic_format widefat" autocomplete="off"/>
|
|
</div>
|
|
<div class="mec-col-5 mec-time-picker <?php echo ($allday == 1) ? 'mec-util-hidden' : ''; ?>">
|
|
<?php $this->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,
|
|
)); ?>
|
|
</div>
|
|
<div class="mec-col-3">
|
|
<button class="button" type="button" id="mec_add_in_days" data-allday="<?php echo esc_attr($allday); ?>"><?php esc_html_e('Add', 'modern-events-calendar-lite'); ?></button>
|
|
<button class="button" type="button" id="mec_edit_in_days" data-allday="<?php echo esc_attr($allday); ?>"><?php esc_html_e('Update', 'modern-events-calendar-lite'); ?></button>
|
|
<button class="button" type="button" id="mec_cancel_in_days"><?php esc_html_e('Cancel', 'modern-events-calendar-lite'); ?></button>
|
|
<span class="mec-tooltip">
|
|
<div class="box top">
|
|
<h5 class="title"><?php esc_html_e('Custom Days Repeating', 'modern-events-calendar-lite'); ?></h5>
|
|
<div class="content">
|
|
<p>
|
|
<?php esc_attr_e('Add certain days to event occurrences. If you have a single day event, start and end dates should be the same, If you have a multi-day event, the interval between the start and end dates must match the initial date.', 'modern-events-calendar-lite'); ?>
|
|
<a href="https://webnus.net/dox/modern-events-calendar/add-event/#Repeat_Methods" target="_blank"><?php esc_html_e('Read More', 'modern-events-calendar-lite'); ?></a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<i title="" class="dashicons-before dashicons-editor-help"></i>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-4">
|
|
<input type="text" id="mec_exceptions_in_days_end_date" value="" placeholder="<?php esc_html_e('End', 'modern-events-calendar-lite'); ?>" title="<?php esc_html_e('End', 'modern-events-calendar-lite'); ?>" class="mec_date_picker_dynamic_format" autocomplete="off"/>
|
|
</div>
|
|
<div class="mec-col-8 mec-time-picker <?php echo ($allday == 1) ? 'mec-util-hidden' : ''; ?>">
|
|
<?php $this->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_',
|
|
)); ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="mec-form-row mec-certain-day" id="mec_in_days">
|
|
<?php $i = 1; foreach($in_days as $in_day): ?>
|
|
<?php
|
|
$in_day = explode(':', $in_day);
|
|
$first_date = $this->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) ? ' <span class="mec-time-picker-label '.($allday ? 'mec-util-hidden' : '').'">'.esc_html($in_day_start_time_label).'</span>' : '') . ' - ' . $second_date. (trim($in_day_end_time_label) ? ' <span class="mec-time-picker-label '.($allday ? 'mec-util-hidden' : '').'">'.esc_html($in_day_end_time_label).'</span>' : '');
|
|
?>
|
|
<div class="mec-form-row" id="mec_in_days_row<?php echo esc_attr($i); ?>">
|
|
<input type="hidden" name="mec[in_days][<?php echo esc_attr($i); ?>]" value="<?php echo esc_attr($in_day); ?>"/>
|
|
<span class="mec-in-days-day" onclick="mec_in_days_edit(<?php echo esc_attr($i); ?>);" title="<?php echo esc_attr__('Click to edit', 'modern-events-calendar-lite'); ?>"><?php echo MEC_kses::element($in_day_label); ?></span>
|
|
<span class="mec-not-in-days-remove" onclick="mec_in_days_remove(<?php echo esc_attr($i); ?>);">x</span>
|
|
</div>
|
|
<?php $i++; endforeach; ?>
|
|
</div>
|
|
<input type="hidden" id="mec_new_in_days_key" value="<?php echo ($i + 1); ?>"/>
|
|
<div class="mec-util-hidden" id="mec_new_in_days_raw">
|
|
<div class="mec-form-row" id="mec_in_days_row:i:">
|
|
<input type="hidden" name="mec[in_days][:i:]" value=":val:"/>
|
|
<span class="mec-in-days-day" onclick="mec_in_days_edit(:i:);" title="<?php echo esc_attr__('Click to edit', 'modern-events-calendar-lite'); ?>">:label:</span>
|
|
<span class="mec-not-in-days-remove" onclick="mec_in_days_remove(:i:);">x</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="mec-advanced-wraper">
|
|
<div class="mec-form-row">
|
|
<ul>
|
|
<li>
|
|
<?php esc_html_e('First', 'modern-events-calendar-lite'); ?>
|
|
</li>
|
|
<ul>
|
|
<?php $day_1th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_1th}.1"); ?>">
|
|
<?php esc_html_e($day_1th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_1th); ?>.1-</span>
|
|
</li>
|
|
<?php $day_2th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_2th}.1"); ?>">
|
|
<?php esc_html_e($day_2th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_2th); ?>.1-</span>
|
|
</li>
|
|
<?php $day_3th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_3th}.1"); ?>">
|
|
<?php esc_html_e($day_3th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_3th); ?>.1-</span>
|
|
</li>
|
|
<?php $day_4th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_4th}.1"); ?>">
|
|
<?php esc_html_e($day_4th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_4th); ?>.1-</span>
|
|
</li>
|
|
<?php $day_5th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_5th}.1"); ?>">
|
|
<?php esc_html_e($day_5th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_5th); ?>.1-</span>
|
|
</li>
|
|
<?php $day_6th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_6th}.1"); ?>">
|
|
<?php esc_html_e($day_6th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_6th); ?>.1-</span>
|
|
</li>
|
|
<?php $day_7th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_7th}.1"); ?>">
|
|
<?php esc_html_e($day_7th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_7th); ?>.1-</span>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
<ul>
|
|
<li>
|
|
<?php esc_html_e('Second', 'modern-events-calendar-lite'); ?>
|
|
</li>
|
|
<ul>
|
|
<?php $day_1th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_1th}.2"); ?>">
|
|
<?php esc_html_e($day_1th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_1th); ?>.2-</span>
|
|
</li>
|
|
<?php $day_2th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_2th}.2"); ?>">
|
|
<?php esc_html_e($day_2th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_2th); ?>.2-</span>
|
|
</li>
|
|
<?php $day_3th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_3th}.2"); ?>">
|
|
<?php esc_html_e($day_3th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_3th); ?>.2-</span>
|
|
</li>
|
|
<?php $day_4th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_4th}.2"); ?>">
|
|
<?php esc_html_e($day_4th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_4th); ?>.2-</span>
|
|
</li>
|
|
<?php $day_5th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_5th}.2"); ?>">
|
|
<?php esc_html_e($day_5th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_5th); ?>.2-</span>
|
|
</li>
|
|
<?php $day_6th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_6th}.2"); ?>">
|
|
<?php esc_html_e($day_6th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_6th); ?>.2-</span>
|
|
</li>
|
|
<?php $day_7th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_7th}.2"); ?>">
|
|
<?php esc_html_e($day_7th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_7th); ?>.2-</span>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
<ul>
|
|
<li>
|
|
<?php esc_html_e('Third', 'modern-events-calendar-lite'); ?>
|
|
</li>
|
|
<ul>
|
|
<?php $day_1th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_1th}.3"); ?>">
|
|
<?php esc_html_e($day_1th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_1th); ?>.3-</span>
|
|
</li>
|
|
<?php $day_2th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_2th}.3"); ?>">
|
|
<?php esc_html_e($day_2th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_2th); ?>.3-</span>
|
|
</li>
|
|
<?php $day_3th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_3th}.3"); ?>">
|
|
<?php esc_html_e($day_3th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_3th); ?>.3-</span>
|
|
</li>
|
|
<?php $day_4th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_4th}.3"); ?>">
|
|
<?php esc_html_e($day_4th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_4th); ?>.3-</span>
|
|
</li>
|
|
<?php $day_5th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_5th}.3"); ?>">
|
|
<?php esc_html_e($day_5th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_5th); ?>.3-</span>
|
|
</li>
|
|
<?php $day_6th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_6th}.3"); ?>">
|
|
<?php esc_html_e($day_6th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_6th); ?>.3-</span>
|
|
</li>
|
|
<?php $day_7th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_7th}.3"); ?>">
|
|
<?php esc_html_e($day_7th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_7th); ?>.3-</span>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
<ul>
|
|
<li>
|
|
<?php esc_html_e('Fourth', 'modern-events-calendar-lite'); ?>
|
|
</li>
|
|
<ul>
|
|
<?php $day_1th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_1th}.4"); ?>">
|
|
<?php esc_html_e($day_1th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_1th); ?>.4-</span>
|
|
</li>
|
|
<?php $day_2th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_2th}.4"); ?>">
|
|
<?php esc_html_e($day_2th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_2th); ?>.4-</span>
|
|
</li>
|
|
<?php $day_3th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_3th}.4"); ?>">
|
|
<?php esc_html_e($day_3th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_3th); ?>.4-</span>
|
|
</li>
|
|
<?php $day_4th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_4th}.4"); ?>">
|
|
<?php esc_html_e($day_4th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_4th); ?>.4-</span>
|
|
</li>
|
|
<?php $day_5th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_5th}.4"); ?>">
|
|
<?php esc_html_e($day_5th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_5th); ?>.4-</span>
|
|
</li>
|
|
<?php $day_6th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_6th}.4"); ?>">
|
|
<?php esc_html_e($day_6th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_6th); ?>.4-</span>
|
|
</li>
|
|
<?php $day_7th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_7th}.4"); ?>">
|
|
<?php esc_html_e($day_7th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_7th); ?>.4-</span>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
<ul>
|
|
<li>
|
|
<?php esc_html_e('Last', 'modern-events-calendar-lite'); ?>
|
|
</li>
|
|
<ul>
|
|
<?php $day_1th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_1th}.l"); ?>">
|
|
<?php esc_html_e($day_1th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_1th); ?>.l-</span>
|
|
</li>
|
|
<?php $day_2th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_2th}.l"); ?>">
|
|
<?php esc_html_e($day_2th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_2th); ?>.l-</span>
|
|
</li>
|
|
<?php $day_3th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_3th}.l"); ?>">
|
|
<?php esc_html_e($day_3th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_3th); ?>.l-</span>
|
|
</li>
|
|
<?php $day_4th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_4th}.l"); ?>">
|
|
<?php esc_html_e($day_4th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_4th); ?>.l-</span>
|
|
</li>
|
|
<?php $day_5th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_5th}.l"); ?>">
|
|
<?php esc_html_e($day_5th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_5th); ?>.l-</span>
|
|
</li>
|
|
<?php $day_6th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_6th}.l"); ?>">
|
|
<?php esc_html_e($day_6th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_6th); ?>.l-</span>
|
|
</li>
|
|
<?php $day_7th = $this->main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?>
|
|
<li class="<?php $this->main->mec_active($advanced_days, "{$day_7th}.l"); ?>">
|
|
<?php esc_html_e($day_7th, 'modern-events-calendar-lite'); ?>
|
|
<span class="key"><?php echo esc_html($day_7th); ?>.l-</span>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
<input class="mec-col-2" type="hidden" name="mec[date][repeat][advanced]"
|
|
id="mec_date_repeat_advanced" value="<?php echo esc_attr($advanced_str); ?>"/>
|
|
</div>
|
|
</div>
|
|
<div id="mec_end_wrapper">
|
|
<div class="mec-form-row">
|
|
<h4 class="mec-title"><?php esc_html_e('End Repeat', 'modern-events-calendar-lite'); ?></h4>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<label for="mec_repeat_ends_never">
|
|
<input
|
|
<?php
|
|
if ($mec_repeat_end == 'never') {
|
|
echo 'checked="checked"';
|
|
}
|
|
?>
|
|
type="radio" value="never" name="mec[date][repeat][end]"
|
|
id="mec_repeat_ends_never"/>
|
|
<?php esc_html_e('Never', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-3">
|
|
<label for="mec_repeat_ends_date">
|
|
<input
|
|
<?php
|
|
if ($mec_repeat_end == 'date') {
|
|
echo 'checked="checked"';
|
|
}
|
|
?>
|
|
type="radio" value="date" name="mec[date][repeat][end]"
|
|
id="mec_repeat_ends_date"/>
|
|
<?php esc_html_e('On', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
<input class="mec-col-2" type="text" name="mec[date][repeat][end_at_date]"
|
|
id="mec_date_repeat_end_at_date" autocomplete="off"
|
|
value="<?php echo esc_attr( $this->main->standardize_format( $repeat_end_at_date, $datepicker_format ) ); ?>"/>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-3">
|
|
<label for="mec_repeat_ends_occurrences">
|
|
<input
|
|
<?php
|
|
if ($mec_repeat_end == 'occurrences') {
|
|
echo 'checked="checked"';
|
|
}
|
|
?>
|
|
type="radio" value="occurrences" name="mec[date][repeat][end]"
|
|
id="mec_repeat_ends_occurrences"/>
|
|
<?php esc_html_e('After', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
<input class="mec-col-2" type="text" name="mec[date][repeat][end_at_occurrences]"
|
|
id="mec_date_repeat_end_at_occurrences" autocomplete="off"
|
|
placeholder="<?php esc_html_e('Occurrences times', 'modern-events-calendar-lite'); ?>"
|
|
value="<?php echo esc_attr(($repeat_end_at_occurrences + 1)); ?>"/>
|
|
<span class="mec-tooltip">
|
|
<div class="box top">
|
|
<h5 class="title"><?php esc_html_e('Occurrences times', 'modern-events-calendar-lite'); ?></h5>
|
|
<div class="content">
|
|
<p><?php esc_attr_e('The event repeats will stop after certain number of occurences. For example if you set this option 10, the event will have 10 occurrences.', 'modern-events-calendar-lite'); ?>
|
|
<a href="https://webnus.net/dox/modern-events-calendar/add-event/#End_Repeat" target="_blank"><?php esc_html_e('Read More', 'modern-events-calendar-lite'); ?></a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<i title="" class="dashicons-before dashicons-editor-help"></i>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<label for="mec-one-occurrence">
|
|
<input
|
|
<?php
|
|
if ($one_occurrence == '1') {
|
|
echo 'checked="checked"';
|
|
}
|
|
?>
|
|
type="checkbox" name="mec[date][one_occurrence]" id="mec-one-occurrence" value="1"/>
|
|
<?php esc_html_e('Show only one occurrence of this event', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Show cost option of event into the Add/Edit event page
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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'));
|
|
?>
|
|
<div class="mec-meta-box-fields mec-event-tab-content" id="mec-cost">
|
|
<?php if($currency_per_event): ?>
|
|
<div class="mec-backend-tab-wrap mec-basvanced-toggle" data-for="#mec-cost">
|
|
<div class="mec-backend-tab">
|
|
<div class="mec-backend-tab-item mec-b-active-tab"><?php esc_html_e('Basic', 'modern-events-calendar-lite'); ?></div>
|
|
<div class="mec-backend-tab-item"><?php esc_html_e('Advanced', 'modern-events-calendar-lite'); ?></div>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
<div class="mec-basvanced-basic">
|
|
<h4><?php echo esc_html($this->main->m('event_cost', esc_html__('Event Cost', 'modern-events-calendar-lite'))); ?></h4>
|
|
<div id="mec_meta_box_cost_form" class="<?php echo ($cost_auto_calculate ? 'mec-util-hidden' : ''); ?>">
|
|
<div class="mec-form-row">
|
|
<?php if(apply_filters('mec_event_cost_custom_field_status', false)): ?>
|
|
<?php do_action('mec_event_cost_custom_field', $cost, $type, 'mec[cost]'); ?>
|
|
<?php else: ?>
|
|
<input type="<?php echo ($type === 'alphabetic' ? 'text' : 'number'); ?>" <?php echo ($type === 'numeric' ? 'min="0" step="any"' : ''); ?> class="mec-col-3" name="mec[cost]" id="mec_cost" value="<?php echo esc_attr($cost); ?>" title="<?php esc_html_e('Cost', 'modern-events-calendar-lite'); ?>" placeholder="<?php esc_html_e('Cost', 'modern-events-calendar-lite'); ?>"/>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<?php if($this->getPRO()): ?>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-12">
|
|
<label for="mec_cost_auto_calculate">
|
|
<input type="hidden" name="mec[cost_auto_calculate]" value="0" />
|
|
<input type="checkbox" name="mec[cost_auto_calculate]" id="mec_cost_auto_calculate" <?php echo ($cost_auto_calculate == 1) ? 'checked="checked"' : ''; ?> value="1" onchange="jQuery('#mec_meta_box_cost_form').toggleClass('mec-util-hidden');">
|
|
<?php esc_html_e('Show the minimum price based on tickets', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<div class="mec-basvanced-advanced w-hidden">
|
|
<?php if($currency_per_event): ?>
|
|
<h4><?php echo esc_html__('Currency Options', 'modern-events-calendar-lite'); ?></h4>
|
|
<div class="mec-form-row">
|
|
<label class="mec-col-3" for="mec_currency_currency"><?php esc_html_e('Currency', 'modern-events-calendar-lite'); ?></label>
|
|
<div class="mec-col-4">
|
|
<select name="mec[currency][currency]" id="mec_currency_currency">
|
|
<?php foreach($currencies as $c=>$currency_name): ?>
|
|
<option value="<?php echo esc_attr($c); ?>" <?php echo (($current_currency == $c) ? 'selected="selected"' : ''); ?>><?php echo esc_html($currency_name); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<label class="mec-col-3" for="mec_currency_currency_symptom"><?php esc_html_e('Currency Sign', 'modern-events-calendar-lite'); ?></label>
|
|
<div class="mec-col-4">
|
|
<input type="text" name="mec[currency][currency_symptom]" id="mec_currency_currency_symptom" value="<?php echo (isset($currency['currency_symptom']) ? esc_attr($currency['currency_symptom']) : ''); ?>" />
|
|
<span class="mec-tooltip">
|
|
<div class="box left">
|
|
<h5 class="title"><?php esc_html_e('Currency Sign', 'modern-events-calendar-lite'); ?></h5>
|
|
<div class="content">
|
|
<p><?php esc_attr_e("Default value will be \"currency\" if you leave it empty.", 'modern-events-calendar-lite'); ?>
|
|
<a href="https://webnus.net/dox/modern-events-calendar/add-event/#Cost" target="_blank"><?php esc_html_e('Read More', 'modern-events-calendar-lite'); ?></a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<i title="" class="dashicons-before dashicons-editor-help"></i>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<label class="mec-col-3" for="mec_currency_currency_sign"><?php esc_html_e('Currency Position', 'modern-events-calendar-lite'); ?></label>
|
|
<div class="mec-col-4">
|
|
<select name="mec[currency][currency_sign]" id="mec_currency_currency_sign">
|
|
<option value="before" <?php echo ((isset($currency['currency_sign']) and $currency['currency_sign'] == 'before') ? 'selected="selected"' : ''); ?>><?php esc_html_e('$10 (Before)', 'modern-events-calendar-lite'); ?></option>
|
|
<option value="before_space" <?php echo ((isset($currency['currency_sign']) and $currency['currency_sign'] == 'before_space') ? 'selected="selected"' : ''); ?>><?php esc_html_e('$ 10 (Before with Space)', 'modern-events-calendar-lite'); ?></option>
|
|
<option value="after" <?php echo ((isset($currency['currency_sign']) and $currency['currency_sign'] == 'after') ? 'selected="selected"' : ''); ?>><?php esc_html_e('10$ (After)', 'modern-events-calendar-lite'); ?></option>
|
|
<option value="after_space" <?php echo ((isset($currency['currency_sign']) and $currency['currency_sign'] == 'after_space') ? 'selected="selected"' : ''); ?>><?php esc_html_e('10 $ (After with Space)', 'modern-events-calendar-lite'); ?></option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<label class="mec-col-3" for="mec_currency_thousand_separator"><?php esc_html_e('Thousand Separator', 'modern-events-calendar-lite'); ?></label>
|
|
<div class="mec-col-4">
|
|
<input type="text" name="mec[currency][thousand_separator]" id="mec_currency_thousand_separator" value="<?php echo (isset($currency['thousand_separator']) ? esc_attr($currency['thousand_separator']) : ','); ?>" />
|
|
</div>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<label class="mec-col-3" for="mec_currency_decimal_separator"><?php esc_html_e('Decimal Separator', 'modern-events-calendar-lite'); ?></label>
|
|
<div class="mec-col-4">
|
|
<input type="text" name="mec[currency][decimal_separator]" id="mec_currency_decimal_separator" value="<?php echo (isset($currency['decimal_separator']) ? esc_attr($currency['decimal_separator']) : '.'); ?>" />
|
|
</div>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<label class="mec-col-3" for="mec_currency_decimals"><?php esc_html_e('Decimals', 'modern-events-calendar-lite'); ?></label>
|
|
<div class="mec-col-4">
|
|
<input type="number" name="mec[currency][currency_decimals]" id="mec_currency_decimals" value="<?php echo (isset($currency['currency_decimals']) ? esc_attr((int)$currency['currency_decimals']) : '2'); ?>" />
|
|
</div>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-12">
|
|
<label for="mec_currency_decimal_separator_status">
|
|
<input type="hidden" name="mec[currency][decimal_separator_status]" value="1" />
|
|
<input type="checkbox" name="mec[currency][decimal_separator_status]" id="mec_currency_decimal_separator_status" <?php echo ((isset($currency['decimal_separator_status']) and $currency['decimal_separator_status'] == '0') ? 'checked="checked"' : ''); ?> value="0" />
|
|
<?php esc_html_e('No decimal', 'modern-events-calendar-lite'); ?>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
public function meta_box_fields($post){
|
|
|
|
FormBuilder::event_data( $post );
|
|
}
|
|
|
|
/**
|
|
* Show exceptions options of event into the Add/Edit event page
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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) : [];
|
|
?>
|
|
<div class="mec-meta-box-fields mec-event-tab-content mec-fes-exceptional-days" id="mec-exceptional-days">
|
|
<h4><?php esc_html_e('Exceptional Days (Exclude Dates)', 'modern-events-calendar-lite'); ?></h4>
|
|
<div id="mec_meta_box_exceptions_form">
|
|
<div id="mec_exceptions_not_in_days_container">
|
|
<div class="mec-title">
|
|
<span class="mec-dashicons dashicons dashicons-calendar-alt"></span>
|
|
<label for="mec_exceptions_not_in_days_date"><?php esc_html_e('Exclude certain days', 'modern-events-calendar-lite'); ?></label>
|
|
</div>
|
|
<?php
|
|
$builder = $this->getFormBuilder();
|
|
$builder->exceptionalDays([
|
|
'values' => $not_in_days
|
|
]);
|
|
?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Show hourly schedule options of event into the Add/Edit event page
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @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 = [];
|
|
?>
|
|
<script>
|
|
jQuery(document).ready(function()
|
|
{
|
|
<?php if(current_user_can('upload_files')): ?>
|
|
jQuery('#mec_event_gallery_image_uploader').on('click', function(event)
|
|
{
|
|
event.preventDefault();
|
|
|
|
var frame;
|
|
if(frame)
|
|
{
|
|
frame.open();
|
|
return;
|
|
}
|
|
|
|
frame = wp.media({
|
|
multiple: true
|
|
});
|
|
frame.on('select', function()
|
|
{
|
|
frame.state().get('selection').map(function(attachment)
|
|
{
|
|
var image = attachment.toJSON();
|
|
var image_id = image.id;
|
|
|
|
jQuery('#mec_meta_box_event_gallery').append(`<li class="mec-event-gallery-wrapper-${image_id}" data-id="${image_id}">
|
|
<input type="hidden" name="mec[event_gallery][]" value="${image_id}" />
|
|
<img style="width: 200px;" src="${image.url}" alt="${image.url}" />
|
|
<span class="mec-event-gallery-delete" data-id="${image_id}">x</span>
|
|
</li>`);
|
|
});
|
|
|
|
frame.close();
|
|
mec_event_gallery_delete_listeners();
|
|
});
|
|
|
|
frame.open();
|
|
});
|
|
<?php else: ?>
|
|
jQuery("#mec_event_gallery_image_uploader").on('change', function()
|
|
{
|
|
var fd = new FormData();
|
|
fd.append("action", "mec_event_gallery_image_upload");
|
|
fd.append("_wpnonce", "<?php echo wp_create_nonce('mec_event_gallery_image_upload'); ?>");
|
|
|
|
// Append Images
|
|
jQuery.each(jQuery("#mec_event_gallery_image_uploader")[0].files, function(i, file)
|
|
{
|
|
fd.append('images[]', file);
|
|
});
|
|
|
|
jQuery("#mec_event_gallery_error").html("").addClass("mec-util-hidden");
|
|
jQuery.ajax(
|
|
{
|
|
url: "<?php echo admin_url('admin-ajax.php', NULL); ?>",
|
|
type: "POST",
|
|
data: fd,
|
|
dataType: "json",
|
|
processData: false,
|
|
contentType: false
|
|
})
|
|
.done(function(response)
|
|
{
|
|
if(response.success)
|
|
{
|
|
var images = response.data;
|
|
for (var i = 0; i < response.data.length; i++)
|
|
{
|
|
var image = images[i];
|
|
var image_id = image.id;
|
|
|
|
jQuery('#mec_meta_box_event_gallery').append(`<li class="mec-event-gallery-wrapper-${image_id}" data-id="${image_id}">
|
|
<input type="hidden" name="mec[event_gallery][]" value="${image_id}" />
|
|
<img style="width: 200px;" src="${image.url}" alt="${image.url}" />
|
|
<span class="mec-event-gallery-delete" data-id="${image_id}">x</span>
|
|
</li>`);
|
|
}
|
|
|
|
mec_event_gallery_delete_listeners();
|
|
}
|
|
else
|
|
{
|
|
jQuery("#mec_event_gallery_error").html(response.message).removeClass("mec-util-hidden");
|
|
}
|
|
|
|
// Reset File Input
|
|
jQuery("#mec_event_gallery_image_uploader").val('');
|
|
});
|
|
|
|
return false;
|
|
});
|
|
<?php endif; ?>
|
|
function mec_event_gallery_delete_listeners()
|
|
{
|
|
jQuery('.mec-event-gallery-delete').off('click').on('click', function()
|
|
{
|
|
var id = jQuery(this).data('id');
|
|
jQuery('.mec-event-gallery-wrapper-'+id).remove();
|
|
});
|
|
}
|
|
mec_event_gallery_delete_listeners();
|
|
});
|
|
</script>
|
|
<div id="mec-event-gallery">
|
|
<div id="mec_meta_box_event_gallery_options">
|
|
<?php if(current_user_can('upload_files')): ?>
|
|
<a href="#" type="button" id="mec_event_gallery_image_uploader" data-post-id="<?php echo esc_attr($post->ID); ?>"><?php esc_html_e('Add event gallery images', 'modern-events-calendar-lite'); ?></a>
|
|
<?php else: ?>
|
|
<a href="#" type="file" id="mec_event_gallery_image_uploader" multiple><?php esc_html_e('Add event gallery images', 'modern-events-calendar-lite'); ?></a>
|
|
<?php endif; ?>
|
|
<p class="description"><?php esc_html_e('png, jpg, gif, and webp files are allowed.', 'modern-events-calendar-lite'); ?></p>
|
|
<div class="mec-error mec-util-hidden" id="mec_event_gallery_error"></div>
|
|
</div>
|
|
<ul id="mec_meta_box_event_gallery">
|
|
<?php foreach($gallery as $image_id): $image_url = wp_get_attachment_url($image_id); ?>
|
|
<li class="mec-event-gallery-wrapper-<?php echo esc_attr($image_id); ?>" data-id="<?php echo esc_attr($image_id); ?>">
|
|
<input type="hidden" name="mec[event_gallery][]" value="<?php echo esc_attr($image_id); ?>" />
|
|
<img style="width: 200px;" src="<?php echo esc_url($image_url); ?>" alt="<?php echo esc_url($image_url); ?>" />
|
|
<span class="mec-event-gallery-delete" data-id="<?php echo esc_attr($image_id); ?>">x</span>
|
|
</li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Show read more option of event into the Add/Edit event page
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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);
|
|
?>
|
|
<div class="mec-meta-box-fields mec-event-tab-content mec-fes-event-links" id="mec-read-more">
|
|
<h4><?php esc_html_e('Event Links', 'modern-events-calendar-lite'); ?></h4>
|
|
<div class="mec-form-row">
|
|
<label class="mec-col-2"
|
|
for="mec_read_more_link"><?php echo esc_html($this->main->m('read_more_link', esc_html__('Event Link', 'modern-events-calendar-lite'))); ?></label>
|
|
<input class="mec-col-8" type="text" name="mec[read_more]" id="mec_read_more_link"
|
|
value="<?php echo esc_attr($read_more); ?>"
|
|
placeholder="<?php esc_html_e('eg. http://yoursite.com/your-event', 'modern-events-calendar-lite'); ?>"/>
|
|
<?php do_action('extra_event_link', $post->ID); ?>
|
|
|
|
<span class="mec-tooltip">
|
|
<div class="box top">
|
|
<h5 class="title"><?php esc_html_e('Event Link', 'modern-events-calendar-lite'); ?></h5>
|
|
<div class="content">
|
|
<p><?php esc_attr_e('The value of this option will be replaced by the single event page link on shortcodes. Insert full link including http(s):// - Also, if you use an advertising URL, you can use the URL Shortener.', 'modern-events-calendar-lite'); ?>
|
|
<a href="https://bit.ly/" target="_blank"><?php esc_html_e('URL Shortener', 'modern-events-calendar-lite'); ?></a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<i title="" class="dashicons-before dashicons-editor-help"></i>
|
|
</span>
|
|
</div>
|
|
<div class="mec-form-row">
|
|
<label class="mec-col-2"
|
|
for="mec_more_info_link"><?php echo esc_html($this->main->m('more_info_link', esc_html__('More Info', 'modern-events-calendar-lite'))); ?></label>
|
|
<input class="mec-col-3" type="text" name="mec[more_info]" id="mec_more_info_link"
|
|
value="<?php echo esc_attr($more_info); ?>"
|
|
placeholder="<?php esc_html_e('eg. http://yoursite.com/your-event', 'modern-events-calendar-lite'); ?>"/>
|
|
<input class="mec-col-2" type="text" name="mec[more_info_title]" id="mec_more_info_title"
|
|
value="<?php echo esc_attr($more_info_title); ?>"
|
|
placeholder="<?php esc_html_e('More Information', 'modern-events-calendar-lite'); ?>"/>
|
|
<select class="mec-col-2" name="mec[more_info_target]" id="mec_more_info_target">
|
|
<option value="_self" <?php echo($more_info_target == '_self' ? 'selected="selected"' : ''); ?>><?php esc_html_e('Current Window', 'modern-events-calendar-lite'); ?></option>
|
|
<option value="_blank" <?php echo($more_info_target == '_blank' ? 'selected="selected"' : ''); ?>><?php esc_html_e('New Window', 'modern-events-calendar-lite'); ?></option>
|
|
</select>
|
|
<span class="mec-tooltip">
|
|
<div class="box top">
|
|
<h5 class="title"><?php esc_html_e('More Info', 'modern-events-calendar-lite'); ?></h5>
|
|
<div class="content">
|
|
<p><?php esc_attr_e('This link will appear on the single event page. Insert full link including http(s)://', 'modern-events-calendar-lite'); ?>
|
|
<a href="https://webnus.net/dox/modern-events-calendar/add-event/#Links" target="_blank"><?php esc_html_e('Read More', 'modern-events-calendar-lite'); ?></a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<i title="" class="dashicons-before dashicons-editor-help"></i>
|
|
</span>
|
|
</div>
|
|
<?php if($trailer_url_status): ?>
|
|
<h4><?php esc_html_e('Trailer URL', 'modern-events-calendar-lite'); ?></h4>
|
|
<div class="mec-form-row">
|
|
<div class="mec-col-6" style="padding-right: 10px;">
|
|
<input name="mec[trailer_url]" id="mec_trailer_url" title="<?php esc_attr_e('Trailer URL', 'modern-events-calendar-lite'); ?>" type="url" value="<?php echo trim($trailer_url) ? esc_url($trailer_url) : ''; ?>" class="widefat" placeholder="http://">
|
|
</div>
|
|
<div class="mec-col-5">
|
|
<input name="mec[trailer_title]" id="mec_trailer_title" title="<?php esc_attr_e('Trailer Title', 'modern-events-calendar-lite'); ?>" type="text" value="<?php echo esc_attr($trailer_title); ?>" class="widefat" placeholder="<?php esc_attr_e('Trailer Title', 'modern-events-calendar-lite'); ?>">
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Show booking meta box contents
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @param WP_Post $post
|
|
*/
|
|
public function meta_box_booking($post)
|
|
{
|
|
$gateway_settings = $this->main->get_gateways_options();
|
|
?>
|
|
<div class="mec-add-booking-tabs-wrap">
|
|
<div class="mec-add-booking-tabs-left">
|
|
<a class="mec-add-booking-tabs-link mec-tab-active" data-href="mec_meta_box_booking_options" href="#"><?php echo esc_html__('Booking Options', 'modern-events-calendar-lite'); ?></a>
|
|
<a class="mec-add-booking-tabs-link" data-href="mec-tickets" href="#"><?php echo esc_html__('Tickets', 'modern-events-calendar-lite'); ?></a>
|
|
<?php if(isset($this->settings['taxes_fees_status']) and $this->settings['taxes_fees_status']): ?>
|
|
<a class="mec-add-booking-tabs-link" data-href="mec-fees" href="#"><?php echo esc_html__('Fees', 'modern-events-calendar-lite'); ?></a>
|
|
<?php endif; ?>
|
|
<?php if(isset($this->settings['ticket_variations_status']) and $this->settings['ticket_variations_status']): ?>
|
|
<a class="mec-add-booking-tabs-link" data-href="mec-ticket-variations" href="#"><?php echo esc_html__('Ticket Variations / Options', 'modern-events-calendar-lite'); ?></a>
|
|
<?php endif; ?>
|
|
<a class="mec-add-booking-tabs-link" data-href="mec-reg-fields" href="#"><?php echo esc_html__('Booking Form', 'modern-events-calendar-lite'); ?></a>
|
|
<?php if(isset($gateway_settings['op_status']) && $gateway_settings['op_status'] == 1): ?>
|
|
<a class="mec-add-booking-tabs-link" data-href="mec_meta_box_op_form" href="#"><?php echo esc_html__('Organizer Payment', 'modern-events-calendar-lite'); ?></a>
|
|
<?php endif; ?>
|
|
<?php if(isset($this->settings['downloadable_file_status']) and $this->settings['downloadable_file_status']): ?>
|
|
<a class="mec-add-booking-tabs-link" data-href="mec-downloadable-file" href="#"><?php echo esc_html__('Downloadable File', 'modern-events-calendar-lite'); ?></a>
|
|
<?php endif; ?>
|
|
<?php if(isset($gateway_settings['gateways_per_event']) and $gateway_settings['gateways_per_event']): ?>
|
|
<a class="mec-add-booking-tabs-link" data-href="mec_meta_box_booking_options_form_gateways_per_event" href="#"><?php echo esc_html__('Payment Gateways', 'modern-events-calendar-lite'); ?></a>
|
|
<?php endif; ?>
|
|
<a class="mec-add-booking-tabs-link" data-href="mec_meta_box_booking_options_form_attendees" href="#"><?php echo esc_html__('Bookings', 'modern-events-calendar-lite'); ?></a>
|
|
<?php do_action('add_event_booking_sections_left_menu'); ?>
|
|
</div>
|
|
<div class="mec-add-booking-tabs-right">
|
|
<?php do_action('mec_metabox_booking', $post); ?>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
jQuery(".mec-add-booking-tabs-link").on("click", function(e)
|
|
{
|
|
e.preventDefault();
|
|
var href = jQuery(this).attr("data-href");
|
|
jQuery(".mec-booking-tab-content,.mec-add-booking-tabs-link").removeClass("mec-tab-active");
|
|
jQuery(this).addClass("mec-tab-active");
|
|
jQuery("#" + href ).addClass("mec-tab-active");
|
|
});
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Show booking options of event into the Add/Edit event page
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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();
|
|
?>
|
|
<div id="mec-booking">
|
|
<?php if(!$FES or ($FES and ($fes_booking_tbl or $fes_booking_mtpb or $fes_booking_dpur or $fes_booking_bao or $fes_booking_io or $fes_booking_aa or $fes_booking_lftp or $fes_booking_typ or $fes_booking_bbl or $fes_booking_pp))): ?>
|
|
<div class="mec-booking-tab-content mec-tab-active mec-fes-booking-options" id="mec_meta_box_booking_options">
|
|
|
|
<?php if(!$FES): ?>
|
|
<div class="mec-backend-tab-wrap mec-basvanced-toggle" data-for="#mec-booking" style="margin-top: 40px;">
|
|
<div class="mec-backend-tab">
|
|
<div class="mec-backend-tab-item mec-b-active-tab"><?php esc_html_e('Basic', 'modern-events-calendar-lite'); ?></div>
|
|
<div class="mec-backend-tab-item"><?php esc_html_e('Advanced', 'modern-events-calendar-lite'); ?></div>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<div class="mec-basvanced-basic">
|
|
<?php
|
|
if(!$FES or ($FES and $fes_booking_tbl)){
|
|
|
|
FormBuilder::total_booking_limit( $post );
|
|
}
|
|
|
|
if(!$FES or ($FES and $fes_booking_mtpb)){
|
|
|
|
FormBuilder::minimum_ticket_per_booking( $post );
|
|
}
|
|
?>
|
|
</div>
|
|
<div class="mec-basvanced-advanced w-hidden">
|
|
<?php
|
|
if(isset($this->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 );
|
|
}
|
|
?>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php
|
|
FormBuilder::gateways( $post );
|
|
?>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Show tickets options of event into the Add/Edit event page
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @param WP_Post $post
|
|
*/
|
|
public function meta_box_fees($post){
|
|
|
|
FormBuilder::fees( $post );
|
|
}
|
|
|
|
/**
|
|
* Show ticket variations into the Add/Edit event page
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @param WP_Post $post
|
|
*/
|
|
public function meta_box_attendees($post){
|
|
|
|
FormBuilder::attendees( $post );
|
|
}
|
|
|
|
/**
|
|
* Save event data
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @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 '<a href="'.esc_url(admin_url('edit.php?post_type='.$this->PT.'&mec-expired=1')).'" class="button">'.esc_html__('Expired Events', 'modern-events-calendar-lite').'</a>';
|
|
echo ' <a href="'.esc_url(admin_url('edit.php?post_type='.$this->PT.'&mec-upcoming=1')).'" class="button">'.esc_html__('Upcoming Events', 'modern-events-calendar-lite').'</a>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add filter options in manage events page
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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 '<input type="text" name="mec_start_date" id="mec_start_date" value="' . esc_attr($this->main->standardize_format($start_date, $datepicker_format)) .'" placeholder="' . esc_attr__('Start Date', 'modern-events-calendar-lite') . '" autocomplete="off"/>';
|
|
|
|
$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 '
|
|
<div id="mec_manage_events_lightbox" class="lity-hide">
|
|
<div class="mec-attendees-list-head">'. esc_html__('Attendees List', 'modern-events-calendar-lite') .'</div>
|
|
<div class="mec-attendees-list-wrap">
|
|
<div class="mec-attendees-list-left">
|
|
<div class="mec-attendees-list-left-menu mec-owl-carousel mec-owl-theme">
|
|
|
|
</div>
|
|
</div>
|
|
<div class="mec-attendees-list-right">
|
|
|
|
</div>
|
|
</div>
|
|
</div>';
|
|
}
|
|
|
|
/**
|
|
* Filters columns of events feature
|
|
*
|
|
* @author Webnus <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @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 <info@webnus.net>
|
|
* @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) {
|
|
?>
|
|
<script>
|
|
jQuery(document).ready(function () {
|
|
jQuery('<option>').val('ical-export').text('<?php echo esc_html__('iCal / Outlook Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action']");
|
|
jQuery('<option>').val('ical-export').text('<?php echo esc_html__('iCal / Outlook Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action2']");
|
|
|
|
jQuery('<option>').val('csv-export').text('<?php echo esc_html__('CSV Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action']");
|
|
jQuery('<option>').val('csv-export').text('<?php echo esc_html__('CSV Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action2']");
|
|
|
|
jQuery('<option>').val('g-cal-csv-export').text('<?php echo esc_html__('Google Cal. CSV Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action']");
|
|
jQuery('<option>').val('g-cal-csv-export').text('<?php echo esc_html__('Google Cal. CSV Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action2']");
|
|
|
|
jQuery('<option>').val('ms-excel-export').text('<?php echo esc_html__('MS Excel Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action']");
|
|
jQuery('<option>').val('ms-excel-export').text('<?php echo esc_html__('MS Excel Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action2']");
|
|
|
|
jQuery('<option>').val('xml-export').text('<?php echo esc_html__('XML Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action']");
|
|
jQuery('<option>').val('xml-export').text('<?php echo esc_html__('XML Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action2']");
|
|
|
|
jQuery('<option>').val('json-export').text('<?php echo esc_html__('JSON Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action']");
|
|
jQuery('<option>').val('json-export').text('<?php echo esc_html__('JSON Export', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action2']");
|
|
|
|
jQuery('<option>').val('duplicate').text('<?php echo esc_html__('Duplicate', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action']");
|
|
jQuery('<option>').val('duplicate').text('<?php echo esc_html__('Duplicate', 'modern-events-calendar-lite'); ?>').appendTo("select[name='action2']");
|
|
});
|
|
</script>
|
|
<?php
|
|
}
|
|
}
|
|
|
|
public function do_bulk_actions()
|
|
{
|
|
$wp_list_table = _get_list_table('WP_Posts_List_Table');
|
|
|
|
$action = $wp_list_table->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'] = '<a href="'.esc_url($this->main->add_qs_vars(array('mec-action'=>'duplicate-event', 'id'=>$post->ID))).'">'.esc_html__('Duplicate', 'modern-events-calendar-lite').'</a>';
|
|
}
|
|
|
|
// Booking Button
|
|
if($this->getPRO() && current_user_can('edit_others_posts') && isset($this->settings['booking_status']) && $this->settings['booking_status']) $actions['mec-bookings'] = '<a href="'.esc_url($this->main->add_qs_vars(array('post_type'=>$this->main->get_book_post_type(), 'mec_event_id'=>$post->ID), trim($this->main->URL('admin'), '/ ').'/edit.php')).'">'.esc_html__('Bookings', 'modern-events-calendar-lite').'</a>';
|
|
|
|
// Certificate Button
|
|
if($this->getPRO() && isset($this->settings['certificate_status']) && $this->settings['certificate_status']) $actions['mec-send-certificate'] = '<a href="'.esc_url($this->main->add_qs_vars(['page'=>'MEC-report', 'event_id'=>$post->ID], trim($this->main->URL('admin'), '/ ').'/admin.php')).'">'.esc_html__('Send Certificates', 'modern-events-calendar-lite').'</a>';
|
|
|
|
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 <info@webnus.net>
|
|
* @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 .= '<div class="w-clearfix">
|
|
<div class="w-col-xs-4 name">
|
|
<span>'.esc_html__('Title', 'modern-events-calendar-lite').'</span>
|
|
</div>
|
|
<div class="w-col-xs-3 email">
|
|
<span>'.esc_html__('Attendees', 'modern-events-calendar-lite').'</span>
|
|
</div>
|
|
<div class="w-col-xs-2 ticket">
|
|
<span>'.esc_html__('Transaction ID', 'modern-events-calendar-lite').'</span>
|
|
</div>
|
|
<div class="w-col-xs-3">
|
|
<span>'.esc_html__('Price', 'modern-events-calendar-lite').'</span>
|
|
</div>
|
|
</div>';
|
|
|
|
/** @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 = '<strong>'.count($attendees).'</strong>';
|
|
$attendees_html .= '<div class="mec-booking-attendees-tooltip">';
|
|
$attendees_html .= '<ul>';
|
|
|
|
foreach($unique_attendees as $unique_attendee)
|
|
{
|
|
$attendees_html .= '<li>';
|
|
$attendees_html .= '<div class="mec-booking-attendees-tooltip-name">'.esc_html($unique_attendee['name']).((isset($unique_attendee['count']) and $unique_attendee['count'] > 1) ? ' ('.esc_html($unique_attendee['count']).')' : '').'</div>';
|
|
$attendees_html .= '<div class="mec-booking-attendees-tooltip-email"><a href="mailto:'.esc_attr($unique_attendee['email']).'">'.esc_html($unique_attendee['email']).'</a></div>';
|
|
$attendees_html .= '</li>';
|
|
}
|
|
|
|
$attendees_html .= '</ul>';
|
|
$attendees_html .= '</div>';
|
|
|
|
$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 .= '<div class="w-clearfix">';
|
|
$html .= '<div class="w-col-xs-4">'.($backend ? '<a href="'.get_edit_post_link($booking->ID).'" target="_blank">'.esc_html($booking->post_title).'</a>' : esc_html($booking->post_title)).'</div>';
|
|
$html .= '<div class="w-col-xs-3">'.MEC_kses::form($attendees_html).'</div>';
|
|
$html .= '<div class="w-col-xs-2">'.esc_html($transaction_id).'</div>';
|
|
$html .= '<div class="w-col-xs-3">'.MEC_kses::element($price_html).'</div>';
|
|
$html .= '</div>';
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$html .= '<p class="mec-not-found">'.esc_html__("No Bookings Found!", 'modern-events-calendar-lite').'</p>';
|
|
}
|
|
|
|
$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 = '<p class="mec-success">'.sprintf(esc_html__('%s bookings moved to new date', 'modern-events-calendar-lite'), count($bookings)).'</p>';
|
|
$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 = '<p class="mec-success">'.sprintf(esc_html__('%s bookings canceled (and refunded).', 'modern-events-calendar-lite'), count($bookings)).'</p>';
|
|
else $message = '<p class="mec-success">'.sprintf(esc_html__('%s bookings canceled.', 'modern-events-calendar-lite'), count($bookings)).'</p>';
|
|
|
|
$this->main->response(['success' => 1, 'message' => $message]);
|
|
}
|
|
}
|