Shortcode – Dynamiske åbningstider

Denne kodepakke til WordPress giver dig to indbyggede shortcodes, som håndterer og viser virksomhedens åbningstider fuldautomatisk – uden eksterne plugins, kun ren PHP.

[business_status]

Viser live-status (“Telefonen er åben / lukket”):

  • Læser den aktuelle dato og tid fra WordPress’ tidszone – intet behov for manuelt tids­justering.

  • Tjekker først, om dagen er en ferielukkedag; hvis ja, vises en ferietekst.

  • Hvis ikke feriedag, kontrolleres weekend-lukning.

  • Finder derefter dagens åbningstider – enten de normale ugedags­tider eller en special-dags-tabel med afvigende timer.

  • Sammenligner tider via strtotime() for sikker håndtering af tider som rigtige timestamps.

  • Returnerer en <div> med passende SVG-ikon og tekst, så frontenden kan styles frit.

[business_schedule]

Genererer en oversigt med:

  1. Normale åbningstider for alle ugedage

  2. Liste over ferielukkedage

  3. Liste over specifikke åbningsdage (custom days)

Den markerer automatisk den aktuelle dag med klassen today, i den liste hvor den faktisk hører til:

  • Hvis i dag er ferielukket → markeres i “Andre lukkedage”.

  • Hvis i dag har særlige timer → markeres i “Specielle åbningsdage”.

  • Ellers markeres dagens ugedagslinje i de normale tider.

Indsæt i pluginnet "Snippets"

/* -------------------------------------------------
 *  Fælles konfiguration til åbningstider
 * ------------------------------------------------- */
function my_business_config() {
    return [
        'weekday_hours' => [ // standard pr. ugedag
            'Monday'    => ['start' => '08:30', 'end' => '16:30'],
            'Tuesday'   => ['start' => '08:30', 'end' => '16:30'],
            'Wednesday' => ['start' => '08:30', 'end' => '16:30'],
            'Thursday'  => ['start' => '08:30', 'end' => '16:30'],
            'Friday'    => ['start' => '08:30', 'end' => '16:30'],
            'Saturday'  => ['start' => 'Closed', 'end' => 'Closed'],
            'Sunday'    => ['start' => 'Closed', 'end' => 'Closed'],
        ],
        'holiday_dates' => [           // ferielukkedage
            '24-12-2025',
            '25-12-2025',
        ],
        'custom_days' => [             // special-dage
            /*'06-06-2025' => ['start' => '08:30', 'end' => '13:30'],*/
        ],
    ];
}

/* -------------------------------------------------
 *  [business_status]  – samme som før (uforandret)
 * ------------------------------------------------- */
function business_status_shortcode() {
    $cfg = my_business_config();
    $weekday_hours = $cfg['weekday_hours'];
    $holiday_dates = $cfg['holiday_dates'];
    $custom_days   = $cfg['custom_days'];

    $now = current_datetime();                       // WP-tidszone:contentReference[oaicite:2]{index=2}
    $day_en   = $now->format('l');
    $date_dmy = $now->format('d-m-Y');
    $time_hi  = $now->format('H:i');

    $icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="24" height="24"><path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512z"/></svg>';
    $open  = 'Telefonen er åben';
    $closed= 'Telefonen er lukket';
    $holiday = 'I dag har vi lukket, akut ring: +45 28 43 40 02';

    if (in_array($date_dmy,$holiday_dates,true))
        return '<div class="business-status holiday">'.$icon.' '.$holiday.'</div>';

    if ($day_en==='Saturday'||$day_en==='Sunday')
        return '<div class="business-status closed">'.$icon.' '.$closed.'</div>';

    $hours = $weekday_hours[$day_en];

    if (isset($custom_days[$date_dmy])) $hours = $custom_days[$date_dmy];
    if ($hours['start']==='Closed')
        return '<div class="business-status closed">'.$icon.' '.$closed.'</div>';

    $now_ts = strtotime($time_hi);
    if ($now_ts >= strtotime($hours['start']) && $now_ts <= strtotime($hours['end']))
        return '<div class="business-status open">'.$icon.' '.$open.'</div>';

    return '<div class="business-status closed">'.$icon.' '.$closed.'</div>';
}
add_shortcode('business_status','business_status_shortcode');


