5 * MINUTE_IN_SECONDS, 'display' => 'Every 5 Minutes', ]; } return $schedules; }); // Register EventQora post types and taxonomies before rewrite rules are flushed. // Rewrite rules are for EventQora-owned content types. function evqra_enqueue_frontend_assets() { $current_page_id = get_queried_object_id(); $is_payment_page = is_page('payment-process') || ($current_page_id && $current_page_id === absint(get_option('evqra_payment_page_id'))); $is_bookings_page = is_page('my-bookings') || ($current_page_id && $current_page_id === absint(get_option('evqra_my_bookings_page_id'))); if (!EVQRA_Core::is_event_request() && !$is_payment_page && !$is_bookings_page) return; wp_enqueue_style('evqra-style', EVQRA_PLUGIN_URL . 'assets/css/style.css', [], EVQRA_PLUGIN_VERSION); wp_enqueue_style('evqra-events-style', EVQRA_CSS_URL . 'evqra-events.css', [], EVQRA_PLUGIN_VERSION); $core_script_path = EVQRA_PLUGIN_DIR . 'assets/js/script.js'; $core_script_version = file_exists($core_script_path) ? EVQRA_PLUGIN_VERSION . '.' . filemtime($core_script_path) : EVQRA_PLUGIN_VERSION; wp_enqueue_script('evqra-script', EVQRA_JS_URL . 'script.js', ['jquery'], $core_script_version, true); wp_enqueue_script('evqra-events', EVQRA_JS_URL . 'evqra-events.js', ['jquery', 'wp-i18n'], EVQRA_PLUGIN_VERSION, true); wp_set_script_translations('evqra-events', 'eventqora'); if ($is_payment_page) { wp_enqueue_style('evqra-payment', EVQRA_CSS_URL . 'evqra-payment.css', ['evqra-events-style'], EVQRA_PLUGIN_VERSION); $payment_script_path = EVQRA_PLUGIN_DIR . 'assets/js/payment.js'; $payment_script_version = file_exists($payment_script_path) ? (string) filemtime($payment_script_path) : EVQRA_PLUGIN_VERSION; wp_enqueue_script('evqra-payment', EVQRA_JS_URL . 'payment.js', ['wp-i18n'], $payment_script_version, true); wp_set_script_translations('evqra-payment', 'eventqora'); } if (is_singular('evqra_event') || is_singular('evqra_venue') || is_singular('evqra_organizer') || is_tax('evqra_event_category')) { wp_enqueue_script('evqra-single-pages', EVQRA_JS_URL . 'evqra-single-pages.js', ['wp-i18n'], EVQRA_PLUGIN_VERSION, true); wp_set_script_translations('evqra-single-pages', 'eventqora'); } if (is_singular('evqra_event')) { wp_enqueue_style('evqra-single-event', EVQRA_CSS_URL . 'evqra-single-event.css', ['evqra-events-style'], EVQRA_PLUGIN_VERSION); $booking_script_path = EVQRA_PLUGIN_DIR . 'assets/js/evqra-booking.js'; $booking_script_version = file_exists($booking_script_path) ? EVQRA_PLUGIN_VERSION . '.' . filemtime($booking_script_path) : EVQRA_PLUGIN_VERSION; wp_enqueue_script('evqra-booking', EVQRA_JS_URL . 'evqra-booking.js', ['jquery', 'wp-i18n'], $booking_script_version, true); wp_set_script_translations('evqra-booking', 'eventqora'); wp_localize_script('evqra-booking', 'evqraBooking', ['ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('evqra_booking_nonce')]); } wp_localize_script('evqra-events', 'evqraAjax', ['ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('evqra_events_nonce'), 'site_url' => home_url('/'), 'ical_feed' => home_url('/?evqra_feed=ical')]); } add_action('wp_enqueue_scripts', 'evqra_enqueue_frontend_assets', 20); function evqra_enqueue_frontend_overrides() { if (is_admin()) return; $current_page_id = get_queried_object_id(); $is_evqra_page = EVQRA_Core::is_event_request() || is_page('my-bookings') || is_page('payment-process') || ($current_page_id && ($current_page_id === absint(get_option('evqra_payment_page_id')) || $current_page_id === absint(get_option('evqra_my_bookings_page_id')))); if (!$is_evqra_page) return; wp_enqueue_style('evqra-overrides', EVQRA_CSS_URL . 'evqra-2-0-9-overrides.css', ['evqra-events-style'], EVQRA_PLUGIN_VERSION); if (is_page('my-bookings') && is_user_logged_in()) { wp_enqueue_style('evqra-my-bookings', EVQRA_PLUGIN_URL . 'assets/css/my-bookings.css', ['evqra-overrides'], EVQRA_PLUGIN_VERSION); wp_enqueue_script('evqra-my-bookings', EVQRA_PLUGIN_URL . 'assets/js/my-bookings.js', ['wp-i18n'], EVQRA_PLUGIN_VERSION, true); wp_set_script_translations('evqra-my-bookings', 'eventqora'); } } add_action('wp_enqueue_scripts', 'evqra_enqueue_frontend_overrides', 1000); /** * Load the optional Google Maps API for EventQora event requests. * * Calendar rendering itself is handled by EventQora's server-side renderer. */ function evqra_enqueue_google_maps_asset() { if (!EVQRA_Core::is_event_request()) { return; } $maps_enabled = get_option('evqra_google_maps_enabled', 0); $maps_api_key = get_option('evqra_google_maps_api_key', ''); if ($maps_enabled && $maps_api_key) { wp_enqueue_script( 'evqra-google-maps', 'https://maps.googleapis.com/maps/api/js?key=' . rawurlencode($maps_api_key) . '&loading=async', [], null, true ); } } add_action('wp_enqueue_scripts', 'evqra_enqueue_google_maps_asset', 25); function evqra_enqueue_admin_assets($hook) { $screen = function_exists('get_current_screen') ? get_current_screen() : null; $page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_SPECIAL_CHARS) ? sanitize_key(wp_unslash(filter_input(INPUT_GET, 'page', FILTER_SANITIZE_SPECIAL_CHARS))) : ''; $is_evqra_screen = $screen && in_array($screen->post_type, ['evqra_event', 'evqra_booking'], true); $is_evqra_screen = $is_evqra_screen || ($page !== '' && str_starts_with($page, 'eventqora-')); if (!$is_evqra_screen) { return; } wp_enqueue_style('evqra-admin-style', EVQRA_PLUGIN_URL . 'assets/css/admin.css', [], EVQRA_PLUGIN_VERSION); $is_event_editor = ($hook === 'post-new.php' || $hook === 'post.php'); if ($is_event_editor) { global $post; $is_event_editor = ($post instanceof WP_Post && $post->post_type === 'evqra_event'); } if ($is_event_editor) { wp_enqueue_media(); $event_admin_css = EVQRA_PLUGIN_DIR . 'assets/css/admin-event.css'; $event_admin_js = EVQRA_PLUGIN_DIR . 'assets/js/admin-event.js'; $event_admin_asset_version = static function ($path) { return file_exists($path) ? EVQRA_PLUGIN_VERSION . '.' . filemtime($path) : EVQRA_PLUGIN_VERSION; }; wp_enqueue_style( 'evqra-event-admin-style', EVQRA_PLUGIN_URL . 'assets/css/admin-event.css', ['dashicons'], $event_admin_asset_version($event_admin_css) ); wp_enqueue_script('jquery-ui-tabs'); wp_enqueue_script( 'evqra-event-admin-script', EVQRA_PLUGIN_URL . 'assets/js/admin-event.js', ['jquery', 'jquery-ui-tabs', 'wp-i18n'], $event_admin_asset_version($event_admin_js), true ); wp_set_script_translations('evqra-event-admin-script', 'eventqora'); wp_enqueue_script('evqra-admin-gallery', EVQRA_JS_URL . 'evqra-admin-gallery.js', ['jquery', 'wp-i18n'], EVQRA_PLUGIN_VERSION, true); wp_set_script_translations('evqra-admin-gallery', 'eventqora'); return; } wp_enqueue_script('evqra-admin-script', EVQRA_JS_URL . 'admin.js', ['jquery', 'wp-i18n'], EVQRA_PLUGIN_VERSION, true); wp_set_script_translations('evqra-admin-script', 'eventqora'); wp_localize_script('evqra-admin-script', 'evqraAdminAjax', ['ajax_url' => admin_url('admin-ajax.php')]); if ( filter_input(INPUT_GET, 'page', FILTER_SANITIZE_SPECIAL_CHARS) === 'evqra-event-import' && filter_input(INPUT_GET, 'import', FILTER_SANITIZE_SPECIAL_CHARS) === 'success' ) { add_action('admin_notices', function () { echo '
' . esc_html__('Events imported successfully!', 'eventqora') . '
' . esc_html__('No upcoming events found.', 'eventqora') . '
'; return ob_get_clean(); } function evqra_use_custom_event_template($template) { if (is_singular('evqra_event')) { $custom = EVQRA_PLUGIN_DIR . 'templates/single-evqra_event.php'; if (file_exists($custom)) return $custom; } return $template; } add_filter('template_include', 'evqra_use_custom_event_template'); function evqra_use_payment_template($template) { $current_page_id = get_queried_object_id(); $is_payment_page = is_page('payment-process') || ($current_page_id && $current_page_id === absint(get_option('evqra_payment_page_id'))); if ($is_payment_page) { $custom = EVQRA_PLUGIN_DIR . 'templates/page-payment-process.php'; if (file_exists($custom)) return $custom; } return $template; } add_filter('template_include', 'evqra_use_payment_template'); function evqra_load_extensions() { $manager = class_exists('EVQRA_Extension_Manager') ? new EVQRA_Extension_Manager() : null; if ($manager) { $manager->discover(); $manager->validate(); $manager->boot(); } } add_action('plugins_loaded', 'evqra_load_extensions', 20); /*-------------------------------------------------------------- # Managed Frontend Pages & Activation --------------------------------------------------------------*/ function evqra_get_or_create_managed_page($key, $title, $slug, $content = '', $template = '') { $option = 'evqra_page_' . sanitize_key($key) . '_id'; $page_id = absint(get_option($option)); if ($page_id && get_post($page_id) && get_post_status($page_id) !== 'trash') return $page_id; $page = get_page_by_path($slug, OBJECT, 'page'); if ($page instanceof WP_Post) { update_option($option, $page->ID); if ($key === 'my_bookings') update_option('evqra_my_bookings_page_id', $page->ID); if ($key === 'payment') update_option('evqra_payment_page_id', $page->ID); if ($key === 'events') update_option('evqra_events_page_id', $page->ID); if ($key === 'venues') update_option('evqra_venues_page_id', $page->ID); if ($key === 'categories') update_option('evqra_categories_page_id', $page->ID); if ($key === 'organizers') update_option('evqra_organizers_page_id', $page->ID); return $page->ID; } $page_id = wp_insert_post(['post_title' => $title, 'post_name' => $slug, 'post_content' => $content, 'post_status' => 'publish', 'post_type' => 'page'], true); if (is_wp_error($page_id)) return 0; update_post_meta($page_id, '_evqra_managed_page', 1); update_option($option, $page_id); if ($key === 'my_bookings') update_option('evqra_my_bookings_page_id', $page_id); if ($key === 'payment') update_option('evqra_payment_page_id', $page_id); if ($key === 'events') update_option('evqra_events_page_id', $page_id); if ($key === 'venues') update_option('evqra_venues_page_id', $page_id); if ($key === 'categories') update_option('evqra_categories_page_id', $page_id); if ($key === 'organizers') update_option('evqra_organizers_page_id', $page_id); if ($template) update_post_meta($page_id, '_wp_page_template', $template); return $page_id; } function evqra_create_frontend_pages() { evqra_get_or_create_managed_page('events', __('Events', 'eventqora'), 'events', '[evqra_event_list]'); evqra_get_or_create_managed_page('venues', __('Venues', 'eventqora'), 'venues', '[evqra_venue_list]'); evqra_get_or_create_managed_page('categories', __('Event Categories', 'eventqora'), 'event-categories', '[evqra_event_categories]'); evqra_get_or_create_managed_page('organizers', __('Organizers', 'eventqora'), 'organizers', '[evqra_organizer_list]'); evqra_get_or_create_managed_page('my_bookings', __('My Bookings', 'eventqora'), 'my-bookings', '', 'user-profile/my-bookings.php'); evqra_get_or_create_managed_page('payment', __('Payment Process', 'eventqora'), 'payment-process', '', 'page-payment-process.php'); } function evqra_register_types_for_rewrite_flush() { if (class_exists('EVQRA_Event_Manager')) (new EVQRA_Event_Manager())->register_event_post_type(); if (class_exists('EVQRA_Venue_Manager')) (new EVQRA_Venue_Manager())->register_post_type(); if (class_exists('EVQRA_Organizer_Manager')) (new EVQRA_Organizer_Manager())->register_post_type(); if (class_exists('EVQRA_Booking_Manager')) (new EVQRA_Booking_Manager())->register_booking_post_type(); if (class_exists('EVQRA_Event_Category_Manager')) (new EVQRA_Event_Category_Manager())->register_evqra_event_category_taxonomy(); } function evqra_activate_plugin() { evqra_register_types_for_rewrite_flush(); evqra_create_frontend_pages(); if (class_exists('EVQRA_Ticket_Inventory')) EVQRA_Ticket_Inventory::install(); if (class_exists('EVQRA_Payment_Ledger')) EVQRA_Payment_Ledger::install(); if (class_exists('EVQRA_Ticket_Reservation')) EVQRA_Ticket_Reservation::install(); if (class_exists('EVQRA_Cancellation_Manager')) EVQRA_Cancellation_Manager::install(); if (class_exists('EVQRA_Booking_Item_Manager')) EVQRA_Booking_Item_Manager::install(); if (class_exists('EVQRA_Attendee_Manager')) EVQRA_Attendee_Manager::install(); if (class_exists('EVQRA_Occurrence_Engine')) EVQRA_Occurrence_Engine::install(); if (class_exists('EVQRA_Occurrence_Inventory')) EVQRA_Occurrence_Inventory::install(); if (class_exists('EVQRA_Occurrence_Inventory')) EVQRA_Occurrence_Inventory::install(); update_option('evqra_rewrite_version', EVQRA_PLUGIN_VERSION); flush_rewrite_rules(); } register_activation_hook(__FILE__, 'evqra_activate_plugin'); function evqra_upgrade_plugin() { $current = get_option('evqra_rewrite_version', '0'); if (version_compare($current, EVQRA_PLUGIN_VERSION, '>=')) return; evqra_create_frontend_pages(); if (class_exists('EVQRA_Ticket_Inventory')) EVQRA_Ticket_Inventory::install(); if (class_exists('EVQRA_Ticket_Reservation')) EVQRA_Ticket_Reservation::install(); if (class_exists('EVQRA_Cancellation_Manager')) EVQRA_Cancellation_Manager::install(); if (class_exists('EVQRA_Booking_Item_Manager')) EVQRA_Booking_Item_Manager::install(); if (class_exists('EVQRA_Attendee_Manager')) EVQRA_Attendee_Manager::install(); if (class_exists('EVQRA_Occurrence_Engine')) EVQRA_Occurrence_Engine::install(); update_option('evqra_rewrite_version', EVQRA_PLUGIN_VERSION); wp_clear_scheduled_hook('evqra_release_expired_reservations'); if (!wp_next_scheduled('evqra_release_expired_reservations')) wp_schedule_event(time() + 300, 'evqra_five_minutes', 'evqra_release_expired_reservations'); flush_rewrite_rules(false); } add_action('init', 'evqra_upgrade_plugin', 99); add_action('save_post_evqra_event', function ($post_id, $post, $update) { if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (wp_is_post_revision($post_id) || wp_is_post_autosave($post_id)) return; if (class_exists('EVQRA_Occurrence_Engine')) EVQRA_Occurrence_Engine::maybe_invalidate_event($post_id); }, 20, 3);