Termin Kalender als CSV Datei

Estimated reading: 7 minutes 241 views

Zeigt Terminliste aus einer CSV Datei mit den Veranstaltungsorten auf einer Openstreetmap Karte an (dazu muss der Längen und Breitengrad einer Veranstaltung mit eingeben werden.

Dazu folgenden Shortcode einfügen:

[ ch_termine ]

Die Datei „termine.csv“ muss im Verzeichnis /csv abgelegt werden.

Dieser Schortcode zeigt die nächsten drei Veranstaltungen an:

[ ch_events title=“Kommende Veranstaltungen“ show_title=“no“ ]

/* ------------------- Termin Kalender ------------------------- */

// Fügen Sie diesen Code in Ihre functions.php ein


function termine_shortcode($atts) {
    // Standardwerte für Attribute
    $atts = shortcode_atts(array(
        'file' => 'termine.csv', // Standard-CSV-Datei
    ), $atts);

    // CSV-Datei einlesen
    $filename = get_site_url() . '/csv/' . $atts['file'];
    $termine = [];

    if (($handle = fopen($filename, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $termine[] = [
                'von' => DateTime::createFromFormat('d.m.Y', $data[0])->format('Y-m-d'),
                'bis' => DateTime::createFromFormat('d.m.Y', $data[1])->format('Y-m-d'),
                'uhrzeit' => $data[2],
                'veranstaltung' => $data[3],
                'breitengrad' => $data[4],
                'laengengrad' => $data[5],
                'link' => $data[6],
                'von_anzeige' => $data[0],
                'bis_anzeige' => $data[1]
            ];
        }
        fclose($handle);
    }

    // Aktuelles Datum
    $heute = date('Y-m-d');

    // Sortierung
    $sort = isset($_GET['sort']) ? sanitize_text_field($_GET['sort']) : 'von';
    $order = isset($_GET['order']) && $_GET['order'] === 'desc' ? SORT_DESC : SORT_ASC;

    // Suche
    $search = isset($_GET['search']) ? sanitize_text_field($_GET['search']) : '';

    // Filtern und Sortieren der Termine
    $gefilterte_termine = array_filter($termine, function($termin) use ($heute, $search) {
        return $termin['von'] >= $heute && 
               (empty($search) || 
                stripos($termin['veranstaltung'], $search) !== false ||
                stripos($termin['von_anzeige'], $search) !== false ||
                stripos($termin['bis_anzeige'], $search) !== false ||
                stripos($termin['uhrzeit'], $search) !== false ||
                stripos($termin['breitengrad'], $search) !== false ||
                stripos($termin['laengengrad'], $search) !== false);
    });

    array_multisort(array_column($gefilterte_termine, $sort), $order, $gefilterte_termine);

    // HTML-Ausgabe
    ob_start();
    ?>
	
	<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" ></script>
        document.addEventListener('DOMContentLoaded', function() {
            var map = L.map('map').setView([0, 0], 2);
            L.tileLayer('https://{s}.tile.openstreetmap.de/{z}/{x}/{y}.png', {
                attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
            }).addTo(map);
			
            var markers = [];
            <?php foreach ($gefilterte_termine as $termin): ?>
                <?php if (!empty($termin['breitengrad']) && !empty($termin['laengengrad'])): ?>
                markers.push(L.marker([<?php echo $termin['breitengrad']; ?>, <?php echo $termin['laengengrad']; ?>])
                    .addTo(map)
                    .bindPopup("<b><?php echo esc_js($termin['von_anzeige']); ?> </b><br><?php echo esc_js($termin['veranstaltung']); ?>"));
                <?php endif; ?>
            <?php endforeach; ?>

            if (markers.length > 0) {
                var group = new L.featureGroup(markers);
                map.fitBounds(group.getBounds());
            }
        });
    </script>
	<div id="map" style="height: 400px; margin-top: 20px;"></div>
	<br>
	
    <div class="termine-container" style="white-space: nowrap; overflow-x:auto;">
        <form method="GET">
            <input type="text" name="search" value="<?php echo esc_attr($search); ?>" placeholder="Suchen...">
            <input type="submit" value="Suchen">
        </form>

        <table class="termine-table" style="white-space: normal;">
            <tr><th>Lfd.</th>
                <th><a href="<?php echo add_query_arg(['sort' => 'von', 'order' => ($sort === 'von' && $order === SORT_ASC ? 'desc' : 'asc')]); ?>">Von</a></th>
                <th><a href="<?php echo add_query_arg(['sort' => 'bis', 'order' => ($sort === 'bis' && $order === SORT_ASC ? 'desc' : 'asc')]); ?>">Bis</a></th>
                <th><a href="<?php echo add_query_arg(['sort' => 'uhrzeit', 'order' => ($sort === 'uhrzeit' && $order === SORT_ASC ? 'desc' : 'asc')]); ?>">Uhrzeit</a></th>
                <th><a href="<?php echo add_query_arg(['sort' => 'veranstaltung', 'order' => ($sort === 'veranstaltung' && $order === SORT_ASC ? 'desc' : 'asc')]); ?>">Veranstaltung</th>
              <!--  <th><a href="<?php echo add_query_arg(['sort' => 'breitengrad', 'order' => ($sort === 'breitengrad' && $order === SORT_ASC ? 'desc' : 'asc')]); ?>">Breitengrad</a></th> -->
              <!--  <th><a href="<?php echo add_query_arg(['sort' => 'laengengrad', 'order' => ($sort === 'laengengrad' && $order === SORT_ASC ? 'desc' : 'asc')]); ?>">Längengrad</a></th> -->
                <th>Link</th>
            </tr>
			
            <?php
			$lfd = 1;
			foreach ($gefilterte_termine as $termin): ?>
            <tr>
				<td><? echo $lfd; ++$lfd; ?></td>
                <td><?php echo esc_html($termin['von_anzeige']); ?></td>
                <td><?php echo esc_html($termin['bis_anzeige']); ?></td>
                <td><?php echo esc_html($termin['uhrzeit']); ?></td>
                <td><?php echo esc_html($termin['veranstaltung']); ?></td>
            <!--    <td> echo esc_html($termin['breitengrad']); ></td> -->
            <!--    <td> echo esc_html($termin['laengengrad']); ></td> -->
                <td><a href="<?php echo esc_url($termin['link']); ?>" target="_blank">Link</a></td>
            </tr>
            <?php endforeach; ?>
        </table>
		
    </div>

    <style>
        .termine-table {border-collapse: collapse; width: 100%; margin-bottom: 20px;}
        .termine-table th, .termine-table td {border: 1px solid #ddd; padding: 8px; text-align: left;}
        .termine-table th {background-color: #f2f2f2;}
        .termine-table tr:nth-child(even) {background-color: #f9f9f9;}
    </style>
    <?php
    return ob_get_clean();
}
add_shortcode('ch_termine', 'termine_shortcode');

function next_three_events_shortcode($atts) {
    // Attribute festlegen
    $atts = shortcode_atts(
        array(
            'title' => 'Nächste Termine',
            'show_title' => 'yes',
        ),
        $atts,
        'next_three_events'
    );

    // Pfad zur CSV-Datei
    $filename = get_site_url() . '/csv/termine.csv';

    $termine = [];
    $heute = date('Y-m-d');

    if (($handle = fopen($filename, "r")) !== FALSE) {
        // Überspringen der Kopfzeile
        fgetcsv($handle, 1000, ",");
        
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $von_datum = DateTime::createFromFormat('d.m.Y', $data[0])->format('Y-m-d');
            if ($von_datum >= $heute) {
                $termine[] = [
                    'von' => $von_datum,
                    'bis' => DateTime::createFromFormat('d.m.Y', $data[1])->format('Y-m-d'),
                    'uhrzeit' => $data[2],
                    'veranstaltung' => $data[3],
                    'breitengrad' => $data[4],
                    'laengengrad' => $data[5],
                    'link' => $data[6],
                    'von_anzeige' => $data[0],
                    'bis_anzeige' => $data[1]
                ];
            }
        }
        fclose($handle);
    }

    // Sortieren der Termine nach Datum
    usort($termine, function($a, $b) {
        return strcmp($a['von'], $b['von']);
    });

    // Nur die nächsten 3 Termine auswählen
    $next_events = array_slice($termine, 0, 3);

    // Output generieren
    ob_start();

    if ($atts['show_title'] === 'yes') {
        echo "<h2>" . esc_html($atts['title']) . "</h2>";
    }

    if (empty($next_events)) {
        echo "<p>Derzeit sind keine bevorstehenden Termine geplant.</p>";
    } else {
        echo "<ul class='next-events' style='background: #f7f8f9;'>";
        foreach ($next_events as $event) {
            echo "<li >";
            
            echo "Datum: " . esc_html($event['von_anzeige']);
            if ($event['von_anzeige'] != $event['bis_anzeige']) {
                echo " - " . esc_html($event['bis_anzeige']);
            }
            
			if( !empty($event['uhrzeit']) ) {
            echo "&nbsp;&nbsp;  Uhrzeit: " . esc_html($event['uhrzeit']) ;
			}
            
			
			echo "<br><strong>" . esc_html($event['veranstaltung']) . "</strong><br>";
			
			if (!empty($event['link'])) {
                echo "<a href='" . esc_url($event['link']) . "' target='_blank'>Mehr Info</a>
				<hr style='border: 1px solid lightgray;font-size: 0px;' >";
            }
			
            echo "</li>";
        }
        echo "</ul>";
		
	
    }
	echo "<a href='/termine/'>komplette <b>Übersicht</b> aller Termine</a>";
	echo " / ";
	echo "<a href='/termine/'>neuen Termin kostenlos melden</a>";
    return ob_get_clean();
}
/*
 * [ch_events title="Kommende Veranstaltungen" show_title="no"]
 * Die Attribute, die Sie anpassen können, sind:
 * title: Ändert den Titel der Terminliste (Standard: "Nächste Termine")
 * show_title: Bestimmt, ob der Titel angezeigt wird oder nicht (Werte: "yes" oder "no", Standard: "yes")
 */
add_shortcode('ch_next_event', 'next_three_events_shortcode');

Das CSV Format für die Datei: termine.csv

Von Datum, Bis Datum, Uhrzeit, Veranstaltung, Längengrad, Breitengrad, Link

05.07.2024,07.07.2024,8-16 Uhr,"38. Internationales Amateurfunktreffen in Gosau a. Dachstein  145.712.5 Gasthof-Pension KIRCHENWIRT, Gosau 2, A-4824 Gosau",47.5798056,13.5260278,https://www.oevsv.at/oevsv/veranstaltungen/

Wenn ein Komma im Text vorkommt, dann bitte den Text in “ Anführungszeichen setzen.

Termin Kalender als CSV Datei