Ein erstes simples Plugin

In diesem Beitrag starten wir mit dem Grundgerüst eines eigenen WordPress-Plugins, das Teil der größeren Entwicklung, dem Aufbau eines individuellen Zeiterfassungssystems für WordPress ist.

Bevor Funktionen wie Projektverwaltung, Zeiteinträge oder Auswertungen umgesetzt werden können, braucht es eine stabile Basis. Genau diese Basis erstellen wir heute. Wir legen ein Plugin an, binden es korrekt in WordPress ein und bauen eine erste Admin-Seite inklusive Einstellungen.

Der Fokus liegt bewusst auf den Grundlagen der Plugin-Entwicklung – sauber, verständlich und erweiterbar. In den folgenden Beiträgen wird dieses Fundament Schritt für Schritt zu einem vollwertigen Zeiterfassungs-System ausgebaut.

1. Die Plugin-Struktur

Ein WordPress-Plugin besteht im einfachsten Fall nur aus einer einzigen PHP-Datei.

Fangen wir also an und legen im Verzeichnis
wp-content/plugins/
einen neuen Ordner an, zum Beispiel:

basix-time-tracking

und darin unsere erste PHP Datei:

basix-time-tracking.php

Damit WordPress das jetzt auch noch erkennt, starten wir mit den ersten Zeilen Code und erstellen uns den Plugin Header. Der Plugin-Header enthält Metadaten wie Name, Beschreibung und Version. Ohne diesen Header wird das Plugin nicht im WordPress-Backend angezeigt.

<?php
/*
 * Plugin Name: Basix Time Tracking
 * Description: A simple time tracking plugin for WordPress.
 * Version: 0.1.0
 */

Nach dem Speichern kann man das Plugin bereits im Admin-Bereich unter Plugins sehen und aktivieren – es tut allerdings noch nichts. Also kümmern wir uns jetzt einmal um grundlegende Funktionalität

2. Ein Menü hinzufügen

Damit unser Plugin im WordPress-Backend sichtbar wird, fügen wir einen eigenen Menüpunkt hinzu. Das geschieht über den admin_menu-Hook. Für die erste Version machen wir die gesamten Änderungen in der anfangs erstellen PHP Datei.

add_action('admin_menu', 'basix_tracker_add_admin_menu');

function basix_tracker_add_admin_menu() {
    add_menu_page(
        'Basix Time Tracking', // Page Title
        'Basix Tracker', // Menu Title
        'manage_options', // Capability
        'basix-tracker', // Menu Slug
        'basix_tracker_admin_page', // Callback Function
        'dashicons-clock', // Icon
        6 // Position
    );
}

Nach dem Aktivieren erscheint nun links im Admin-Menü der Punkt „Basix Tracker“ mit einem Icon.

Als Nächstes definieren wir die Funktion, die den Inhalt der Admin-Seite ausgibt. Hier verwenden wir das typische WordPress-Wrapper-Markup (<div class="wrap">) und fügen ein erstes Setting hinzu.

function basix_tracker_admin_page() {
    ?>
    <div class="wrap">
        <h1>Basix Time Tracking</h1>
        <p>Welcome to the Basix Time Tracking plugin admin page.</p>
         <form method="post" action="options.php">
            <?php
                settings_fields('basix_tracker_settings_group');
                do_settings_sections('basix-tracker');
                submit_button();
            ?>
        </form>
        <!-- Additional plugin functionality can be added here -->
    </div>
    <?php
}

Das Formular nutzt bereits die WordPress Settings API, was die empfohlene Methode zum Speichern von Optionen ist. Jetzt registrieren wir unsere Plugin-Einstellungen noch. Dafür hängen wir uns an den admin_init-Hook.

add_action('admin_init', 'basix_tracker_settings');

function basix_tracker_settings() {
    register_setting(
        'basix_tracker_settings_group',
        'basix_tracker_dummy_setting'
    );

    add_settings_section(
        'basix_tracker_settings_section',
        'Basix Tracker Settings',
        null,
        'basix-tracker'
    );

    add_settings_field(
        'basix_tracker_dummy_setting',
        'Dummy Setting Name',
        'basix_tracker_dummy_setting_render',
        'basix-tracker',
        'basix_tracker_settings_section'
    );
}

Hier passiert Folgendes:

  • Eine Option wird registriert
  • Eine Einstellungssektion wird angelegt
  • Ein Eingabefeld wird zur Seite hinzugefügt

Und dann müssen wir natürlich auch noch das ganze rendern, sonst taucht nichts von unseren Änderungen auf

function basix_tracker_dummy_setting_render() {
    $value = get_option('basix_tracker_dummy_setting', '');
    ?>
    <input type="text" name="basix_tracker_dummy_setting" value="<?php echo esc_attr($value); ?>" />
    <?php
}

Da wir die WordPress Settings API nutzen müssen wir uns auch um sonst nichts mehr kümmern. Änderungen werden direkt in der Datenbank gespeichert und sind für die spätere Verwendung verfügbar.

Mit diesem Beitrag haben wir das technische Fundament für unser Zeiterfassungs-Plugin gelegt. Das Plugin ist sauber registriert, besitzt eine eigene Admin-Seite und nutzt bereits die WordPress Settings API. Damit ist die Basis geschaffen, auf der sich das System sinnvoll erweitern lässt.

In den nächsten Schritten geht es darum, aus diesem Grundgerüst ein echtes Produkt zu machen. Dazu gehören unter anderem:

  • Planung des Funktionsumfangs
    Welche Features braucht ein Zeiterfassungssystem wirklich? Projekte, Kunden, Zeiten, Pausen, Reports – bevor wir Code schreiben, definieren wir klar den Umfang.
  • Umstellung auf objektorientierte Programmierung (OOP)
    Um Wartbarkeit und Erweiterbarkeit zu verbessern, werden wir das Plugin in Klassen aufteilen und eine saubere Struktur einführen.
  • Auslagern von Templates
    HTML und PHP-Logik sollen getrennt werden. Dafür werden wir Admin-Views in eigene Template-Dateien auslagern.
  • Datenstruktur & Speicherung
    Entscheidung zwischen Options API, Custom Tables oder Custom Post Types – inklusive Vor- und Nachteilen.
  • Erweiterungen & UX
    Später folgen Dinge wie Formularvalidierung, bessere Usability, AJAX-Speicherung und erste Auswertungen.

Dieses Plugin ist bewusst inkrementell aufgebaut. Jeder Schritt erweitert das bestehende System, ohne das Fundament neu erfinden zu müssen. Genau so entsteht aus einem einfachen Plugin nach und nach ein vollwertiges Zeiterfassungssystem für WordPress.

Im nächsten Beitrag starten wir mit der konzeptionellen Planung und Strukturierung des Plugins.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert