Handball Turnierplaner
WordPress-Plugin für Handballturniere: kollisionsfreier Spielplan über mehrere Hallen, Schiri-Einteilung, Ergebniseingabe per Link und PIN, Live-Tabellen und Ablaufplan fürs Handy.
by Tom Kaminski (HSG Annen-Ruedinghausen) · github.com/toamins/turnierplaner-by-hsg · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/toamins/turnierplaner-by-hsg/archive/refs/heads/main.zipDas WordPress-Plugin, das dir das Turnierwochenende abnimmt – vom ersten Spielplan bis zur Tabelle, die sich während des Turniers von selbst aktualisiert.
Ein Klick plant das komplette Turnier: alle Altersklassen, alle Hallen, alle Felder – ohne dass sich zwei Spiele, zwei Mannschaften oder zwei Schiedsrichter in die Quere kommen. Ein zweiter Klick verteilt die Schiris. Ein Shortcode auf einer Seite, und die Eltern am Spielfeldrand sehen auf dem Handy, wann ihr Kind dran ist.

Entstanden ist das Plugin für das Turnierwochenende der HSG Annen-Rüdinghausen – drei Tage, von den Mixed-Senioren am Freitagabend bis zur F-Jugend am Sonntag, auf drei Feldern in zwei Hallen. Wer so etwas schon einmal in einer Tabellenkalkulation geplant hat, weiß, warum.
Was das Plugin für dich übernimmt
Der Spielplan – in einem Rutsch, nicht Halle für Halle
Der Planer kennt alle Ressourcen gleichzeitig und legt jedes Spiel dorthin, wo es wirklich passt:
- Kollisionsfrei von vornherein. Keine Halle doppelt belegt, keine Mannschaft an zwei Orten, kein Schiri im Doppeleinsatz. Konflikte werden nicht hinterher rot markiert – sie entstehen nicht.
- Öffnungszeiten und Zeitfenster. Jede Halle hat ihre Zeiten, jede Altersklasse ihr Fenster und ihren Spieltag. Die F-Jugend spielt von 10 bis 14 Uhr, die Senioren am Freitagabend – der Planer hält sich daran.
- Hallenrotation. Spielt eine Altersklasse auf mehreren Feldern, verteilt der Planer die Teams bewusst – damit jede Mannschaft auch mal am anderen Catering vorbeikommt.
- Anwurfraster. Auf Wunsch starten alle Spiele einer Altersklasse im selben Takt. Das macht den Aushang lesbar und die Zeitnahme einfach.
- Ehrliche Berichte. Passt ein Spiel nicht mehr ins Fenster, sagt das Plugin welches und warum – statt es still verschwinden zu lassen.
Damit keine Mannschaft vier Spiele am Stück hat
Neben der harten Mindestpause gibt es den Pausenwunsch: „Am liebsten 15 Minuten zwischen zwei Spielen.“ Der Planer versucht das zuerst als feste Regel, und erst wenn der Tag zu voll dafür ist, rückt er stückweise davon ab – aber nie so weit, dass ein Spiel dabei unter den Tisch fällt. Wo es nicht gereicht hat, steht es im Bericht.
Im echten Turnier wurden so aus 15 Anschlussspielen ohne jede Pause noch 6, und die längste Serie schrumpfte von vier auf drei Spiele am Stück – bei unveränderter Spielzahl.
Endrunden bis Platz 7
Gruppenphase, KO-Runde oder beides. Überkreuzvergleich, Halbfinale, Finale, dazu auf Wunsch die Spiele um Platz 3, 5 und 7, damit wirklich jede Platzierung ausgespielt wird. Mehrere Altersklassen können sich eine gemeinsame Siegerehrung teilen – dann hält der Planer deren Endspiele als Block zusammen, statt sie über den Nachmittag zu verteilen.
Schiedsrichter, die nicht an zwei Orten gleichzeitig stehen
Steht der Spielplan, verteilt ein Klick die Schiris darauf:
- Einzelschiris oder feste Gespanne
- Freigabe je Altersklasse – wer die E-Jugend pfeift, muss nicht auch die A-Jugend pfeifen
- Verfügbarkeit je Spieltag („Samstag erst ab 12 Uhr“)
- Pausenwunsch, der wie beim Spielplan ein Wunsch bleibt und nicht zum Blocker wird
- Einsätze werden über Mannschaften und Hallen gestreut, statt immer dieselbe Paarung zu erwischen
Im Frontend steht nur der Nachname, bei Gespannen beide mit Schrägstrich. Gibt es zwei Kolleginnen oder Kollegen mit demselben Nachnamen, kommt automatisch der Vorname dazu.
Ergebnisse direkt vom Kampfgericht – ohne WordPress-Zugang
Niemand muss mehr eine offene WordPress-Sitzung am Kampfgericht liegen lassen. Jede Halle bekommt einen eigenen Link mit PIN, den man ausdrucken und hinlegen kann. Die Seite ist bewusst ohne JavaScript gebaut – in Sporthallen ist der Empfang schlecht, und ein einfaches Formular funktioniert entweder oder sagt ehrlich, dass es nicht ging.
Der Link kann nur, was er können soll: die Spiele dieser Halle, in diesem Turnier, ab 30 Minuten vor Anwurf. Keine IP-Adressen werden gespeichert.
Tabellen, die dem Regelwerk folgen
Punktgleich? Dann entscheidet, was du einstellst: direkter Vergleich oder Tordifferenz zuerst. Bei drei und mehr punktgleichen Mannschaften rechnet das Plugin eine Mini-Tabelle nur aus deren Spielen untereinander – sonst wäre „A schlägt B, B schlägt C, C schlägt A“ nicht auflösbar. Über jeder Tabelle im Frontend steht, welche Regel gerade gilt, damit am Spielfeldrand keine Diskussion entsteht.

