
🐛 WordPress i JoomSport: poprawiamy błędy i dostosowujemy wtyczkę do własnych potrzeb
Сportowe strony na WordPress, rzadki widok. Gdy federacja tenisowa potrzebowała witryny z harmonogramem meczów, tabelami turniejowymi i profilami zawodników, wybór wtyczek okazał się rozczarowująco mały. JoomSport PRO stał się jedyną sensowną opcją, ale i on zmusił do wytężonej pracy.
Próg wejścia wtyczki jest solidny: konfiguracja pod konkretną dyscyplinę sportu wymaga czasu, a miejscami kod zachowuje się tak, jakby nie był pisany z myślą o doświadczonych użytkownikach WordPress. Z drugiej strony JoomSport ma silny zespół wsparcia, który odpowiada na każde zgłoszenie w helpdesku, a to poważny plus, gdy dostosowuje się wtyczkę do projektu.
Poniżej zestaw sprawdzonych poprawek i snippetów zebranych na rzeczywistym projekcie. Rozwiązują one konkretne problemy: od irytującego copyrightu po filtrowanie treści i szablony wyświetlania. Wszystkie fragmenty kodu są aktualne dla JoomSport w wersji 5.7.x (na czerwiec 2026, 5.7.8).
💡 Szybki przegląd:
- Usuwamy copyright wtyczki: jedna linia w szablonie
- Naprawiamy paginację i błąd dzielenia przez zero
- Dodajemy obsługę miniaturek dla wpisów JoomSport
- Piszemy funkcję automatycznego dodawania miniatury do galerii
- Obliczamy i zapisujemy wiek zawodnika w metapolu
- Zapisujemy pierwszą literę nazwiska do sortowania
- Tworzymy szablony wyświetlania dla niestandardowych typów wpisów
Usuwamy copyright JoomSport
W darmowej wersji wtyczka wyświetla link „powered by JoomSport" w stopce stron sezonu. Drobiazg, ale na stronie klienta wygląda nie na miejscu.
Plik do edycji:
1 /wp-content/plugins/joomsport-sports-league-results-management/sportleague/views/default/season.php
Mniej więcej w 79. linii znajdź i usuń linię zawierającą link do joomsport.com. Po aktualizacji wtyczki poprawkę trzeba będzie powtórzyć, należy to uwzględnić przy konfiguracji automatycznych aktualizacji.
Naprawiamy błąd paginacji
Jeśli w logach pojawiło się ostrzeżenie:
Warning: Division by zero in.../class-jsport-pagination.php on line 72
, oznacza to, że wtyczka próbuje dzielić przez zero podczas obliczania stron. Problem występuje, gdy zmienna $limit nie jest zdefiniowana lub jest równa zeru.
Plik:
1 /wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/class-jsport-pagination.php
Znajdź linię 70:
1 $npage = ceil($this->setcurrent / $limit);
Zamień na:
1 if (isset($limit) && $limit > 0) { 2 $npage = ceil($this->setcurrent / $limit); 3 }
Opakowujemy dzielenie w sprawdzenie: jeśli $limit nie jest ustawione lub jest równe zeru, obliczenie po prostu nie jest wykonywane, błąd znika.
Dodajemy obsługę miniaturek dla wpisów JoomSport
Domyślnie niestandardowe typy wpisów JoomSport (joomsport_player, joomsport_season i inne) nie obsługują miniaturek. Bez tego nie zbuduje się normalnej galerii ani karty zawodnika.
Dodaj w functions.php motywu:
1 add_post_type_support('joomsport_player', 'thumbnail'); 2 add_post_type_support('joomsport_season', 'thumbnail');
Teraz w panelu administracyjnym pojawi się standardowy blok „Featured image" dla zawodników i sezonów. Analogicznie można dodać obsługę miniaturek dla dowolnego niestandardowego typu JoomSport, wystarczy podstawić odpowiedni slug.
Szkielet dla funkcji przetwarzania danych JoomSport
Wszystkie kolejne snippety działają wewnątrz jednego hooka save_post. Uruchamia się on podczas zapisywania wpisu i umożliwia automatyczne wypełnianie metapól.
Utwórz w functions.php następującą obudowę:
1 function my_custom_save_post($post_id) { 2 3 function jswpla__meta_save_SDStudio($post_id) { 4 5 // Здесь размещайте функции из разделов ниже 6 7 } 8 add_action('save_post', 'jswpla__meta_save_SDStudio'); 9 } 10 add_action('save_post_joomsport_player', 'my_custom_save_post');
Hook save_post_joomsport_player zapewnia uruchomienie tylko przy zapisywaniu wpisów typu „zawodnik". Dla innych typów (joomsport_season, joomsport_match) należy zmienić sufiks.
Auto-dodawanie miniatury wpisu do galerii
Gdy zawodników są dziesiątki, ręczne ustawianie obrazów w galerii JoomSport to rutyna. Oto funkcja, która przy zapisie wpisu sama pobiera ID miniatury i dodaje ją jako pierwszą do galerii:
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 }
Logika jest prosta: pobieramy ID miniatury, sprawdzamy, czy znajduje się już w metapolu vdw_gallery_id. Jeśli nie ma, dodajemy. Jeśli jest, pomijamy, nie tworząc duplikatów.
Obliczamy wiek zawodnika w metapolu
JoomSport przechowuje datę urodzenia zawodnika w metapolu _joomsport_player_ef. Aby wyświetlić wiek na stronie, należy go wcześniej obliczyć i zapisać. Kod bazuje na rozwiązaniu ze StackExchange oraz dokumentacji ACF.
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);
Data urodzenia jest przechowywana w czwartym elemencie tablicy (indeks [3]) metapola _joomsport_player_ef. Funkcja pobiera ją, oblicza wiek i zapisuje w osobnym metapolu age_field, który można już wykorzystać w szablonie lub do filtrowania.
Zapisujemy pierwszą literę nazwiska
Do sortowania zawodników alfabetycznie lub szybkiego wyszukiwania wygodnie jest mieć osobne pole z pierwszą literą nazwiska. JoomSport przechowuje imię i nazwisko w metapolu _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 z flagą PREG_SPLIT_NO_EMPTY poprawnie dzieli ciąg UTF-8 na znaki, w tym cyrylicę. Pierwszy znak tablicy nazwiska jest zapisywany w metapolu First_letter_Last_Name.
Wyszukiwanie i zamiana tekstu na całej stronie
Uniwersalny snippet do masowej zamiany tekstu w treści i excerptach. Przyda się nie tylko do JoomSport, można go używać do wszelkich globalnych poprawek.
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');
Proszę dodać swoje pary do tablicy $replace, a zamiana zostanie zastosowana do wszystkich wpisów w locie. Działa szybciej niż wtyczki do wyszukiwania i zamiany, ale proszę pamiętać: to filtr, źródłowa treść w bazie danych nie ulega zmianie.
Szablony wyświetlania dla niestandardowych typów JoomSport
JoomSport rejestruje kilka niestandardowych typów wpisów, między innymi joomsport_player, joomsport_season i joomsport_match. Domyślnie są one wyświetlane przez single.php motywu i wygląda to prawie zawsze niechlujnie.
Rozwiązaniem jest utworzenie osobnego szablonu. Dla typu „zawodnik":
1 single-joomsport_player.php
Plik umieszcza się w katalogu głównym motywu. Nazwę buduje się zgodnie z zasadą hierarchii szablonów WordPress: single-{slug}.php. Analogicznie: single-joomsport_season.php dla sezonów, single-joomsport_match.php dla meczów.
Treść pliku należy pobrać z single.php Państwa motywu i dostosować do potrzebnej struktury. Na przykład dla motywu Cactus podstawowy szablon strony zawodnika wygląda następująco:
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
Proszę skopiować ten kod, zastępując klasy CSS i hooki tymi, których używa Pana/Pani motyw. Kluczowa jest struktura: header, kontener, sidebar (opcjonalnie), główna pętla i footer.
Aby szybko rozpocząć pracę z wtyczką, proszę obejrzeć oficjalny tutorial od BearDev, 11 minut, które pozwolą zaoszczędzić kilka godzin konfiguracji.
⁉️🤔 Często zadawane pytania
Czy te poprawki działają na wersji PRO JoomSport?
Tak, wszystkie snippety są uniwersalne i przetestowane, również na wersji PRO. Hooki
save_post_joomsport_*i metapola w wersji darmowej i płatnej są identyczne. Jedyna różnica: wersja PRO dodaje własne niestandardowe typy wpisów, proszę sprawdzić slug przed dodaniem obsługi miniaturek.
Co zrobić, jeśli po poprawce wtyczka przestała działać?
Proszę cofnąć zmiany: wszystkie poprawki są wykonywane w pliku
functions.phpmotywu lub w osobnych plikach szablonów, rdzeń wtyczki nie jest modyfikowany. Wyjątkiem jest usunięcie copyrightu i poprawka paginacji: tam edytowane są pliki samej wtyczki i zostaną one nadpisane podczas aktualizacji. Przed każdą modyfikacją proszę wykonać kopię zapasową pliku, który jest zmieniany.
Czy można używać tych funkcji dla typów wpisów innych wtyczek?
Tak, podejście jest uniwersalne. Proszę zastąpić
joomsport_playerslugiem odpowiedniego typu niestandardowego, a_joomsport_player_ef, jego metapolem. Kod szkieletu (opakowanie z hookiemsave_post) i logika sprawdzeń (get_post_meta→foreach→ warunek) są wykorzystywane ponownie bez zmian.
Jak dodać obsługę miniaturek dla wszystkich typów JoomSport jednocześnie?
Proszę przejść pętlą po tablicy slugów:
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 }
Listę wszystkich niestandardowych typów wtyczki można znaleźć w jej ustawieniach lub poprzez
var_dump(get_post_types()).
Dlaczego nie warto używać pól dodatkowych JoomSport do filtrowania?
JoomSport zapisuje wszystkie wartości pól dodatkowych w jednej tablicy. Odwołanie się do konkretnego pola po stronie frontendu (na przykład podczas filtrowania AJAX) jest praktycznie niemożliwe, dane są sklejone. Jeśli potrzebne jest filtrowanie graczy według wieku, pierwszej litery nazwiska lub dowolnego innego kryterium, proszę zapisywać wartości w osobnym metapolu, tak jak pokazano w sekcjach dotyczących
age_fieldiFirst_letter_Last_Name.
Czy warto wdrożyć JoomSport w Państwa projekcie?
JoomSport to niszowe, ale potężne narzędzie. Jeśli potrzebują Państwo strony ligi sportowej z tabelami, terminarzem i profilami, alternatyw na WordPressie jest szczerze mówiąc niewiele. Wtyczka jest aktywnie rozwijana: na czerwiec 2026 aktualna jest wersja 5.7.8, a deweloperzy sprawnie łatają luki bezpieczeństwa i dodają nowe funkcje.
Słabym punktem jest próg wejścia. Pierwsza konfiguracja wymaga cierpliwości, a część zachowań wtyczki jest zaprojektowana raczej z myślą o programistach niż o zwykłych użytkownikach. Natomiast wsparcie w beardev jest naprawdę dobre: na każde zgłoszenie w helpdesku przychodzi wyczerpująca odpowiedź, często z gotowym fragmentem kodu.
Jeśli projekt jest sportowy, a budżet ograniczony, proszę sięgnąć po JoomSport i zarezerwować czas na dopracowanie szczegółów. Kod z tego artykułu rozwiąże większość typowych problemów, z jakimi spotykają się deweloperzy podczas integracji wtyczki z działającą stroną.



