Öffnungszeiten ausgeben mit ACF

Der Artikel besteht aus 1897 Wörtern. Geschätzte Lesezeit: 07:35 Minuten

Öffnungszeiten

Ich hatte für mein Regionalmagazin schon länger die Idee, eine Übersicht der Öffnungszeiten der Ämter in Stadt und Landkreis Lüneburg zu erstellen.

Bislang scheiterte es vor allem daran, das ich nicht wirklich wusste, wie man dies umsetzen kann. Einfach nur eine Seite mit Tabelle? Nein, das entsprach nicht meiner Vorstellung. Es sollte schon pro Amt / Behörde eine eigene Seite sein.

Letzlich half(en) mir dabei das / die Plugin(s) Advance Custom Fields (ACF) und Custom Post Type UI.

In ACF erstellt man eine Feldgruppe mit den gewünschten Feldern. In meinem Fall waren das fürs erste:

  • Amt
  • Straße
  • PLZ
  • Ort
  • Telefon
  • EMail
  • Öffnungszeiten
  • Webseite
  • Zuständigkeiten

sowie ein Feld 'Aktuell' und ein Feld 'Hinweise'

Die Felder Amt, Straße, Ort, Telefon und Aktuell sind einzeilige Textfelder. PLZ ist numerisch, Webseite ein URL-Feld, EMail natürlich ein EMail-Feld.

Öffnungszeiten selbst ist ein Wiederholungsfeld, das für jeden Tag der (Werk)Woche die Öffnungszeiten für Vormittags und Nachmittags enthält - jeweils als von und bis-Feld

Die Felder Zuständigkeiten und Hinweise sind mehrzeilige Textfelder.

Dann ging es daran, den Code zusammen zu basteln. Ich habe mich dabei an Codeschnippseln orientiert, die ich schon für andere Funktionen auf der Webseite nutze. Zum Beispiel für die Ausgabe der Kontaktdaten, da die meisten der Artikel dort auf Pressemitteilungen beruhen.

Zuerst geht es natürlich darum, die in den Feldern eingegebenen Daten Variablen zuzuweisen und zu speichern. Das funktioniert mit folgendem Code:

