Aqui estão os argumentos para minha consulta:
$args = array(
'post_type' => 'news',
'meta_query' => array(
array(
'key' => 'topics',
'value' => 'sports',
)
)
);
Isso funciona quando topics
é uma string, mas não quando é uma matriz. Gostaria que essa consulta funcionasse quando, topics
por exemplo,array( 'sports', 'nonprofit', etc. )
Existe uma maneira de criar consultas meta com matrizes como uma meta_key?
query
meta-query
mike23
fonte
fonte
Respostas:
Alimentando a consulta com uma matriz de valores possíveis
Se o valor no banco de dados for uma sequência e você desejar alimentar a consulta com vários valores:
Procurando por um valor específico em uma matriz serializada de dados
Se o valor no banco de dados for uma matriz de vários tópicos e você desejar procurar um único tópico nessa matriz (observe que uma matriz no banco de dados pode ser recuperada como tal, mas reside no banco de dados na forma serializada, que é um string também):
Usar 'LIKE' como o valor de comparação não é uma instrução tão clara quanto você poderia esperar, mas é a melhor opção.
Além disso, sua única outra opção seria recuperar todas as postagens que possuem os meta_key "topics" definidos e iterá-las manualmente ou, em outras palavras, verificar o valor no loop e exibir as postagens na referida condição.
fonte
Para sair da resposta de Johannes, já que é uma matriz serializada, se você estiver armazenando algo como IDs de usuário (que foi o meu caso), talvez seja necessário lidar com isso de maneira um pouco diferente.
A meta de postagem estava sendo salva como:
Então, sim, eles são números inteiros, mas através
update_post_meta
deles estavam sendo salvos como strings.Então, na verdade, você está fazendo uma comparação LIKE com a versão serializada do que está procurando. Passei algumas horas tentando fazer com que algo assim funcionasse e, até agora, foi o melhor que consegui.
fonte
'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => ':' . $user_id . ';', 'compare' => 'NOT LIKE' ) )
porque quando serializados, todos os valores são salvos como: ' :valor;'Outra pequena melhora em relação à resposta do @sMyles.
Eu tive casos em que os IDs foram armazenados como seqüências de caracteres (como quando extraídos de uma entrada de formulário) e como números inteiros (por exemplo
update_post_meta($post_id, authorized_users', array(get_current_user_id()));
). Esse é o problema conhecido emwp_set_object_terms()
que você pode usar IDs de termo para definir os termos, mas se você não os converter como números inteiros, terá 50% de chance de criar novos termos com esses números como seus nomes. em vez de.Isso pode resultar no armazenamento diferenciado em uma matriz serializada, como pode ser visto nos trechos de um caso desse no banco de dados do site de teste:
Ambos os itens acima, quando alimentados
print_r()
, renderizam comoPara corrigir isso, fiz um pequeno ajuste no
meta_query
adicionando umarelation
e outra versão da consulta que convertia o valor como um número inteiro em vez de uma string.Aqui está o resultado final:
EDIT: Acabei de perceber que esse método poderia correr o risco de colisões com índices de matriz, o que poderia permitir a alguém acesso ilícito a materiais se eles não estiverem na matriz, mas seu ID de usuário aparece como um índice. Dessa forma, embora isso funcione se você tiver o problema discutido, a melhor prática é garantir que quaisquer valores que você deseja procurar sejam convertidos em seqüências de caracteres antes de salvá-los, para que você possa usar o método @sMyles '.
fonte
Eu aceitaria a resposta de Johannes. No entanto, quero melhorar isso, porque usando essa meta_query, você encontrará um caso como este
seu valor é
quando você pesquisa
o resultado retornará 'sport' e 'sport2'.
Para corrigir isso, altere os argumentos meta_query para
Isso ocorre porque o valor é serializado no banco de dados e cada item será separado por ponto e vírgula. Assim, os argumentos acima funcionarão
Se os itens no valor forem números, basta remover as aspas duplas "
fonte
Eu lutei com algo semelhante hoje. Eu tenho que consultar um campo de relacionamento ACF (Advanced Custom Fields) com vários usuários relacionados (matriz).
Após atualizar o campo via php, a consulta não funcionou. Após atualizá-lo pela interface do usuário do ACF, a consulta funcionou.
O problema era que meu código php definia os valores de relacionamento como int-values, a interface do usuário definia-os como string-values. Para garantir que ambos funcionem, eu uso essa consulta agora (ajustada ao exemplo aqui):
fonte