WP Manifestindependent plugin directory
manifest / events / turnierplaner-by-hsg

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

1stars
0forks

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.zip

Das 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.

Ablaufplan im Frontend

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.

Grunddaten eines Turniers

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.

Spielplan im Backend

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.

Turnierliste und Sicherung


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.

Altersklassen im Backend


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

  1. Turnier anlegen – Name, Datum, Turnierzeit, Umstellungspause.
  2. Hallen eintragen, mit Öffnungszeiten. Mehrere Felder in einer Halle? Einfach als eigene Hallen anlegen („Halle – Feld 1“, „Halle – Feld 2“).
  3. Altersklassen anlegen: Modus, Spielzeit, erlaubte Hallen, Zeitfenster, Spieltag.
  4. Teams und Gruppen – Mannschaften eintragen, Gruppen zuweisen.
  5. 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