Skip to content

Tout pour WordPress, le développement web — et plus encore

🐛 WordPress et JoomSport : correction de bugs et personnalisation du plugin

🐛 WordPress et JoomSport : correction de bugs et personnalisation du plugin

Les sites sportifs sous WordPress sont une espèce rare. Lorsqu’une fédération de tennis a eu besoin d’un site avec des calendriers de matchs, des tableaux de tournoi et des profils de joueurs, les options de plugins se sont révélées frustrantes par leur pauvreté. JoomSport PRO est devenu le seul choix viable, mais même lui a exigé un effort considérable.

Le plugin présente une courbe d’apprentissage abrupte: le configurer pour un sport spécifique prend du temps, et par endroits le code se comporte comme s’il n’avait pas été écrit pour des utilisateurs expérimentés de WordPress. En contrepartie, JoomSport dispose d’une équipe de support réactive qui répond à chaque demande d’assistance, et c’est un atout sérieux quand vous personnalisez le plugin pour un projet.

Voici une collection de correctifs testés et d’extraits de code recueillis sur un projet réel. Ils résolvent des problèmes précis: des mentions de droits d’auteur gênantes au filtrage de contenu en passant par les gabarits de sortie. Tous les fragments de code sont à jour pour JoomSport version 5.7.x (en date de juin 2026, 5.7.8).

💡 Aperçu rapide:

  • Supprimer la mention de droits d’auteur du plugin: une ligne dans le gabarit
  • Corriger la pagination et l’erreur de division par zéro
  • Ajouter la prise en charge des vignettes pour les publications JoomSport
  • Écrire une fonction pour ajouter automatiquement des images à la une dans la galerie
  • Calculer et enregistrer l’âge du joueur dans un champ meta
  • Enregistrer la première lettre du nom de famille pour le tri
  • Créer des gabarits de sortie pour les types de publication personnalisés

Supprimer la mention de droits d’auteur de JoomSport

Dans la version gratuite, le plugin affiche un lien «powered by JoomSport» dans le pied de page des pages de saison. Un petit détail, mais qui jure sur le site d’un client.

Fichier à modifier:

1/wp-content/plugins/joomsport-sports-league-results-management/sportleague/views/default/season.php

Vers la ligne 79, trouvez et supprimez la ligne contenant le lien vers joomsport.com. Après une mise à jour du plugin, vous devrez répéter cette correction, gardez-le donc à l’esprit lorsque vous paramétrez les mises à jour automatiques.

Corriger l’erreur de pagination

Si cet avertissement apparaît dans vos logs:

Warning: Division by zero in.../class-jsport-pagination.php on line 72

, le plugin tente de diviser par zéro lors du calcul des pages. Le problème survient lorsque la variable $limit n’est pas définie ou vaut zéro.

Fichier:

1/wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/class-jsport-pagination.php

Trouvez la ligne 70:

1$npage = ceil($this->setcurrent / $limit);

Remplacez par:

1if (isset($limit) && $limit > 0) {
2 $npage = ceil($this->setcurrent / $limit);
3}

On encadre la division par une vérification: si $limit n’est pas défini ou vaut zéro, le calcul ne s’exécute tout simplement pas, et l’erreur disparaît.

Ajouter la prise en charge des vignettes pour les publications JoomSport

Par défaut, les types de publication personnalisés de JoomSport (joomsport_player, joomsport_season et autres) ne prennent pas en charge les vignettes. Sans cela, vous ne pouvez pas construire une galerie ou une fiche joueur dignes de ce nom.

Ajoutez au functions.php de votre thème:

1add_post_type_support('joomsport_player', 'thumbnail');
2add_post_type_support('joomsport_season', 'thumbnail');

Désormais, le bloc standard «Image à la une» apparaîtra dans le panneau d’administration pour les joueurs et les saisons. De la même manière, vous pouvez ajouter la prise en charge des vignettes pour n’importe quel type personnalisé JoomSport en substituant le slug approprié.

Cadre pour les fonctions de traitement des données JoomSport

Tous les extraits suivants fonctionnent à l’intérieur d’un seul hook save_post. Il se déclenche lorsqu’une publication est enregistrée et vous permet de remplir automatiquement les champs meta.

Créez cette enveloppe dans functions.php:

