Eu tenho uma função que armazena o status "like" para uma postagem como meta meta. Quero associar esse "curtir" ao usuário que gostou, portanto, configurei um campo personalizado chamado "like_status_ {user_id}" (em que {user_id} é o ID do usuário conectado no momento) que eu armazeno como 0 ou 1. Portanto, para um post com vários "likes", haveria vários meta-valores no banco de dados configurados da seguinte maneira:
'meta_key' = 'like_status_0'
'meta_value' = 1
'meta_key' = 'like_status_2'
'meta_value' = 1
'meta_key' = 'like_status_34'
'meta_value' = 1
....e assim por diante.
Há potencialmente milhares de curtidas em uma postagem específica. Como eu executaria uma consulta exibida se outra pessoa também gostasse dessa postagem?
Eu estava pensando algo assim:
$query = new WP_Query(array(
'meta_key' => 'like_status_{user_id}',
'meta_value' => 1,
));
Estou tentando enviar uma notificação a todos que gostaram de uma postagem quando alguém gosta dessa postagem ... algo como: "Ei, alguém gostou da postagem que você gostou. Você deve conferir!" Mas eu preciso de uma maneira de descobrir se alguém mais gostou desse post e, se sim, quem seria para que eu pudesse notificá-lo.
Se não for possível, você poderia sugerir uma maneira melhor de armazenar esses dados como post_meta, mantendo a eficiência de atualizar rapidamente o status semelhante de um único usuário em uma postagem?
É bastante difícil responder concretamente à sua pergunta. A primeira parte é fácil. Recentemente, fiz algo semelhante no stackoverflow
As meta chaves são comparadas e correspondem exatamente.
WP_Query
não temos como ajustar esse comportamento com um parâmetro simples, mas sempre podemos nos apresentar e ajustar aposts_where
cláusula para fazer umaLIKE
comparação nas meta-chaves.O FILTRO
Este é apenas um filtro básico, ajuste-o conforme necessário.
Como você pode ver, o filtro é acionado apenas quando definimos nosso novo parâmetro personalizado,
wildcard_on_key
comotrue
. Quando isso ocorre, simplesmente mudamos o=
comparador para oLIKE
comparadorApenas uma observação,
LIKE
comparações são inerentemente mais caras do que outras comparaçõesA PERGUNTA
Você pode simplesmente consultar suas postagens da seguinte forma para obter todas as postagens com meta chaves
like_status_{user_id}
OUTRA QUESTÃO
Os campos personalizados não têm impacto no desempenho. Você pode ler minha postagem sobre este assunto aqui . No entanto, estou preocupado com o fato de você dizer que cada post pode ter centenas ou milhares de curtidas. Isso pode afetar a obtenção e o armazenamento em cache de uma quantidade tão grande de dados de campo personalizados. Ele também pode entupir seu banco de dados com uma enorme quantidade de dados de campo personalizados desnecessários, o que dificulta a manutenção.
Não sou muito fã de armazenar dados serializados em campos personalizados, pois não é possível pesquisar ou solicitar dados serializados. No entanto, eu sugeriria o armazenamento de todos os IDs de usuário em uma matriz em um campo personalizado. Você pode simplesmente atualizar a matriz com o ID do usuário quando um usuário gosta de uma postagem. É fácil obter os dados do campo personalizado e fazer um loop sobre a matriz de IDs e fazer algo com as IDs. Basta dar uma olhada
get_post_meta()
A atualização de um campo personalizado também é fácil. Para isso, você precisará analisar
update_post_meta()
, não sei como criar seus campos personalizados, masupdate_post_meta()
é definitivamente algo que você gostaria de usar.Se você precisar enviar e-mails ou notificações por push quando um campo personalizado for atualizado, você terá os seguintes ganchos disponíveis para trabalhar. ( Veja
update_metadata()
para o contexto )update_postmeta
atualizado _ {$ meta_type} _meta
updated_postmeta
atualizar _ {$ meta_type} _meta
atualizar _ {$ meta_type} _metadata
CONCLUSÃO
Pouco antes de postar isso, novamente, antes de seguir a rota serializada, verifique se você não precisa classificar pelos dados classificados ou procurar dados específicos dentro dos dados serializados.
fonte
Desde o wordpress 5.1, agora é possível usar a meta query como:
fonte
Se, posteriormente, você desejar estender isso, com estatísticas, recursos, etc, mais detalhados, outra alternativa poderá ser: tabela (s) personalizada (s)
profissionais : adaptados às suas necessidades e podem ser indexados para obter melhor desempenho.
contras : mais trabalho
Também pode haver uma solução alternativa usando uma taxonomia customizada, que pode oferecer melhor desempenho de consulta do que as meta-consultas posteriores, devido à maneira como as tabelas principais são indexadas.
Não tenho certeza do tipo de notificação que você quer dizer aqui, mas isso pode se tornar volumoso rapidamente.
Exemplo : um usuário que gosta de ~ 1000 postagens e cada postagem recebe ~ 1000 curtidas, então há 1 milhão de notificações nos canais, apenas para esse usuário! Se forem notificações por email, o provedor de host pode não estar feliz e o usuário ficaria louco. Isso também pode ser caro com um serviço de email de terceiros.
fonte
De acordo com a documentação WP_Meta_Query , você pode usar o
compare
argumento nometa_query
argumento WP_Query. No entanto, você só pode comparar novalue
e não no,key
portanto, pode querer repensar como você estrutura isso.Um
like
argumento seria assim:Como você não pode fazer uma pesquisa 'LIKE',
key
sugiro que você adicione as postagens curtidas na meta do usuário e faça uma pesquisa WP_User_Query para usuários que curtiram essa postagem:fonte