Skip to content

Todo para WordPress, el desarrollo web — y mucho más

🐛 WordPress y JoomSport: arreglando errores y personalizando el plugin

🐛 WordPress y JoomSport: arreglando errores y personalizando el plugin

Los sitios web deportivos en WordPress son una rareza. Cuando una federación de tenis necesitó un sitio con calendarios de partidos, tablas de torneos y perfiles de jugadores, las opciones de plugins resultaron ser frustrantemente limitadas. JoomSport PRO se convirtió en la única opción viable, pero incluso este requirió un esfuerzo considerable.

El plugin tiene una curva de aprendizaje pronunciada: configurarlo para un deporte específico lleva tiempo y, en algunos puntos, el código se comporta como si no estuviera escrito para usuarios experimentados de WordPress. Por otro lado, JoomSport cuenta con un sólido equipo de soporte que responde a cada consulta en el servicio de asistencia, y eso es una ventaja importante cuando se está personalizando el plugin para un proyecto.

A continuación, presento una recopilación de soluciones probadas y fragmentos de código reunidos a partir de un proyecto real. Resuelven problemas específicos: desde molestos avisos de derechos de autor hasta el filtrado de contenido y las plantillas de salida. Todos los fragmentos de código están actualizados para la versión 5.7.x de JoomSport (a junio de 2026, la 5.7.8).

💡 Resumen rápido:

  • Eliminar los derechos de autor del plugin: una línea en la plantilla
  • Corregir la paginación y el error de división por cero
  • Añadir soporte para miniaturas en las publicaciones de JoomSport
  • Escribir una función para agregar automáticamente imágenes destacadas a la galería
  • Calcular y guardar la edad del jugador en un campo meta
  • Guardar la primera letra del apellido para ordenar
  • Crear plantillas de salida para tipos de contenido personalizados

Eliminar los derechos de autor de JoomSport

En la versión gratuita, el plugin muestra un enlace «powered by JoomSport» en el pie de página de las páginas de temporada. Es un detalle menor, pero desentona en el sitio de un cliente.

Archivo a editar:

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

Alrededor de la línea 79, busque y elimine la línea que contiene el enlace a joomsport.com. Después de una actualización del plugin, deberá repetir esta corrección, así que téngalo en cuenta al configurar las actualizaciones automáticas.

Corregir el error de paginación

Si aparece esta advertencia en sus registros:

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

, el plugin está intentando dividir por cero al calcular las páginas. El problema ocurre cuando la variable $limit no está definida o es igual a cero.

Archivo:

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

Busque la línea 70:

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

Sustitúyala por:

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

Al envolver la división en una comprobación: si $limit no está establecido o es igual a cero, el cálculo simplemente no se ejecuta y el error desaparece.

Añadir soporte para miniaturas en las publicaciones de JoomSport

Por defecto, los tipos de contenido personalizados de JoomSport (joomsport_player, joomsport_season y otros) no admiten miniaturas. Sin esto, no se puede crear una galería o una ficha de jugador adecuadas.

Añada al archivo functions.php de su tema:

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

Ahora aparecerá el bloque estándar «Imagen destacada» en el panel de administración para jugadores y temporadas. De manera similar, puede añadir soporte para miniaturas a cualquier tipo personalizado de JoomSport sustituyendo el slug correspondiente.

Estructura para las funciones de procesamiento de datos de JoomSport

Todos los fragmentos siguientes funcionan dentro de un único hook save_post. Este se activa cuando se guarda una publicación y le permite rellenar automáticamente los campos meta.

Cree este envoltorio en 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');

El hook save_post_joomsport_player garantiza la ejecución solo al guardar publicaciones de tipo «player». Para otros tipos (joomsport_season, joomsport_match), cambie el sufijo.

Adición automática de la imagen destacada a la galería

Cuando tiene decenas de jugadores, añadir imágenes manualmente a la galería de JoomSport se vuelve tedioso. Esta función obtiene automáticamente el ID de la imagen destacada al guardar una publicación y la añade en primer lugar a la galería:

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 lógica es simple: obtiene el ID de la imagen destacada, verifica si ya existe en el metadato vdw_gallery_id. Si no está, lo añade. Si ya está, lo omite para evitar duplicados.

Cálculo de la edad del jugador en un metadato

JoomSport almacena la fecha de nacimiento del jugador en el metadato _joomsport_player_ef. Para mostrar la edad en el sitio, primero debe calcularla y guardarla. El código se basa en una solución de StackExchange y en la documentación de 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 fecha de nacimiento se almacena en el cuarto elemento del array (índice [3]) del metadato _joomsport_player_ef. La función la extrae, calcula la edad y la escribe en un metadato separado age_field, que luego puede usarse en plantillas o para filtrado.

Guardado de la primera letra del apellido