1function 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}
10add_action('save_post_joomsport_player', 'my_custom_save_post');

Le hook save_post_joomsport_player garantit l’exécution uniquement lors de l’enregistrement de publications de type «player». Pour d’autres types (joomsport_season, joomsport_match), modifiez le suffixe.

Ajout automatique de l’image à la une dans la galerie

Lorsque vous avez des dizaines de joueurs, ajouter manuellement les images à la galerie JoomSport devient fastidieux. Voici une fonction qui récupère automatiquement l’ID de l’image à la une lors de l’enregistrement d’une publication et l’ajoute en première position dans la galerie:

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
7foreach ($check_id_thumb as $metakey) {
8 if (strpos($values, $check_id_thumb) !== false) {
9 $My_False = true;
10 }
11}
12
13if (!$My_False) {
14 add_post_meta($post_id, 'vdw_gallery_id', $values);
15}

La logique est simple: récupérez l’ID de l’image à la une, vérifiez s’il existe déjà dans le champ meta vdw_gallery_id. Si ce n’est pas le cas, ajoutez-le. Si c’est le cas, ignorez-le pour éviter les doublons.

Calcul de l’âge du joueur dans un champ meta

JoomSport stocke la date de naissance du joueur dans le champ meta _joomsport_player_ef. Pour afficher l’âge sur le site, vous devez d’abord le calculer et l’enregistrer. Le code est basé sur une solution de StackExchange et la documentation ACF.

1$date_of_birth = get_post_meta($post_id, '_joomsport_player_ef', false);
2
3foreach ($date_of_birth as $metakey) {
4 $metakey_borthay = $metakey[3];
5}
6
7$age = intval(date('Y', time() - strtotime($metakey_borthay))) - 1970;
8
9delete_post_meta($post_id, 'age_field');
10add_post_meta($post_id, 'age_field', $age);

La date de naissance est stockée dans le quatrième élément du tableau (index [3]) du champ meta _joomsport_player_ef. La fonction l’extrait, calcule l’âge et l’écrit dans un champ meta age_field distinct, qui peut ensuite être utilisé dans les templates ou pour le filtrage.

Enregistrement de la première lettre du nom de famille

Pour trier les joueurs par ordre alphabétique ou effectuer une recherche rapide, il est pratique de disposer d’un champ séparé contenant la première lettre du nom de famille. JoomSport stocke le prénom et le nom dans le champ meta _joomsport_player_personal.

