
🐛 WordPress e JoomSport: corrigir erros e personalizar o plugin
Sites desportivos em WordPress são uma espécie rara. Quando uma federação de ténis precisou de um site com calendários de jogos, tabelas de torneios e perfis de jogadores, as opções de plugins revelaram-se frustrantemente limitadas. O JoomSport PRO tornou-se a única escolha viável, mas mesmo este exigiu um esforço considerável.
O plugin tem uma curva de aprendizagem acentuada: configurá-lo para um desporto específico leva tempo e, em certos pontos, o código comporta-se como se não tivesse sido escrito para utilizadores experientes de WordPress. Por outro lado, o JoomSport tem uma equipa de suporte forte que responde a todos os pedidos de ajuda, e isso é uma mais-valia séria quando se está a personalizar o plugin para um projeto.
Abaixo encontra uma compilação de correções testadas e trechos de código reunidos a partir de um projeto real. Resolvem problemas específicos: desde irritantes avisos de direitos de autor até à filtragem de conteúdo e modelos de saída. Todos os fragmentos de código estão atualizados para a versão 5.7.x do JoomSport (à data de junho de 2026, 5.7.8).
💡 Visão geral rápida:
- Remover os direitos de autor do plugin: uma linha no modelo
- Corrigir a paginação e o erro de divisão por zero
- Adicionar suporte para miniaturas nos artigos do JoomSport
- Escrever uma função para adicionar automaticamente imagens destacadas à galeria
- Calcular e guardar a idade do jogador num campo meta
- Guardar a primeira letra do apelido para ordenação
- Criar modelos de saída para tipos de conteúdo personalizados
Remover os direitos de autor do JoomSport
Na versão gratuita, o plugin mostra um link «powered by JoomSport» no rodapé das páginas de época. Um pequeno pormenor, mas que fica deslocado no site de um cliente.
Ficheiro a editar:
1 /wp-content/plugins/joomsport-sports-league-results-management/sportleague/views/default/season.php
Por volta da linha 79, localize e remova a linha que contém o link para joomsport.com. Após uma atualização do plugin, terá de repetir esta correção, por isso tenha isso em mente ao configurar as atualizações automáticas.
Corrigir o erro de paginação
Se este aviso aparecer nos seus registos:
Warning: Division by zero in.../class-jsport-pagination.php on line 72
, o plugin está a tentar dividir por zero ao calcular as páginas. O problema ocorre quando a variável $limit não está definida ou é igual a zero.
Ficheiro:
1 /wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/class-jsport-pagination.php
Localize a linha 70:
1 $npage = ceil($this->setcurrent / $limit);
Substitua por:
1 if (isset($limit) && $limit > 0) { 2 $npage = ceil($this->setcurrent / $limit); 3 }
Ao envolver a divisão numa verificação: se $limit não estiver definido ou for igual a zero, o cálculo simplesmente não é executado e o erro desaparece.
Adicionar suporte para miniaturas nos artigos do JoomSport
Por predefinição, os tipos de conteúdo personalizados do JoomSport (joomsport_player, joomsport_season e outros) não suportam miniaturas. Sem isto, não é possível construir uma galeria ou um cartão de jogador adequados.
Adicione ao functions.php do seu tema:
1 add_post_type_support('joomsport_player', 'thumbnail'); 2 add_post_type_support('joomsport_season', 'thumbnail');
Agora o bloco padrão «Imagem destacada» aparecerá no painel de administração para jogadores e épocas. De forma semelhante, pode adicionar suporte para miniaturas a qualquer tipo personalizado do JoomSport, substituindo o slug apropriado.
Estrutura para funções de processamento de dados do JoomSport
Todos os trechos seguintes funcionam dentro de um único hook save_post. Este é acionado quando um artigo é guardado e permite preencher automaticamente campos meta.
Crie este invólucro no 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');
O hook save_post_joomsport_player garante a execução apenas ao guardar publicações do tipo «player». Para outros tipos (joomsport_season, joomsport_match), altere o sufixo.
Adicionar automaticamente a imagem destacada à galeria
Quando tem dezenas de jogadores, adicionar imagens manualmente à galeria do JoomSport torna-se fastidioso. Eis uma função que obtém automaticamente o ID da imagem destacada ao guardar uma publicação e a adiciona em primeiro lugar à galeria:
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 }
A lógica é simples: obtém o ID da imagem destacada, verifica se já existe no campo meta vdw_gallery_id. Se não existir, adiciona-o. Se existir, ignora-o para evitar criar duplicados.
Calcular a idade do jogador num campo meta
O JoomSport guarda a data de nascimento do jogador no campo meta _joomsport_player_ef. Para mostrar a idade no site, precisa primeiro de a calcular e guardar. O código baseia-se numa solução do StackExchange e na documentação do 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);
A data de nascimento é guardada no quarto elemento do array (índice [3]) do campo meta _joomsport_player_ef. A função extrai-a, calcula a idade e escreve-a num campo meta separado age_field, que pode depois ser usado em templates ou para filtragem.
Guardar a primeira letra do apelido
Para ordenar jogadores alfabeticamente ou para pesquisa rápida, é conveniente ter um campo separado com a primeira letra do apelido. O JoomSport guarda o nome próprio e o apelido no campo meta _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 }
O preg_split com a flag PREG_SPLIT_NO_EMPTY divide corretamente uma string UTF-8 em caracteres, incluindo cirílico. O primeiro caractere do array do apelido é guardado no campo meta First_letter_Last_Name.
Pesquisar e substituir texto em todo o site
Um snippet universal para substituição de texto em massa no conteúdo e nos excertos. Útil não só para o JoomSport; utilize-o para quaisquer edições globais.
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');
Adicione os seus próprios pares ao array $replace e a substituição aplicar-se-á a todas as publicações em tempo real. Funciona mais rapidamente do que plugins de pesquisar e substituir, mas lembre-se: isto é um filtro, o conteúdo original na base de dados permanece inalterado.
Templates de saída para tipos personalizados do JoomSport
O JoomSport regista vários tipos de publicação personalizados, incluindo joomsport_player, joomsport_season e joomsport_match. Por predefinição, são renderizados através do single.php do tema, e isto quase sempre fica com um aspeto desleixado.
A solução é criar um template separado. Para o tipo «player»:
1 single-joomsport_player.php
O ficheiro é colocado na raiz do tema. O nome segue a regra da hierarquia de templates do WordPress: single-{slug}.php. De forma semelhante: single-joomsport_season.php para épocas, single-joomsport_match.php para jogos.
Pegue no conteúdo do ficheiro single.php do seu tema e adapte-o à estrutura de que necessita. Por exemplo, para o tema Cactus, um template básico de página de jogador tem este aspeto:
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
Copie este código e substitua as classes CSS e os hooks pelos que o seu tema utiliza. O essencial é a estrutura: cabeçalho, contentor, barra lateral (opcional), ciclo principal e rodapé.
Para um arranque rápido com o plugin, veja o tutorial oficial da BearDev: 11 minutos que lhe pouparão um par de horas de configuração.
⁉️🤔 Perguntas frequentes
Estas correções funcionam na versão PRO do JoomSport?
Sim, todos os snippets são universais e foram testados também na versão PRO. Os hooks
save_post_joomsport_*e os campos meta são idênticos nas versões gratuita e paga. A única nuance: a versão PRO adiciona os seus próprios custom post types, pelo que deve verificar o slug antes de adicionar o suporte para imagens destacadas.
O que devo fazer se o plugin deixar de funcionar após uma edição?
Reverta as alterações: todas as edições são feitas no
functions.phpdo tema ou em ficheiros de template separados; o núcleo do plugin não é afetado. As exceções são a remoção do copyright e a correção da paginação: essas envolvem a edição dos ficheiros do próprio plugin e serão sobrescritas numa atualização. Antes de fazer qualquer edição, faça uma cópia de segurança do ficheiro que vai alterar.
Posso usar estas funções para custom post types de outros plugins?
Sim, a abordagem é universal. Substitua
joomsport_playerpelo slug do custom type de que precisa e_joomsport_player_efpelo seu campo meta. O código da estrutura (o wrapper com o hooksave_post) e a lógica de verificação (get_post_meta→foreach→ condição) podem ser reutilizados exatamente como estão escritos.
Como adiciono suporte para imagens destacadas a todos os tipos do JoomSport de uma só vez?
Percorra um array de 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 }
Para obter uma lista de todos os custom types do plugin, verifique as suas definições ou use
var_dump(get_post_types()).
Por que não devo usar os campos extra do JoomSport para filtragem?
O JoomSport despeja todos os valores dos campos extra num único array. Aceder a um campo específico a partir do frontend (por exemplo, durante uma filtragem AJAX) é praticamente impossível porque os dados estão concatenados. Se precisar de filtrar jogadores por idade, primeira letra ou qualquer outro critério, guarde o valor num campo meta separado, como mostrado nas secções sobre
age_fieldeFirst_letter_Last_Name.
Deve usar o JoomSport no seu projeto?
O JoomSport é uma ferramenta de nicho, mas poderosa. Se precisa de um site de ligas desportivas com tabelas, calendários e perfis, as alternativas no WordPress são francamente escassas. O plugin é desenvolvido ativamente: em junho de 2026, a versão atual é a 5.7.8 e os developers corrigem vulnerabilidades e adicionam funcionalidades com prontidão.
O ponto fraco é a curva de aprendizagem. A configuração inicial requer paciência e alguns comportamentos do plugin são pensados mais para developers do que para utilizadores comuns. Mas o suporte da beardev é genuinamente bom: cada mensagem no helpdesk recebe uma resposta detalhada, muitas vezes com um snippet pronto a usar.
Se o seu projeto está relacionado com desporto e o seu orçamento é limitado, avance com o JoomSport e reserve tempo para personalização. O código neste artigo resolverá a maioria dos problemas típicos que os developers encontram ao integrar o plugin num site ativo.