/* -------------------------------------------------
 *  [business_schedule] – med .today-markering
 * ------------------------------------------------- */
function business_schedule_shortcode() {

    $cfg = my_business_config();
    $weekday_hours = $cfg['weekday_hours'];
    $holiday_dates = $cfg['holiday_dates'];
    $custom_days   = $cfg['custom_days'];

    $now       = current_datetime();
    $day_en    = $now->format('l');
    $date_dmy  = $now->format('d-m-Y');

    $da_days = [
        'Monday'=>'Mandag','Tuesday'=>'Tirsdag','Wednesday'=>'Onsdag',
        'Thursday'=>'Torsdag','Friday'=>'Fredag','Saturday'=>'Lørdag','Sunday'=>'Søndag',
    ];

    ob_start(); ?>
    <div class="business-schedule">

        <!-- Normale åbningstider -->
        <div class="opening-hours-box">
            <h5>Normale åbningstider</h5>
            <ul>
                <?php foreach ($weekday_hours as $en=>$h):
                    // markér kun hvis i dag og IKKE holiday/custom
                    $today = ($en===$day_en && !in_array($date_dmy,$holiday_dates,true) && !isset($custom_days[$date_dmy])) ? ' class="today"' : '';
                    $times = ($h['start']==='Closed') ? 'Lukket' : $h['start'].' - '.$h['end']; ?>
                    <li<?= $today ?>><?= $da_days[$en] ?>: <?= $times ?></li>
                <?php endforeach; ?>
            </ul>
        </div>

        <!-- Ferielukkede dage -->
        <?php if ($holiday_dates): ?>
        <div class="opening-hours-box">
            <h5>Andre lukkedage</h5>
            <ul>
                <?php foreach ($holiday_dates as $d):
                    $today = ($d===$date_dmy) ? ' class="today"' : ''; ?>
                    <li<?= $today ?>><?= $d ?></li>
                <?php endforeach; ?>
            </ul>
        </div>
        <?php endif; ?>

        <!-- Specielle åbningsdage -->
        <?php if ($custom_days): ?>
        <div class="opening-hours-box">
            <h5>Specielle åbningsdage</h5>
            <ul>
                <?php foreach ($custom_days as $d=>$h):
                    $today = ($d===$date_dmy) ? ' class="today"' : ''; ?>
                    <li<?= $today ?>><?= $d ?>: <?= $h['start'] ?> - <?= $h['end'] ?></li>
                <?php endforeach; ?>
            </ul>
        </div>
        <?php endif; ?>

    </div>
    <?php
    return ob_get_clean();
}
add_shortcode('business_schedule','business_schedule_shortcode');

Koden herunder skal indsættes i “Tilpas” -> “Ekstra CSS”:

/* Åbningstider Status */
.business-status {
	color: white;
	font-size: 14px;
	font-weight: 500;
	display: flex;
	align-items: center;
	gap: 10px;
}

.business-status svg {
	width: 8px !important;
}

.business-status.open {
	fill: #15FF00;
}

.business-status.closed {
	fill: #FF0000;
}

.business-status.holiday {
	fill: #FF0000;
}

/* Åbningstider Popup */
.business-schedule {
	display: flex;
	flex-direction: column;
	gap: 20px;
}

.business-schedule .opening-hours-box h5 {
	margin: 0px;
	margin-bottom: 6px;
}

.business-schedule .opening-hours-box ul {
	list-style-type: none;
	padding: 0px;
	
	display: flex;
	flex-direction: column;
	gap: 6px;
}

.business-schedule .opening-hours-box ul li {
	background: var(--e-global-color-secondary);
	padding: 4px 8px;
	border-radius: 4px;
}

.business-schedule .opening-hours-box ul li.today {
	font-weight: 800;
	border-left: 4px solid var(--e-global-color-text);
}