option_name); } public function enqueue_assets() { // Enqueue FullCalendar JS and CSS from plugin folder (ensure these files exist) wp_enqueue_script( 'fwp-calendar-fullcalendar-js', plugins_url('fullcalendar.min.js', __FILE__), [], '6.1.8', true ); wp_enqueue_script( 'fwp-calendar-js', plugins_url('calendar.js', __FILE__), ['fwp-calendar-fullcalendar-js'], false, true ); } public function settings_page() { ?>
Invalid calendar ID.
'; } } $events = []; foreach ($urls as $url) { $url = trim($url); $ics_content = @file_get_contents(trim($url)); if (!$ics_content) { error_log("FWP Calendar: Failed to fetch ICS from $url"); continue; } try { $parser = new ICal(); $parser->initString($ics_content); // <-- This is the fix } catch (Exception $e) { error_log('FWP Calendar: Failed to parse ICS: ' . $e->getMessage()); continue; } foreach ($parser->events() as $event) { $start_ts = method_exists($parser, 'iCalDateToTimestamp') ? $parser->iCalDateToTimestamp($event->dtstart) : strtotime($event->dtstart); $end_ts = isset($event->dtend) ? (method_exists($parser, 'iCalDateToTimestamp') ? $parser->iCalDateToTimestamp($event->dtend) : strtotime($event->dtend)) : $start_ts; $events[] = [ 'title' => $event->summary ?? 'No Title', 'start' => date('c', $start_ts), 'end' => date('c', $end_ts), 'url' => $event->url ?? '', ]; } } ob_start(); ?> '; echo '