
🐛 WordPress e JoomSport: correggere bug e personalizzare il plugin
I siti sportivi su WordPress sono una rarità. Quando una federazione tennistica aveva bisogno di un sito con calendario partite, tabelloni dei tornei e profili dei giocatori, le opzioni tra i plugin si sono rivelate frustrantemente limitate. JoomSport PRO è diventata l'unica scelta praticabile, ma anche questa ha richiesto uno sforzo considerevole.
Il plugin ha una curva di apprendimento ripida: configurarlo per uno sport specifico richiede tempo e in alcuni punti il codice si comporta come se non fosse stato scritto per utenti esperti di WordPress. D'altra parte, JoomSport ha un team di supporto solido che risponde a ogni richiesta all'helpdesk, e questo è un vantaggio non da poco quando si personalizza il plugin per un progetto.
Qui sotto trovate una raccolta di correzioni testate e snippet raccolti da un progetto reale. Risolvono problemi specifici: dai fastidiosi avvisi di copyright al filtraggio dei contenuti e ai template di output. Tutti i frammenti di codice sono aggiornati per JoomSport versione 5.7.x (a giugno 2026, 5.7.8).
💡 Panoramica rapida:
- Rimozione del copyright del plugin: una riga nel template
- Correzione dell'impaginazione e dell'errore di divisione per zero
- Aggiunta del supporto alle miniature per i post di JoomSport
- Scrittura di una funzione per aggiungere automaticamente le immagini in evidenza alla galleria
- Calcolo e salvataggio dell'età del giocatore in un campo meta
- Salvataggio della prima lettera del cognome per l'ordinamento
- Creazione di template di output per i custom post type
Rimozione del copyright di JoomSport
Nella versione gratuita, il plugin mostra un link «powered by JoomSport» nel footer delle pagine delle stagioni. Una piccola cosa, ma stona su un sito cliente.
File da modificare:
1 /wp-content/plugins/joomsport-sports-league-results-management/sportleague/views/default/season.php
Intorno alla riga 79, trovate e rimuovete la riga che contiene il link a joomsport.com. Dopo un aggiornamento del plugin dovrete ripetere questa correzione, quindi tenetelo presente quando impostate gli aggiornamenti automatici.
Correzione dell'errore di impaginazione
Se nei log compare questo avviso:
Warning: Division by zero in.../class-jsport-pagination.php on line 72
, il plugin sta tentando di dividere per zero durante il calcolo delle pagine. Il problema si verifica quando la variabile $limit non è definita o è uguale a zero.
File:
1 /wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/class-jsport-pagination.php
Trovate la riga 70:
1 $npage = ceil($this->setcurrent / $limit);
Sostituite con:
1 if (isset($limit) && $limit > 0) { 2 $npage = ceil($this->setcurrent / $limit); 3 }
La divisione viene racchiusa in un controllo: se $limit non è impostato o è uguale a zero, il calcolo semplicemente non viene eseguito e l'errore scompare.
Aggiunta del supporto alle miniature per i post di JoomSport
Per impostazione predefinita, i custom post type di JoomSport (joomsport_player, joomsport_season e altri) non supportano le miniature. Senza questa funzionalità non è possibile costruire una galleria o una scheda giocatore come si deve.
Aggiungete al functions.php del vostro tema:
1 add_post_type_support('joomsport_player', 'thumbnail'); 2 add_post_type_support('joomsport_season', 'thumbnail');
Ora il blocco standard «Immagine in evidenza» apparirà nel pannello di amministrazione per giocatori e stagioni. In modo analogo potete aggiungere il supporto alle miniature per qualsiasi tipo personalizzato di JoomSport sostituendo lo slug appropriato.
Struttura per le funzioni di elaborazione dati di JoomSport
Tutti gli snippet seguenti funzionano all'interno di un unico hook save_post. Viene attivato quando un post viene salvato e consente di popolare automaticamente i campi meta.
Create questo wrapper in 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');
L'hook save_post_joomsport_player garantisce l'esecuzione solo al salvataggio di post di tipo "player". Per altri tipi (joomsport_season, joomsport_match), modifica il suffisso.
Aggiungere automaticamente l'immagine in evidenza alla galleria
Quando hai decine di giocatori, aggiungere manualmente le immagini alla galleria JoomSport diventa noioso. Ecco una funzione che recupera automaticamente l'ID dell'immagine in evidenza al salvataggio di un post e la aggiunge per prima alla galleria:
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 }
La logica è semplice: ottieni l'ID dell'immagine in evidenza, verifichi se esiste già nel meta field vdw_gallery_id. Se non c'è, lo aggiungi. Se c'è, lo salti per evitare duplicati.
Calcolare l'età del giocatore in un meta field
JoomSport memorizza la data di nascita del giocatore nel meta field _joomsport_player_ef. Per mostrare l'età sul sito, devi prima calcolarla e salvarla. Il codice si basa su una soluzione di StackExchange e sulla documentazione 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);
La data di nascita è memorizzata nel quarto elemento dell'array (indice [3]) del meta field _joomsport_player_ef. La funzione la estrae, calcola l'età e la scrive in un meta field separato age_field, che può poi essere usato nei template o per filtrare.
Salvare la prima lettera del cognome
Per ordinare i giocatori alfabeticamente o per ricerche rapide, è comodo avere un campo separato con la prima lettera del cognome. JoomSport memorizza nome e cognome nel meta field _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 con il flag PREG_SPLIT_NO_EMPTY suddivide correttamente una stringa UTF-8 in caratteri, incluso il cirillico. Il primo carattere dell'array del cognome viene salvato nel meta field First_letter_Last_Name.
Cercare e sostituire testo in tutto il sito
Uno snippet universale per la sostituzione massiva di testo nei contenuti e negli estratti. Utile non solo per JoomSport; usalo per qualsiasi modifica globale.
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');
Aggiungi le tue coppie all'array $replace e la sostituzione si applicherà a tutti i post al volo. Funziona più velocemente dei plugin di search-replace, ma ricorda: questo è un filtro, il contenuto originale nel database rimane invariato.
Template di output per i tipi personalizzati JoomSport
JoomSport registra diversi custom post type, tra cui joomsport_player, joomsport_season e joomsport_match. Di default, vengono renderizzati attraverso il single.php del tema, e questo quasi sempre ha un aspetto disordinato.
La soluzione è creare un template separato. Per il tipo "player":
1 single-joomsport_player.php
Il file va nella root del tema. La denominazione segue la regola della gerarchia dei template di WordPress: single-{slug}.php. Analogamente: single-joomsport_season.php per le stagioni, single-joomsport_match.php per le partite.
Prendi il contenuto del file dal single.php del tuo tema e adattalo alla struttura che ti serve. Ad esempio, per il tema Cactus, un template base per la pagina giocatore si presenta così:
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
Copia questo codice e sostituisci le classi CSS e gli hook con quelli utilizzati dal tuo tema. La chiave è la struttura: header, container, sidebar (opzionale), loop principale e footer.
Per una partenza rapida con il plugin, guarda il tutorial ufficiale di BearDev: 11 minuti che ti faranno risparmiare un paio d'ore di configurazione.
⁉️🤔 Domande frequenti
Queste correzioni funzionano con la versione PRO di JoomSport?
Sì, tutti gli snippet sono universali e sono stati testati anche sulla versione PRO. Gli hook
save_post_joomsport_*e i meta field sono identici nella versione gratuita e in quella a pagamento. L'unica sfumatura: la versione PRO aggiunge i propri custom post type, quindi verifica lo slug prima di aggiungere il supporto per le thumbnail.
Cosa devo fare se il plugin smette di funzionare dopo una modifica?
Ripristina le modifiche: tutte le modifiche vengono fatte nel file
functions.phpdel tema o in file template separati; il core del plugin non viene toccato. Le eccezioni sono la rimozione del copyright e la correzione dell'impaginazione: quelle richiedono di modificare i file del plugin stesso e verranno sovrascritte a ogni aggiornamento. Prima di fare qualsiasi modifica, fai un backup del file che stai cambiando.
Posso usare queste funzioni per i post type di altri plugin?
Sì, l'approccio è universale. Sostituisci
joomsport_playercon lo slug del tipo personalizzato che ti serve e_joomsport_player_efcon il suo meta field. Il codice framework (il wrapper con l'hooksave_post) e la logica di controllo (get_post_meta→foreach→ condizione) possono essere riutilizzati esattamente come sono scritti.
Come aggiungo il supporto per le thumbnail a tutti i tipi di JoomSport in una volta sola?
Cicla un array di slug:
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 }
Per un elenco di tutti i tipi personalizzati del plugin, controlla le sue impostazioni o usa
var_dump(get_post_types()).
Perché non dovrei usare i campi extra di JoomSport per i filtri?
JoomSport riversa tutti i valori dei campi extra in un unico array. Accedere a un campo specifico dal frontend (per esempio, durante un filtro AJAX) è praticamente impossibile perché i dati sono concatenati. Se devi filtrare i giocatori per età, lettera iniziale o qualsiasi altro criterio, salva il valore in un meta field separato, come mostrato nelle sezioni su
age_fieldeFirst_letter_Last_Name.
Conviene usare JoomSport per il tuo progetto?
JoomSport è uno strumento di nicchia ma potente. Se ti serve un sito per una lega sportiva con classifiche, calendari e profili, le alternative su WordPress sono francamente scarse. Il plugin è in sviluppo attivo: a giugno 2026, la versione corrente è la 5.7.8 e gli sviluppatori correggono tempestivamente le vulnerabilità e aggiungono funzionalità.
Il punto debole è la curva di apprendimento. La configurazione iniziale richiede pazienza e alcuni comportamenti del plugin sono pensati più per sviluppatori che per utenti normali. Ma il supporto di beardev è veramente buono: ogni messaggio all'helpdesk riceve una risposta dettagliata, spesso con uno snippet già pronto.
Se il tuo progetto è in ambito sportivo e il budget è limitato, scegli JoomSport e metti in conto del tempo per la personalizzazione. Il codice in questo articolo risolverà la maggior parte dei problemi tipici che gli sviluppatori incontrano quando integrano il plugin in un sito live.