Wenn im laufenden Turnier doch etwas dazwischenkommt
Dafür ist die Werkzeugkiste da:
- Spiel nachtragen – mit Gruppenzuordnung, damit es auch in der Tabelle zählt
- Nur eine Altersklasse neu planen – die parallel laufenden Spiele in den Hallen bleiben unangetastet, die Nummerierung am Ende trotzdem lückenlos
- „Spielplan wird gerade überarbeitet“ – ein Haken im Backend, und im Frontend erscheint ein Hinweis, offene Spiele werden rot markiert. Haken raus, wenn du fertig bist.

Sicherung – und die Blaupause fürs nächste Jahr
Ein Klick schreibt das ganze Turnier in eine .json-Datei: Altersklassen, Hallen, Teams, Gruppen,
Spiele, Ergebnisse, Schiris. Beim Einspielen entsteht daraus ein neues Turnier – bestehende
bleiben unangetastet. Damit ist die Sicherung gleichzeitig die Vorlage für den nächsten Durchgang:
letztes Jahr einspielen, Datum ändern, Teams aktualisieren, neu planen.

Alles an einem Ort
Jede Altersklasse bringt ihre eigenen Regeln mit – Spielmodus, Spielzeit, Hallen, Zeitfenster, Pausen, Schiris, Takt, Endrunde und Platzierungsspiele. Das Plugin macht daraus einen Spielplan.