1$val_last_name = get_post_meta($post_id, '_joomsport_player_personal', false);
2
3foreach ($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
13foreach ($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
19if (!$My_False_Liter_Last_Name) {
20 update_post_meta($post_id, 'First_letter_Last_Name', $metakey_Last_Name);
21}

preg_split avec le drapeau PREG_SPLIT_NO_EMPTY divise correctement une chaîne UTF-8 en caractères, y compris le cyrillique. Le premier caractère du tableau du nom de famille est enregistré dans le champ meta First_letter_Last_Name.

Rechercher et remplacer du texte sur l’ensemble du site

Un extrait universel pour le remplacement de texte en masse dans le contenu et les extraits. Utile non seulement pour JoomSport; utilisez-le pour toute modification globale.

1function 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}
9add_filter('the_content', 'replace_text_wps');
10add_filter('the_excerpt', 'replace_text_wps');

Ajoutez vos propres paires au tableau $replace, et le remplacement s’appliquera à toutes les publications à la volée. Cela fonctionne plus rapidement que les plugins de recherche-remplacement, mais rappelez-vous: il s’agit d’un filtre, le contenu original dans la base de données reste inchangé.

Templates de sortie pour les types personnalisés JoomSport

JoomSport enregistre plusieurs types de publication personnalisés, notamment joomsport_player, joomsport_season et joomsport_match. Par défaut, ils sont rendus via le fichier single.php du thème, et cela donne presque toujours un résultat brouillon.

La solution consiste à créer un template distinct. Pour le type «player»:

1single-joomsport_player.php

Le fichier se place à la racine du thème. Le nommage suit la règle de la hiérarchie des templates WordPress: single-{slug}.php. De manière similaire: single-joomsport_season.php pour les saisons, single-joomsport_match.php pour les matchs.

Récupérez le contenu du fichier single.php de votre thème et adaptez-le à la structure dont vous avez besoin. Par exemple, pour le thème Cactus, un template basique de page joueur ressemble à ceci:

1<?php
2/* Template Name: Post joomsport_player */
3
4get_header();
5
6$page_sidebar_layout = apply_filters('cactus_page_sidebar_layout', cactus_option('page_sidebar_layout'));
7switch ($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

Copiez ce code et remplacez les classes CSS et les hooks par ceux qu’utilise votre thème. L’essentiel, c’est la structure: en-tête, conteneur, barre latérale (optionnelle), boucle principale et pied de page.

Pour une prise en main rapide du plugin, regardez le tutoriel officiel de BearDev: 11 minutes qui vous feront gagner quelques heures de configuration.

⁉️🤔 Foire aux questions

Ces correctifs fonctionnent-ils avec la version PRO de JoomSport?

Oui, tous les extraits de code sont universels et ont également été testés sur la version PRO. Les hooks save_post_joomsport_* et les champs meta sont identiques dans les versions gratuite et payante. La seule nuance: la version PRO ajoute ses propres types de publication personnalisés, vérifiez donc le slug avant d’ajouter la prise en charge des vignettes.

Que dois-je faire si le plugin cesse de fonctionner après une modification?

Revenez sur les modifications: toutes les interventions se font dans le fichier functions.php du thème ou dans des fichiers de template séparés; le cœur du plugin n’est pas affecté. Les exceptions sont la suppression du copyright et la correction de la pagination: celles-ci impliquent de modifier les fichiers propres au plugin, et elles seront écrasées lors d’une mise à jour. Avant toute modification, sauvegardez le fichier que vous allez changer.

Puis-je utiliser ces fonctions pour les types de publication d’autres plugins?

Oui, l’approche est universelle. Remplacez joomsport_player par le slug du type personnalisé dont vous avez besoin, et _joomsport_player_ef par son champ meta. Le code cadre (l’enveloppe avec le hook save_post) et la logique de vérification (get_post_metaforeach → condition) peuvent être réutilisés tels quels.

Comment ajouter la prise en charge des vignettes pour tous les types JoomSport en une seule fois?

Parcourez un tableau de slugs avec une boucle:

1$joomsport_types = ['joomsport_player', 'joomsport_season', 'joomsport_match', 'joomsport_team'];
2foreach ($joomsport_types as $type) {
3 add_post_type_support($type, 'thumbnail');
4}

Pour obtenir la liste de tous les types personnalisés du plugin, consultez ses paramètres ou utilisez var_dump(get_post_types()).

Pourquoi ne devrais-je pas utiliser les champs supplémentaires de JoomSport pour le filtrage?

JoomSport regroupe toutes les valeurs des champs supplémentaires dans un seul tableau. Accéder à un champ spécifique depuis le frontend (par exemple, lors d’un filtrage AJAX) est pratiquement impossible car les données sont concaténées. Si vous devez filtrer des joueurs par âge, première lettre ou tout autre critère, enregistrez la valeur dans un champ meta distinct, comme illustré dans les sections sur age_field et First_letter_Last_Name.

Faut-il utiliser JoomSport pour votre projet?

JoomSport est un outil de niche mais puissant. Si vous avez besoin d’un site de ligue sportive avec des classements, des calendriers et des profils, les alternatives sur WordPress sont franchement rares. Le plugin est activement développé: en juin 2026, la version actuelle est la 5.7.8, et les développeurs corrigent rapidement les vulnérabilités et ajoutent des fonctionnalités.

Le point faible est la courbe d’apprentissage. La configuration initiale demande de la patience, et certains comportements du plugin sont davantage pensés pour des développeurs que pour des utilisateurs classiques. Mais le support de beardev est vraiment de qualité: chaque message adressé au helpdesk reçoit une réponse détaillée, souvent accompagnée d’un extrait de code prêt à l’emploi.

Si votre projet est lié au sport et que votre budget est limité, optez pour JoomSport et prévoyez du temps pour la personnalisation. Le code présenté dans cet article résoudra la plupart des problèmes typiques que rencontrent les développeurs lors de l’intégration du plugin sur un site en production.

🔗 JoomSport sur WordPress.org🔗 Site officiel de JoomSport