$behoerde = array('amt', 'strasse', 'plz', 'ort', 'telefonnummer', 'email');
		$oeffnungszeiten = array("geschlossen", "ganztags geschlossen");
		$wochentage = array( 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag');
		$momentanerWochentag = (int)date("N"); 
 
		$behoerde[0] = get_field("amt");
		$behoerde[1] = get_field("strasse");
		$behoerde[2] = get_field("plz");
		$behoerde[3] = get_field("ort");
		$behoerde[4] = get_field("telefonnummer");
		$behoerde[5] = get_field("email");
 
		$info[0] = get_field("aktuell");
		$info[1] = get_field("webseite");
		$info[2] = get_field("zustaendigkeiten");
		$info[3] = get_field("linktitel");
		$info[4] = get_field("buchungsmail");
		$info[5] = get_field("hinweise");

Als erstes werden die Adressdaten inkl. der Telefonnummer und der EMail-Adresse als Array-Felder der Variablen 'behoerde' zugewiesen. Durch die Zuweisung als Array-Feld kann jedes Feld einzeln angesprochen werden, wie man nachher noch sehen kann. Die Variable oeffungszeiten enthält das, was ausgegeben wird wenn entweder Vormittags oder nachmittags geschlossen ist, oder wenn ganztags nicht geöffnet wird.

Die einzelnen Wochentage werden der Variablen wochentage zugewiesen. Die Variable momentanerWochentag holt sich den aktuellen Wochentag. Mit der müssen wir später noch rechnen, um auf den heutigen Tag zu kommen. Andernfalls wird der heutige Tag + 1 farbig unterlegt. Am Montag würde also der Dienstag markiert.

Gleiches passiert mit den Wochentagen, die der entsprechenden Variablen zugewiesen werden. Die Felder, die zum Beispiel die aktuellen Hinweise beinhalten, werden der Variablen info zugeteilt.

echo '<meta data-name="name" itemprop="name" content="' . $behoerde[0] . '">' . $behoerde[0];
		echo '<br /><br /><meta data-name="streetAddress" itemprop="streetAddress" content="' . $behoerde[1] . '">' . $behoerde[1];
		echo '<br /><br /><meta data-name="postalCode" itemprop="postalCode" content="' . $behoerde[2] . '">' . $behoerde[2] . '<meta data-name="addressLocality" itemprop="addressLocality" content="' .$behoerde[3] . '" />' . ' ' .$behoerde[3];
		echo '<hr />';
		echo '&phone;:' . ' <meta data-name="telephone" itemprop="telephone" content="' .$behoerde[4] . '">' . $behoerde[4];

Mit diesem Code geben wir die Daten aus, die ganz unproblematisch sind, da sie anders als später die Öffnungszeiten keine Bedingungen enthalten. Die Meta-Angaben kann google später für die RichSnippets nutzen. Ansonsten sollte der Code selbst erklärend sein.

if (!empty(behoerde[5])) {
			echo '<br /><br />&#9993;: <a href="mailto:'.$behoerde[5] .'" title="EMail schreiben" ><meta data-name="email" itemprop="email" content="' . $behoerde[5] . '">' . $behoerde[5] . '</a>';
		}

Hier wird geprüft, ob das Feld EMail ausgefüllt wurde, und wenn ja, wird es mit Briefsymbol ausgegeben.

Nun kommen wir zu den Öffnungszeiten selbst. Und hier wird es etwas komplizierter! Denn wir müssen ja prüfen, ob sämtliche Felder für die Öffnungszeiten einen Inhalt haben, und wenn nicht, welche(s) Feld(er) leer ist / sind!

Denn es gibt fünf (in Zahlen 5) mögliche Varianten an Öffnungszeiten:

  • Vormittags und nachmittags geöffnet
  • nur vormittags geöffnet
  • nur nachmittags geöffnet
  • ohne Mittagspause geöffnet
  • ganztags geschlossen

Diese Varianten bringen wir im folgenden Code unter, und testen sie auf ihre Richtigkeit.

if ( have_rows( 'oeffnungszeiten' ) ) :
				while ( have_rows( 'oeffnungszeiten' ) ) : the_row();
					$von1[] = get_sub_field("vorvon");
					$bis1[] = get_sub_field("vorbis");
					$von2[] = get_sub_field("navon");
					$bis2[] = get_sub_field("nabis");
				echo 'Öffnungszeiten: ';
 
		echo '<table border="2">';
			echo '<tr><th width=100></th><th width=200>Vormittags</th><th width=200>Nachmittags</th></tr>';
 
				for ($i = 0, $n = count($von1); $i < $n; $i++) {
 
					if (!empty($von1[$i]) && (!empty($bis1[$i]) && (!empty($von2[$i])) && (!empty($bis2[$i]))) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center"> ' . $von1[$i] . ' - ' . $bis1[$i] . '</td><td align="center"> ' . $von2[$i] . ' - ' . $bis2[$i] .'</td></tr>			';
					} elseif (!empty($von1[$i]) && (!empty($bis1[$i]) && (!empty($von2[$i])) && (!empty($bis2[$i])))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center"> ' . $von1[$i] . ' - ' . $bis1[$i] . '</td><td align="center"> ' . $von2[$i] . ' - ' . $bis2[$i] .'</td></tr>';
					}  
 
					elseif (!empty($von1[$i]) && (!empty($bis1[$i])) && (empty($von2[$i])) && (empty($bis2[$i])) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center"> ' . $von1[$i] . ' - ' . $bis1[$i] . '</td><td align="center"> ' . $oeffnungszeiten[0] . '</td></tr>';
					} elseif (!empty($von1[$i]) && (!empty($bis1[$i])) && (empty($von2[$i])) && (empty($bis2[$i]))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center"> ' . $von1[$i] . ' - ' . $bis1[$i] . '</td><td align="center"> ' . $oeffnungszeiten[0] . '</td></tr>';
					}
 
					elseif (!empty($von1[$i]) && (empty($bis1[$i])) && (empty($von2[$i])) && (!empty($bis2[$i])) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center" colspan="2">' . $von1[$i] . ' - ' . $bis2[$i] . '</td></tr>';
					} elseif (!empty($von1[$i]) && (empty($bis1[$i])) && (empty($von2[$i])) && (!empty($bis2[$i]))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center" colspan="2">' . $von1[$i] . ' - ' . $bis2[$i] . '</td></tr>';
					}
 
					elseif (empty($von1[$i]) && (empty($bis1[$i])) && (empty($von2[$i])) && (empty($bis2[$i])) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center" colspan="2">' . $oeffnungszeiten[1] . '</td></tr>';
					} elseif (empty($von1[$i]) && (empty($bis1[$i])) && (empty($von2[$i])) && (empty($bis2[$i]))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center" colspan="2">' . $oeffnungszeiten[1] . '</td></tr>';
					}
 
					elseif (empty($von1[$i]) && (empty($bis1[$i])) && (!empty($von2[$i])) && (!empty($bis2[$i])) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center">' . $oeffnungszeiten[0] . '</td><td align="center">' . $von2[$i] . ' - ' . $bis2[$i] . '</td></tr>';
					} elseif (empty($von1[$i]) && (empty($bis1[$i])) && (!empty($von2[$i])) && (!empty($bis2[$i]))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center">' . $oeffnungszeiten[0] . '</td><td align="center">' . $von2[$i] . ' - ' . $bis2[$i] . '</td></tr>';
					}
				}

Erst einmal prüfen wir, ob die Felder für die Öffnungszeiten einen Inhalt haben.

Sind die Felder ausgefüllt, wird die Öffnungszeit morgens der Variablen von1 zugewiesen, die Zeit, zu der vormittags geschlossen wird, bekommt die Variable bis1. Für den Nachmittag wird entsprechend verfahren: von2 und bis2

Dann wird die Tabelle initialisiert.

Jede erste Zeile einer Schleife prüft neben den jeweiligen Feldern für die Öffnungszeiten zudem, ob der aktuelle Wochentag ist. Trifft das zu, wird die Öffnungszeit des jeweiligen Tages farbig unterlegt.

Die erste if-elseif-Schleife prüft, ob alle 4 Felder für die Öffnungszeiten ausgefüllt sind. Ist das der Fall, werden die Daten entsprechend ausgegeben.

Trifft dies nicht zu, wird in der nächsten Schleife geprüft, ob die Felder für die Öffnungszeiten am Vormittag gefüllt sind.

Sollte auch das nicht der Fall sein, wird auf die Variante Durchgehend von morgens bis Abends geöffnet geprüft.

Als vorletzte Möglichkeit steht die Prüfung an, ob überhaupt geöffnet ist.

Ist bis hierher keine Schleife erfolgreich durchlaufen worden, bleibt als letzte Möglichkeit, das am Vormittag geschlossen ist und nur am Nachmittag geöffnet wird.

Anschließend wird mit

echo '</table>';

die Tabelle geschlossen und mit

endwhile;
				else : 
				echo 'Keine Öffnungszeiten bekannt';
			endif;

die komplette Schleife geschlossen. Die Ausgabe 'Keine Öffnungszeiten bekannt' erfolgt nur, wenn die Prüfung vor den Schleifen ergeben hat, das sämtliche Felder für die Öffnungszeiten keinen Inhalt haben.

Ich habe dann, wie erwähnt, noch Felder für aktuelle Hinweise und die Zuständigkeiten der jeweiligen Behörde angelegt, und lasse prüfen, ob das jeweilige Feld ausgefüllt wurde.

Entsprechend erfolgt (k)eine Ausgabe

if (!empty($info[0])) {
				echo '<br />';
				echo '<hr />Aktuell: ' . $info[0] . '<br />';
			}
 
			if (!empty($info[1])) {
				echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'  . $info[1] . '" title="' . $info[3] .'">' . $info[3] .'</a><br />';
				echo '<br />';
			}
 
			if (!empty($info[4])) {
				echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="mailto:'  . $info[4] . '" title="' . $info[3] .'">' . $info[3] .'</a><br />';
				echo '<br />';
			}
 
			if (!empty($info[5])) {
				echo '<br />Hinweis:<br />';
				echo '<br />' . $info[5] . '<br /><br /><hr />';
			}
 
			if (!empty($info[2])) {
				echo '<br />Hier können Sie folgendes erledigen:<br />';
				echo '<br />' . $info[2] . '<br /><hr />';
			}

Der Code in der Gesamtübersicht:

// Öffnungszeiten
function Oeffnungszeiten() {
	if (is_singular('oeffnungszeiten')) {
		$behoerde = array('amt', 'strasse', 'plz', 'ort', 'telefonnummer', 'email');
		$oeffnungszeiten = array("geschlossen", "ganztags geschlossen");
		$wochentage = array( 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag');
		$momentanerWochentag = (int)date("N"); 
 
		$behoerde[0] = get_field("amt");
		$behoerde[1] = get_field("strasse");
		$behoerde[2] = get_field("plz");
		$behoerde[3] = get_field("ort");
		$behoerde[4] = get_field("telefonnummer");
		$behoerde[5] = get_field("email");
 
		$info[0] = get_field("aktuell");
		$info[1] = get_field("webseite");
		$info[2] = get_field("zustaendigkeiten");
		$info[3] = get_field("linktitel");
		$info[4] = get_field("buchungsmail");
		$info[5] = get_field("hinweise");
 
		echo '<meta data-name="name" itemprop="name" content="' . $behoerde[0] . '">' . $behoerde[0];
		echo '<br /><br /><meta data-name="streetAddress" itemprop="streetAddress" content="' . $behoerde[1] . '">' . $behoerde[1];
		echo '<br /><br /><meta data-name="postalCode" itemprop="postalCode" content="' . $behoerde[2] . '">' . $behoerde[2] . '<meta data-name="addressLocality" itemprop="addressLocality" content="' .$behoerde[3] . '" />' . ' ' .$behoerde[3];
		echo '<hr />';
		echo '&phone;:' . ' <meta data-name="telephone" itemprop="telephone" content="' .$behoerde[4] . '">' . $behoerde[4];
 
		if (!empty(behoerde[5])) {
			echo '<br /><br />&#9993;: <a href="mailto:'.$behoerde[5] .'" title="EMail schreiben" ><meta data-name="email" itemprop="email" content="' . $behoerde[5] . '">' . $behoerde[5] . '</a>';
		}
 
		echo '<hr />';
 
			if ( have_rows( 'oeffnungszeiten' ) ) :
				while ( have_rows( 'oeffnungszeiten' ) ) : the_row();
					$von1[] = get_sub_field("vorvon");
					$bis1[] = get_sub_field("vorbis");
					$von2[] = get_sub_field("navon");
					$bis2[] = get_sub_field("nabis");				
				echo 'Öffnungszeiten: ';
 
 
		echo '<table border="2">';
			echo '<tr><th width=100></th><th width=200>Vormittags</th><th width=200>Nachmittags</th></tr>';
 
				for ($i = 0, $n = count($von1); $i < $n; $i++) {
 
					if (!empty($von1[$i]) && (!empty($bis1[$i]) && (!empty($von2[$i])) && (!empty($bis2[$i]))) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center"> ' . $von1[$i] . ' - ' . $bis1[$i] . '</td><td align="center"> ' . $von2[$i] . ' - ' . $bis2[$i] .'</td></tr>			';
					} elseif (!empty($von1[$i]) && (!empty($bis1[$i]) && (!empty($von2[$i])) && (!empty($bis2[$i])))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center"> ' . $von1[$i] . ' - ' . $bis1[$i] . '</td><td align="center"> ' . $von2[$i] . ' - ' . $bis2[$i] .'</td></tr>';
					}  
 
					elseif (!empty($von1[$i]) && (!empty($bis1[$i])) && (empty($von2[$i])) && (empty($bis2[$i])) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center"> ' . $von1[$i] . ' - ' . $bis1[$i] . '</td><td align="center"> ' . $oeffnungszeiten[0] . '</td></tr>';
					} elseif (!empty($von1[$i]) && (!empty($bis1[$i])) && (empty($von2[$i])) && (empty($bis2[$i]))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center"> ' . $von1[$i] . ' - ' . $bis1[$i] . '</td><td align="center"> ' . $oeffnungszeiten[0] . '</td></tr>';
					}
 
					elseif (!empty($von1[$i]) && (empty($bis1[$i])) && (empty($von2[$i])) && (!empty($bis2[$i])) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center" colspan="2">' . $von1[$i] . ' - ' . $bis2[$i] . '</td></tr>';
					} elseif (!empty($von1[$i]) && (empty($bis1[$i])) && (empty($von2[$i])) && (!empty($bis2[$i]))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center" colspan="2">' . $von1[$i] . ' - ' . $bis2[$i] . '</td></tr>';
					}
 
					elseif (empty($von1[$i]) && (empty($bis1[$i])) && (empty($von2[$i])) && (empty($bis2[$i])) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center" colspan="2">' . $oeffnungszeiten[1] . '</td></tr>';
					} elseif (empty($von1[$i]) && (empty($bis1[$i])) && (empty($von2[$i])) && (empty($bis2[$i]))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center" colspan="2">' . $oeffnungszeiten[1] . '</td></tr>';
					}
 
					elseif (empty($von1[$i]) && (empty($bis1[$i])) && (!empty($von2[$i])) && (!empty($bis2[$i])) && ($i == $momentanerWochentag - 1)) {
						echo '<tr bgcolor="#ddd"><td align="left">' . $wochentage[$i] . '</td><td align="center">' . $oeffnungszeiten[0] . '</td><td align="center">' . $von2[$i] . ' - ' . $bis2[$i] . '</td></tr>';
					} elseif (empty($von1[$i]) && (empty($bis1[$i])) && (!empty($von2[$i])) && (!empty($bis2[$i]))) {
						echo '<tr><td align="left">' . $wochentage[$i] . '</td><td align="center">' . $oeffnungszeiten[0] . '</td><td align="center">' . $von2[$i] . ' - ' . $bis2[$i] . '</td></tr>';
					}
				}
 
		echo '</table>';
                       endwhile;
                           else : 
				echo 'Keine Öffnungszeiten bekannt';
			endif;
 
			if (!empty($info[0])) {
				echo '<br />';
				echo '<hr />Aktuell: ' . $info[0] . '<br />';
			}
 
			if (!empty($info[1])) {
				echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'  . $info[1] . '" title="' . $info[3] .'">' . $info[3] .'</a><br />';
				echo '<br />';
			}
 
			if (!empty($info[4])) {
				echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="mailto:'  . $info[4] . '" title="' . $info[3] .'">' . $info[3] .'</a><br />';
				echo '<br />';
			}
 
			if (!empty($info[5])) {
				echo '<br />Hinweis:<br />';
				echo '<br />' . $info[5] . '<br /><br /><hr />';
			}
 
			if (!empty($info[2])) {
				echo '<br />Hier können Sie folgendes erledigen:<br />';
				echo '<br />' . $info[2] . '<br /><hr />';
			}
 
		}
}

Ich hoffe, ich konnte dem einen oder anderen weiterhelfen.

Falls jemand Verbesserungsvorschläge hat - gerne her damit!

Über Marcus 725 Artikel
Ich freue mich über Deinen Besuch auf meinem Blog! Wenn Dir der Artikel gefallen hat, teile ihn doch mit anderen und hinterlasse Deine Meinung. Mehr über mich gibt es hier zu lesen

Hinterlasse jetzt einen Kommentar

Kommentar hinterlassen

E-Mail Adresse wird nicht veröffentlicht.


*