
🐛 WordPress und JoomSport: Fehlerbehebung und Anpassung des Plugins
Sport-Websites auf WordPress sind eine seltene Spezies. Als ein Tennisverband eine Website mit Spielplänen, Turniertabellen und Spielerprofilen benötigte, erwiesen sich die Plugin-Optionen als frustrierend begrenzt. JoomSport PRO wurde zur einzig gangbaren Wahl, aber selbst das erforderte erheblichen Aufwand.
Das Plugin hat eine steile Lernkurve: Die Konfiguration für eine bestimmte Sportart kostet Zeit, und stellenweise verhält sich der Code, als wäre er nicht für erfahrene WordPress-Anwender geschrieben. Andererseits verfügt JoomSport über ein starkes Support-Team, das auf jede Helpdesk-Anfrage reagiert, und das ist ein ernstzunehmender Pluspunkt, wenn Sie das Plugin für ein Projekt anpassen.
Nachfolgend finden Sie eine Sammlung getesteter Korrekturen und Snippets aus einem realen Projekt. Sie lösen konkrete Probleme: von störenden Copyright-Hinweisen über die Inhaltsfilterung bis hin zu Ausgabevorlagen. Alle Code-Fragmente sind aktuell für JoomSport Version 5.7.x (Stand Juni 2026, 5.7.8).
💡 Kurzüberblick:
- Entfernen des Plugin-Copyrights: eine Zeile im Template
- Behebung der Paginierung und des Division-durch-Null-Fehlers
- Thumbnail-Unterstützung für JoomSport-Beiträge hinzufügen
- Eine Funktion schreiben, die automatisch Beitragsbilder zur Galerie hinzufügt
- Spieleralter berechnen und in einem Meta-Feld speichern
- Den ersten Buchstaben des Nachnamens für die Sortierung speichern
- Ausgabevorlagen für benutzerdefinierte Beitragstypen erstellen
Das JoomSport-Copyright entfernen
In der kostenlosen Version zeigt das Plugin einen „powered by JoomSport"-Link in der Fußzeile von Saison-Seiten an. Eine Kleinigkeit, aber auf einer Kunden-Website wirkt sie fehl am Platz.
Zu bearbeitende Datei:
1 /wp-content/plugins/joomsport-sports-league-results-management/sportleague/views/default/season.php
Suchen und entfernen Sie etwa in Zeile 79 die Zeile, die den Link zu joomsport.com enthält. Nach einem Plugin-Update müssen Sie diese Korrektur wiederholen, behalten Sie das also im Hinterkopf, wenn Sie automatische Updates einrichten.
Den Paginierungsfehler beheben
Wenn diese Warnung in Ihren Logs erscheint:
Warning: Division by zero in.../class-jsport-pagination.php on line 72
, versucht das Plugin bei der Seitenberechnung durch null zu dividieren. Das Problem tritt auf, wenn die Variable $limit nicht definiert ist oder null beträgt.
Datei:
1 /wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/class-jsport-pagination.php
Suchen Sie Zeile 70:
1 $npage = ceil($this->setcurrent / $limit);
Ersetzen Sie durch:
1 if (isset($limit) && $limit > 0) { 2 $npage = ceil($this->setcurrent / $limit); 3 }
Die Division wird in eine Prüfung verpackt: Ist $limit nicht gesetzt oder gleich null, wird die Berechnung schlicht nicht ausgeführt, und der Fehler verschwindet.
Thumbnail-Unterstützung für JoomSport-Beiträge hinzufügen
Standardmäßig unterstützen die benutzerdefinierten Beitragstypen von JoomSport (joomsport_player, joomsport_season und andere) keine Thumbnails. Ohne diese können Sie keine ordentliche Galerie oder Spielerkarte aufbauen.
Fügen Sie in der functions.php Ihres Themes hinzu:
1 add_post_type_support('joomsport_player', 'thumbnail'); 2 add_post_type_support('joomsport_season', 'thumbnail');
Nun erscheint der Standard-Block „Beitragsbild" im Admin-Bereich für Spieler und Saisons. Analog können Sie die Thumbnail-Unterstützung für jeden benutzerdefinierten JoomSport-Typ hinzufügen, indem Sie den entsprechenden Slug einsetzen.
Grundgerüst für JoomSport-Datenverarbeitungsfunktionen
Alle folgenden Snippets arbeiten innerhalb eines einzigen save_post-Hooks. Dieser wird ausgelöst, wenn ein Beitrag gespeichert wird, und erlaubt Ihnen, Meta-Felder automatisch zu befüllen.
Erstellen Sie dieses Grundgerüst in der functions.php:
1 function my_custom_save_post($post_id) { 2 3 function jswpla__meta_save_SDStudio($post_id) { 4 5 // Place functions from the sections below here 6 7 } 8 add_action('save_post', 'jswpla__meta_save_SDStudio'); 9 } 10 add_action('save_post_joomsport_player', 'my_custom_save_post');
Der Hook save_post_joomsport_player stellt sicher, dass die Ausführung nur beim Speichern von Beiträgen des Typs „player" erfolgt. Für andere Typen (joomsport_season, joomsport_match) passen Sie das Suffix entsprechend an.
Automatisches Hinzufügen des Beitragsbilds zur Galerie
Wenn Sie Dutzende Spieler verwalten, wird das manuelle Hinzufügen von Bildern zur JoomSport-Galerie mühsam. Hier ist eine Funktion, die beim Speichern eines Beitrags automatisch die ID des Beitragsbilds ermittelt und dieses als erstes Element in die Galerie einfügt:
1 $thumbnail_ID = get_post_thumbnail_id($post_id); 2 $values = [$thumbnail_ID]; 3 4 $check_id_thumb = get_post_meta($post_id, 'vdw_gallery_id'); 5 $My_False = false; 6 7 foreach ($check_id_thumb as $metakey) { 8 if (strpos($values, $check_id_thumb) !== false) { 9 $My_False = true; 10 } 11 } 12 13 if (!$My_False) { 14 add_post_meta($post_id, 'vdw_gallery_id', $values); 15 }
Die Logik ist einfach: Beitragsbild-ID abrufen, prüfen, ob sie bereits im Meta-Feld vdw_gallery_id vorhanden ist. Falls nicht, wird sie hinzugefügt. Falls doch, wird sie übersprungen, um Duplikate zu vermeiden.
Berechnung des Spieleralters in einem Meta-Feld
JoomSport speichert das Geburtsdatum des Spielers im Meta-Feld _joomsport_player_ef. Um das Alter auf der Website anzuzeigen, müssen Sie es zunächst berechnen und speichern. Der Code basiert auf einer Lösung von StackExchange und der ACF-Dokumentation.
1 $date_of_birth = get_post_meta($post_id, '_joomsport_player_ef', false); 2 3 foreach ($date_of_birth as $metakey) { 4 $metakey_borthay = $metakey[3]; 5 } 6 7 $age = intval(date('Y', time() - strtotime($metakey_borthay))) - 1970; 8 9 delete_post_meta($post_id, 'age_field'); 10 add_post_meta($post_id, 'age_field', $age);
Das Geburtsdatum ist im vierten Element des Arrays (Index [3]) des Meta-Felds _joomsport_player_ef gespeichert. Die Funktion extrahiert es, berechnet das Alter und schreibt es in ein separates Meta-Feld age_field, das anschließend in Templates oder für Filterungen verwendet werden kann.
Speichern des ersten Buchstabens des Nachnamens
Für die alphabetische Sortierung von Spielern oder die Schnellsuche ist ein separates Feld mit dem ersten Buchstaben des Nachnamens praktisch. JoomSport speichert Vor- und Nachnamen im Meta-Feld _joomsport_player_personal.
1 $val_last_name = get_post_meta($post_id, '_joomsport_player_personal', false); 2 3 foreach ($val_last_name as $metakey) { 4 $metakey_Last_Name = $metakey['last_name']; 5 } 6 7 $metakey_Last_Name = preg_split('//u', $metakey_Last_Name, -1, PREG_SPLIT_NO_EMPTY); 8 $metakey_Last_Name = $metakey_Last_Name[0]; 9 10 $check_Liter_Last_Name = get_post_meta($post_id, 'First_letter_Last_Name'); 11 $My_False_Liter_Last_Name = false; 12 13 foreach ($metakey_Last_Name as $check_liter) { 14 if (strpos($check_Liter_Last_Name, $metakey_Last_Name) !== false) { 15 $My_False_Liter_Last_Name = true; 16 } 17 } 18 19 if (!$My_False_Liter_Last_Name) { 20 update_post_meta($post_id, 'First_letter_Last_Name', $metakey_Last_Name); 21 }
preg_split mit dem Flag PREG_SPLIT_NO_EMPTY teilt einen UTF-8-String korrekt in einzelne Zeichen auf, einschließlich kyrillischer. Das erste Zeichen des Nachnamen-Arrays wird im Meta-Feld First_letter_Last_Name gespeichert.
Suchen und Ersetzen von Text auf der gesamten Website
Ein universelles Snippet für die massenhafte Textersetzung in Inhalten und Kurzfassungen. Nicht nur für JoomSport nützlich; verwenden Sie es für beliebige globale Bearbeitungen.
1 function replace_text_wps($text) { 2 $replace = array( 3 'getimagesizefromstring' => 'excerpt', 4 'functidrgon' => 'function' 5 ); 6 $text = str_replace(array_keys($replace), $replace, $text); 7 return $text; 8 } 9 add_filter('the_content', 'replace_text_wps'); 10 add_filter('the_excerpt', 'replace_text_wps');
Fügen Sie Ihre eigenen Paare zum Array $replace hinzu, und die Ersetzung wird im laufenden Betrieb auf alle Beiträge angewendet. Arbeitet schneller als Search-Replace-Plugins, aber bedenken Sie: Dies ist ein Filter, der ursprüngliche Inhalt in der Datenbank bleibt unverändert.
Ausgabe-Templates für benutzerdefinierte JoomSport-Typen
JoomSport registriert mehrere benutzerdefinierte Beitragstypen, darunter joomsport_player, joomsport_season und joomsport_match. Standardmäßig werden sie über die single.php des Themes gerendert, und das sieht fast immer unsauber aus.
Die Lösung besteht darin, ein separates Template zu erstellen. Für den Typ „player":
1 single-joomsport_player.php
Die Datei wird im Theme-Stammverzeichnis abgelegt. Die Benennung folgt der Regel der WordPress-Template-Hierarchie: single-{slug}.php. Analog dazu: single-joomsport_season.php für Saisons, single-joomsport_match.php für Spiele.
Übernehmen Sie den Dateiinhalt aus der single.php Ihres Themes und passen Sie ihn an die gewünschte Struktur an. Für das Cactus-Theme sieht ein einfaches Spielerseiten-Template beispielsweise so aus:
1 <?php 2 /* Template Name: Post joomsport_player */ 3 4 get_header(); 5 6 $page_sidebar_layout = apply_filters('cactus_page_sidebar_layout', cactus_option('page_sidebar_layout')); 7 switch ($page_sidebar_layout) { 8 case 'left': 9 $aside_class = 'left-aside'; 10 break; 11 case 'right': 12 $aside_class = 'right-aside'; 13 break; 14 default: 15 $aside_class = 'no-aside'; 16 break; 17 } 18 ?> 19 20 <?php echo apply_filters('cactus_page_title_bar', '', 'page'); ?> 21 22 <div class="page-wrap"> 23 <?php do_action('cactus_before_page_wrap'); ?> 24 <div class="container"> 25 <div class="page-inner row <?php echo $aside_class; ?>"> 26 <div class="col-main"> 27 <section class="post-main" role="main" id="content"> 28 <article class="post-entry text-left"> 29 <?php do_action('cactus_before_page_content'); ?> 30 31 <?php 32 while (have_posts()) : 33 the_post(); 34 get_template_part('template-parts/page/content'); 35 the_posts_pagination(array( 36 'prev_text' => '<i class="fa fa-arrow-left"></i><span class="screen-reader-text">' . __('Previous page', 'cactus') . '</span>', 37 'next_text' => '<span class="screen-reader-text">' . __('Next page', 'cactus') . '</span><i class="fa fa-arrow-right"></i>', 38 'before_page_number' => '<span class="meta-nav screen-reader-text">' . __('Page', 'cactus') . ' </span>', 39 )); 40 endwhile; 41 ?> 42 43 <?php do_action('cactus_after_page_content'); ?> 44 </article> 45 46 <?php do_action('cactus_after_post_entry'); ?> 47 </section> 48 </div> 49 </div> 50 </div> 51 <?php do_action('cactus_after_page_wrap'); ?> 52 </div> 53 54 <?php get_footer(); ?> 55
Kopieren Sie diesen Code und ersetzen Sie die CSS-Klassen und Hooks durch diejenigen, die Ihr Theme verwendet. Entscheidend ist die Struktur: Header, Container, Sidebar (optional), Hauptschleife und Footer.
Für einen schnellen Einstieg mit dem Plugin sehen Sie sich das offizielle Tutorial von BearDev an: 11 Minuten, die Ihnen einige Stunden Einrichtungszeit ersparen.
⁉️🤔 Häufig gestellte Fragen
Funktionieren diese Anpassungen auch mit der PRO-Version von JoomSport?
Ja, alle Snippets sind universell und wurden ebenfalls mit der PRO-Version getestet. Die Hooks
save_post_joomsport_*und die Metafelder sind in der kostenlosen und der kostenpflichtigen Version identisch. Die einzige Nuance: Die PRO-Version bringt eigene Custom Post Types mit, prüfen Sie daher den Slug, bevor Sie die Thumbnail-Unterstützung hinzufügen.
Was tun, wenn das Plugin nach einer Bearbeitung nicht mehr funktioniert?
Setzen Sie die Änderungen zurück: Alle Bearbeitungen erfolgen in der
functions.phpdes Themes oder in separaten Template-Dateien; der Plugin-Kern bleibt unberührt. Ausnahmen sind das Entfernen des Copyright-Hinweises und die Korrektur der Paginierung: Diese Eingriffe betreffen die eigenen Dateien des Plugins und werden bei einem Update überschrieben. Erstellen Sie vor jeder Bearbeitung eine Sicherungskopie der Datei, die Sie ändern.
Kann ich diese Funktionen für Post Types anderer Plugins verwenden?
Ja, der Ansatz ist universell. Ersetzen Sie
joomsport_playerdurch den Slug des gewünschten Custom Types und_joomsport_player_efdurch dessen Metafeld. Der Framework-Code (der Wrapper mit demsave_post-Hook) und die Prüflogik (get_post_meta→foreach→ Bedingung) können exakt wie gezeigt wiederverwendet werden.
Wie füge ich Thumbnail-Unterstützung für alle JoomSport-Typen auf einmal hinzu?
Iterieren Sie über ein Array mit den Slugs:
1 $joomsport_types = ['joomsport_player', 'joomsport_season', 'joomsport_match', 'joomsport_team']; 2 foreach ($joomsport_types as $type) { 3 add_post_type_support($type, 'thumbnail'); 4 }
Eine Liste aller Custom Types des Plugins finden Sie in dessen Einstellungen oder nutzen Sie
var_dump(get_post_types()).
Warum sollte ich JoomSports Extra-Felder nicht für die Filterung verwenden?
JoomSport speichert alle Werte der Extra-Felder in einem einzigen Array. Der Zugriff auf ein bestimmtes Feld von der Benutzeroberfläche aus (etwa bei einer AJAX-Filterung) ist praktisch unmöglich, weil die Daten zusammengeführt werden. Wenn Sie Spieler nach Alter, Anfangsbuchstaben oder einem anderen Kriterium filtern müssen, speichern Sie den Wert in einem separaten Metafeld, wie in den Abschnitten zu
age_fieldundFirst_letter_Last_Namegezeigt.
Sollten Sie JoomSport für Ihr Projekt einsetzen?
JoomSport ist ein spezialisiertes, aber leistungsfähiges Werkzeug. Wenn Sie eine Sportliga-Website mit Tabellen, Spielplänen und Profilen benötigen, sind die Alternativen auf WordPress ehrlich gesagt rar. Das Plugin wird aktiv weiterentwickelt: Stand Juni 2026 ist die aktuelle Version 5.7.8, und die Entwickler schließen Sicherheitslücken und ergänzen Funktionen zeitnah.
Die Schwachstelle ist die Lernkurve. Die Ersteinrichtung erfordert Geduld, und manches Verhalten des Plugins ist eher für Entwickler als für normale Anwender konzipiert. Der Support von beardev ist jedoch ausgesprochen gut: Auf jede Helpdesk-Anfrage erhalten Sie eine detaillierte Antwort, oft mit einem fertigen Snippet.
Wenn Ihr Projekt einen Sportbezug hat und Ihr Budget begrenzt ist, setzen Sie auf JoomSport und planen Sie Zeit für die Anpassung ein. Der Code in diesem Artikel adressiert die meisten typischen Probleme, auf die Entwickler bei der Integration des Plugins in eine Live-Site stoßen.