Im Frontend: fünf Shortcodes
| Shortcode | Was dabei herauskommt |
|---|---|
[ht_ablaufplan id="1"] |
Alle Spiele chronologisch, mit Altersklasse – der Aushang für die Halle |
[ht_spielplan id="1"] |
Der Spielplan, nach Altersklassen gegliedert |
[ht_tabelle id="1"] |
Nur die Tabellen, inklusive Hinweis zur Wertung |
[ht_ergebnisse id="1"] |
Gespielte Spiele mit Ergebnis |
[ht_turnier id="1"] |
Die Gesamtübersicht: Spielplan, Tabellen und Ergebnisse auf einer Seite |
Die ersten vier lassen sich mit altersklasse="F-Jugend" auf eine Altersklasse eingrenzen. Der
Ablaufplan filtert dafür nach Tag und Halle: datum="2026-09-05", halle="Kreissporthalle". Und
sortierung="ab" dreht die Reihenfolge um – praktisch, wenn abends die letzten Ergebnisse oben
stehen sollen.
In fünf Schritten zum Spielplan
- Turnier anlegen – Name, Datum, Turnierzeit, Umstellungspause.
- Hallen eintragen, mit Öffnungszeiten. Mehrere Felder in einer Halle? Einfach als eigene Hallen anlegen („Halle – Feld 1“, „Halle – Feld 2“).
- Altersklassen anlegen: Modus, Spielzeit, erlaubte Hallen, Zeitfenster, Spieltag.
- Teams und Gruppen – Mannschaften eintragen, Gruppen zuweisen.
- Spielplan → „Gesamtspielplan generieren“, danach „Schiedsrichter zuweisen“.
Shortcode auf eine Seite, fertig. Wer lieber in Ruhe nachliest: das Handbuch erklärt jeden Reiter in 21 Kapiteln, auch als PDF zum Ausdrucken.
Installation
Voraussetzungen: WordPress und PHP 8.0 oder neuer.
Als Paket: die handball-turnierplaner.zip der neuesten Version unter
Releases herunterladen und unter
Plugins → Installieren → Plugin hochladen einspielen.
Von Hand: den Ordner nach wp-content/plugins/handball-turnierplaner/ kopieren und im Backend
aktivieren.
Die Datenbank wird beim ersten Aufruf nach jedem Versionssprung automatisch nachgezogen – es gibt keinen Migrationsknopf, den man vergessen könnte.
Datenschutz
Spielplan und Ablaufplan zeigen die Nachnamen der eingeteilten Schiedsrichter öffentlich an. Holt dafür vorab das Einverständnis eurer Schiris ein – oder plant ohne Schiri-Einteilung, dann bleibt die Spalte im Frontend verborgen. Der Ergebnisdienst speichert keine IP-Adressen.
Mitmachen
Fehler gefunden, Wunsch offen, oder läuft bei dir etwas anders als beschrieben? Ein Issue ist willkommen – gern mit Turniergröße, Altersklassen und dem, was der Planungsbericht ausgegeben hat.
Plugin-Paket bauen
git archive -o handball-turnierplaner.zip --prefix=handball-turnierplaner/ HEAD
.gitattributes hält Entwicklungswerkzeuge, Handbuch und Repository-Dateien aus dem Paket heraus –
das Zip enthält genau das, was auf den Server gehört.
Entwicklung
Es gibt keinen Build-Schritt. Bei jedem Push prüft GitHub Actions die PHP-Syntax gegen PHP 8.0
bis 8.4 und führt die Prüfungen aus tools/ aus. Lokal geht das so:
python tools/phpcheck.py $(git ls-files '*.php') # Klammern und Zeichenketten
python tools/ctrlcheck.py # Steuerzeichen
node --check admin/js/ht-admin.js # JavaScript-Syntax
python tools/sim/run_all.py # Algorithmus-Prüfungen
tools/sim/ bildet die Algorithmen in Python nach – Planer, Schiedsrichter-Zuteilung,
Nummerierung, Einzellauf, Pausenwunsch, Tabellenwertung, Sicherung – und rechnet sie an
Szenarien aus echten Turnieren durch. Das ist ehrlicherweise kein Ersatz für Tests gegen den
PHP-Code selbst; die sind der nächste Schritt. Was welche Prüfung abdeckt, steht in
tools/README.md.
Das PDF-Handbuch entsteht aus der HTML-Fassung über die installierte Chrome-Instanz:
python tools/html2pdf.py docs/handbuch.html docs/Turnierplaner-Handbuch.pdf
Liegt Chrome nicht am Standardort, den Pfad per Umgebungsvariable CHROME angeben.
Architektur, Konventionen und die Entscheidungen hinter dem Planer stehen in
CLAUDE.md – inklusive der Ansätze, die ausprobiert und wieder verworfen wurden.
Unterstützen
Das Plugin ist kostenlos und bleibt es. Wer die Weiterentwicklung unterstützen möchte: paypal.me/kaminskitom. Genauso gern gesehen: ein Issue, ein Verbesserungsvorschlag oder die Rückmeldung, dass es bei eurem Turnier funktioniert hat.
Lizenz
GPL v2 oder später – der vollständige Lizenztext liegt in LICENSE.
© Tom Kaminski, HSG Annen-Rüdinghausen