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-143—handle_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ção | Campo ACF | User Meta | Único? | Descrição |
|---|---|---|---|---|
add_click | clicks_counter +1 | — | Não | Registra clique no post |
add_visualization | views_counter +1 | — | Não | Registra visualização |
add_like | likes_counter +1 | user_library_likes[] add | Sim | Curtir (1x por user) |
remove_like | likes_counter -1 | user_library_likes[] del | — | Descurtir |
add_share | shares_counter +1 | — | Não | Compartilhamento |
remove_share | shares_counter -1 | — | Não | Remover compartilhamento |
Evidência: ajax.php:63-143 — switch por $_POST['operation'].
Endpoint AJAX
| Action | Método | Auth requerida |
|---|---|---|
handle_item_interaction_counter | POST | Ambos (nopriv + logado) |
Parâmetros
| Param | Tipo | Obrigatório | Descrição |
|---|---|---|---|
post_id | int | Sim | ID do post WordPress |
operation | string | Sim | Uma 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
*_counterconfigurados.
Pendências
- Sem nonce no endpoint — vulnerável a CSRF.
add_clickeadd_visualizationnão rastreiam unicidade por usuário.add_shareconta o clique no botão, não o compartilhamento efetivo na rede social.