Para ordenar jugadores alfabéticamente o realizar búsquedas rápidas, es conveniente tener un campo separado con la primera letra del apellido. JoomSport almacena el nombre y apellido en el metadato _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 con el flag PREG_SPLIT_NO_EMPTY divide correctamente una cadena UTF-8 en caracteres, incluido el cirílico. El primer carácter del array del apellido se guarda en el metadato First_letter_Last_Name.

Búsqueda y reemplazo de texto en todo el sitio

Un fragmento universal para el reemplazo masivo de texto en contenido y extractos. Útil no solo para JoomSport; utilícelo para cualquier edición global.

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');

Añada sus propios pares al array $replace y el reemplazo se aplicará a todas las publicaciones sobre la marcha. Funciona más rápido que los plugins de buscar y reemplazar, pero recuerde: esto es un filtro, el contenido original en la base de datos permanece sin cambios.

Plantillas de salida para tipos personalizados de JoomSport

JoomSport registra varios tipos de publicación personalizados, entre ellos joomsport_player, joomsport_season y joomsport_match. Por defecto, se renderizan a través del archivo single.php del tema, y esto casi siempre se ve descuidado.

La solución es crear una plantilla separada. Para el tipo «player»:

1single-joomsport_player.php

El archivo se coloca en la raíz del tema. El nombre sigue la regla de la jerarquía de plantillas de WordPress: single-{slug}.php. De manera similar: single-joomsport_season.php para temporadas, single-joomsport_match.php para partidos.

Tome el contenido del archivo single.php de su tema y adáptelo a la estructura que necesite. Por ejemplo, para el tema Cactus, una plantilla básica de página de jugador tiene este aspecto:

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

Copie este código y reemplace las clases CSS y los ganchos por los que utiliza su tema. La clave es la estructura: cabecera, contenedor, barra lateral (opcional), bucle principal y pie de página.

Para un inicio rápido con el plugin, vea el tutorial oficial de BearDev: 11 minutos que le ahorrarán un par de horas de configuración.

⁉️🤔 Preguntas frecuentes

¿Estas soluciones funcionan en la versión PRO de JoomSport?

Sí, todos los fragmentos de código son universales y se han probado también en la versión PRO. Los hooks save_post_joomsport_* y los meta campos son idénticos en las versiones gratuita y de pago. El único matiz: la versión PRO añade sus propios tipos de contenido personalizados, así que verifique el slug antes de añadir soporte para miniaturas.

¿Qué debo hacer si el plugin deja de funcionar después de una edición?

Revierta los cambios: todas las ediciones se realizan en el archivo functions.php del tema o en archivos de plantilla separados; el núcleo del plugin no se ve afectado. Las excepciones son la eliminación del copyright y la corrección de la paginación: esas implican editar los archivos propios del plugin, y se sobrescribirán al actualizar. Antes de realizar cualquier edición, haga una copia de seguridad del archivo que va a modificar.

¿Puedo usar estas funciones para tipos de contenido de otros plugins?

Sí, el enfoque es universal. Sustituya joomsport_player por el slug del tipo personalizado que necesite, y _joomsport_player_ef por su meta campo. El código marco (la envoltura con el hook save_post) y la lógica de verificación (get_post_metaforeach → condición) pueden reutilizarse exactamente como están escritos.

¿Cómo añado soporte para miniaturas a todos los tipos de JoomSport a la vez?

Recorra un array de slugs:

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

Para obtener una lista de todos los tipos personalizados del plugin, consulte sus ajustes o use var_dump(get_post_types()).

¿Por qué no debería usar los campos extra de JoomSport para filtrar?

JoomSport vuelca todos los valores de los campos extra en un único array. Acceder a un campo específico desde el frontend (por ejemplo, durante un filtrado AJAX) es prácticamente imposible porque los datos están concatenados. Si necesita filtrar jugadores por edad, primera letra o cualquier otro criterio, guarde el valor en un meta campo separado, como se muestra en las secciones sobre age_field y First_letter_Last_Name.

¿Debería usar JoomSport para su proyecto?

JoomSport es una herramienta de nicho pero potente. Si necesita un sitio de ligas deportivas con tablas, calendarios y perfiles, las alternativas en WordPress son, francamente, escasas. El plugin se desarrolla activamente: a junio de 2026, la versión actual es la 5.7.8, y los desarrolladores parchean vulnerabilidades y añaden funciones con prontitud.

El punto débil es la curva de aprendizaje. La configuración inicial requiere paciencia, y algunos comportamientos del plugin están pensados más para desarrolladores que para usuarios comunes. Pero el soporte de beardev es genuinamente bueno: cada mensaje al servicio de asistencia recibe una respuesta detallada, a menudo con un fragmento de código listo para usar.

Si su proyecto está relacionado con el deporte y su presupuesto es limitado, opte por JoomSport y reserve tiempo para la personalización. El código de este artículo resolverá la mayoría de los problemas típicos que los desarrolladores encuentran al integrar el plugin en un sitio en producción.

🔗 JoomSport en WordPress.org🔗 Sitio web oficial de JoomSport