Pular para o conteúdo principal

Interações de Conteúdo

Resumo

Sistema de contadores de interação para qualquer post WordPress. Rastreia clicks, visualizações, likes, shares e remove-likes/shares. Likes são únicos por usuário via user meta.

Fontes de evidência

  • theme/functions/wp/ajax.php:50-143handle_item_interaction_counter (switch completo)
  • theme/single-biblioteca_virtual.php — uso no template da biblioteca
  • ACF fields: clicks_counter, views_counter, likes_counter, shares_counter

Operações

OperaçãoCampo ACFUser MetaÚnico?Descrição
add_clickclicks_counter +1NãoRegistra clique no post
add_visualizationviews_counter +1NãoRegistra visualização
add_likelikes_counter +1user_library_likes[] addSimCurtir (1x por user)
remove_likelikes_counter -1user_library_likes[] delDescurtir
add_shareshares_counter +1NãoCompartilhamento
remove_shareshares_counter -1NãoRemover compartilhamento

Evidência: ajax.php:63-143 — switch por $_POST['operation'].

Endpoint AJAX

ActionMétodoAuth requerida
handle_item_interaction_counterPOSTAmbos (nopriv + logado)

Parâmetros

ParamTipoObrigatórioDescrição
post_idintSimID do post WordPress
operationstringSimUma das operações listadas acima

Respostas

Sucesso:

{
"status": "SUCCESS",
"message": "A curtida foi registrada com sucesso na postagem 123",
"data": []
}

Erro (operação inválida):

{
"status": "ERROR",
"message": "A operação enviada é inválida. As opções disponíveis são add_click, add_like, remove_like, add_share, remove_share",
"data": []
}

Erro (like duplicado):

{
"status": "ERROR",
"message": "Usuário já favoritou",
"data": []
}

Regras de negócio

Likes únicos

  • Verificação: get_user_meta($user_id, 'user_library_likes')in_array($post_id, $aux)
  • Se já curtiu → retorna erro "Usuário já favoritou" e não incrementa.
  • Se não curtiu → add_user_meta($user_id, 'user_library_likes', $post_id) + incrementa contador.

Contadores não-negativos

Ao remover like ou share, o valor mínimo é 0:

$likes < 0 ? 0 : $likes - 1

Evidência: ajax.php:109 e ajax.php:125.

Sem validação de nonce

O endpoint handle_item_interaction_counter não verifica nonce — aceita qualquer POST com post_id e operation. Disponível tanto para logados quanto não-logados.

Evidência: ajax.php:19-20 — registrado em wp_ajax e wp_ajax_nopriv.

Fluxo

sequenceDiagram
participant U as Usuário
participant JS as Frontend
participant WP as WordPress AJAX

U->>JS: Clica no botão de like
JS->>WP: POST handle_item_interaction_counter<br>post_id=123, operation=add_like

alt Usuário não logado
WP->>WP: Incrementa likes_counter ACF
WP-->>JS: SUCCESS (sem user meta)
else Usuário logado
WP->>WP: Verifica user_library_likes
alt Já curtiu
WP-->>JS: ERROR "Usuário já favoritou"
else Não curtiu
WP->>WP: add_user_meta(user_library_likes, post_id)
WP->>WP: update_field(likes_counter, +1)
WP-->>JS: SUCCESS
end
end
JS->>JS: Atualiza UI (contador + estado do botão)

Uso nos templates

O sistema é utilizado em:

  • single-biblioteca_virtual.php — biblioteca virtual (likes, views, shares)
  • Qualquer post que tenha os campos ACF *_counter configurados.

Pendências

  • Sem nonce no endpoint — vulnerável a CSRF.
  • add_click e add_visualization não rastreiam unicidade por usuário.
  • add_share conta o clique no botão, não o compartilhamento efetivo na rede social.