Se você projeta ou desenvolve temas ou plug-ins WordPress, há uma boa chance de que algum dia você precise fazer uma consulta para metacampos personalizados. Esses são os pares chave / valor totalmente personalizados que você pode anexar a qualquer postagem, página ou tipo de postagem personalizada. O WordPress tem uma IU básica para eles por padrão, ou você pode usar algo como Campos personalizados avançados para se divertir com eles. Mas por baixo do capô, o ACF usa os velhos campos personalizados.
Esta mesma página de snippet que você está vendo agora foi escrita em 1999. Naquela época, para consultar postagens com campos personalizados específicos, você precisaria usar a variável global `$ wpdb`. Isso pode ser usado para criar consultas MySQL que a classe WP_Query () do WordPress não suporta. Felizmente, hoje, o WordPress tem argumentos que suportam consultas para metacampos personalizados.
Aqui, vamos cobrir as diferentes maneiras de solicitar e fazer loop em postagens com campos personalizados específicos (e seus valores). Você poderá usar essas informações se usar a WP_Query
classe query_posts()
, ou get_posts()
. Uma vez que query_posts()
e get_posts()
são wrappers para a WP_Query
classe. Todos eles aceitam os mesmos argumentos.
Os Argumentos da Consulta
Aqui está um exemplo básico de uma consulta do WordPress tirada do Codex do WordPress.
have_posts() ) ( echo '
'; while ( $the_query->have_posts() ) ( $the_query->the_post(); echo '
- ' . get_the_title() . '
'; ) echo '
'; ) else ( // no posts found ) /* Restore original Post Data */ wp_reset_postdata();
Essa $args
é a parte importante aí. Estaremos passando argumentos diferentes para fazer isso funcionar como queremos.
Ao consultar um meta personalizado, existem dois “grupos” de argumentos que você pode usar. Um grupo é para uma consulta de metacampo customizado simples e o outro grupo para consultas de metacampo customizado mais complexo. Vamos começar com o grupo simples.
meta_key
O meta_key
argumento consultará qualquer postagem que tenha o meta ID do campo personalizado salvo no banco de dados, haja ou não um valor salvo para o campo. O meta_key
é o ID que você dá aos seus metacampos. Como isso:
Este exemplo irá consultar qualquer postagem que tenha o metacampo personalizado com o ID de “campo1”.
$args = array( 'meta_key' => 'field1' );
meta_value
O meta_value
argumento consulta a postagem que possui o valor definido por você. O meta_value
argumento é usado para valores de string. Este exemplo irá consultar qualquer postagem com um metacampo personalizado que tenha o valor “data1”.
$args = array( 'meta_value' => 'data1' );
Você também pode combinar os dois. Este exemplo consultará apenas postagens que tenham o metacampo personalizado com o ID de “field1” que possui o valor de “data1”.
$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1' );
meta_value_num
O argumento meta_value_num é semelhante ao argumento `meta_value`. Onde o meta_value
argumento é para valores de string, o meta_value_num
é para valores numéricos.
Este exemplo mostra como consultar o metacampo personalizado “field1” se ele tiver um valor de “10”.
$args = array( 'meta_key' => 'field1', 'meta_value_num' => '10', );
meta_compare
O meta_compare
argumento faz exatamente o que parece. Isso permitirá que você use comparadores com os argumentos `meta_value` e` meta_value_num`. Os comparadores que você pode usar são '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN' , 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' ou 'RLIKE'. Aqui está um exemplo que mostra como consultar qualquer postagem que não tenha o valor de "data1".
$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1', 'meta_compare' => '!=', );
Consultas mais complexas
meta_query
O principal argumento que você usará para consultas complexas é meta_query
. Este argumento por si só não faz nada. Ele apenas informa ao WordPress que você deseja fazer uma consulta para metacampos personalizados. Você adicionará argumentos adicionais meta_query
que serão usados para definir a consulta.
chave, valor e comparar
O argumentos key
, value
funciona exatamente da mesma forma que meta-key
, meta-value
como descrito acima. O complexo compare
é semelhante ao simples compare
acima, mas requer uma lista diferente de comparadores. O complexo compare
usa '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN ',' NÃO EXISTE ',' EXISTE 'ou' NÃO EXISTE '. value
pode ser uma matriz, mas apenas quando comparar estiver usando 'IN', 'NOT IN', 'BETWEEN' ou 'NOT BETWEEN'.
Se você usar 'EXISTS' ou 'NOT EXISTS' com compare
, não é necessário especificar um value
argumento.
Aqui está um exemplo que irá consultar as postagens se tiver “field1” com o valor “data1” e “field2” com o valor que não é “data2”.
$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1' ), array( 'key' => 'field2', 'value' => 'data2', 'compare' => '!=', ) ) );
relação
O relation
é usado quando você deseja consultar metadados personalizados usando um relacionamento lógico. Você pode usar AND
ou OR
. Por exemplo, você usará AND
para comparar se data1 e data2 atendem aos critérios e usará OR
se data1 ou data2 atenderem aos critérios.
Este argumento é independente. O que significa que não aparece em parâmetros de um metacampo personalizado individual. Vejamos um exemplo. Este exemplo consultará apenas postagens que tenham “field1” com o valor “data1” e “field2” com o valor “data2”.
$args = array( 'meta_query' => array( 'relation' => 'AND' array( 'key' => 'field1', 'value' => 'data1', ), array( 'key' => 'field2', 'value' => 'data2', ), ) );
Se você mudou relation
para “OU”. Em seguida, ele consultaria qualquer postagem se “field1” tivesse o valor de “data1” ou se “field2” tivesse o valor de “data2”.
modelo
O type
argumento permite que você escolha o tipo de dados a consultar. Você pode usar 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME' ou 'UNSIGNED'.
O tipo “DATA” pode ser usado com compare
“ENTRE” somente se o formato da data for “AAAAMMDD”.
Este exemplo consultará qualquer postagem em que o valor de “campo1” seja numérico.
$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1', 'type' => 'NUMERIC' ) ) );
Exemplo do mundo real
Até agora, só dei exemplos com dados e campos arbitrários. Agora, gostaria de mostrar um exemplo do mundo real de consulta de metacampos personalizados.
O cenário
Você criou um tipo de postagem personalizada para eventos. O tipo de postagem de eventos tem um campo personalizado de data com o ID de event_date
. Você deseja criar uma consulta que mostrará todos os eventos que começarão na data atual até os próximos 30 dias.
Vamos usar o meta_query
argumento da mesma forma que queremos usar o type
argumento para definir o campo “data_evento” como tipo de dados “DATA”.
Esta é a consulta:
$args = array( 'post_type' => 'post', 'posts_per_page' => -1, 'post_status' => 'publish', 'meta_query' => array( array( 'key' => 'event_date', 'value' => array( date( 'Ymd', strtotime( '-1 day' ) ), date( 'Ymd', strtotime( '+31 days' ) ) ), 'compare' => 'BETWEEN', 'type' => 'DATE' ) ) ); $event_query = new WP_Query( $args );
O value
é uma matriz da data atual - 1 dia e 31 dias a partir da data atual. Como estamos usando o comparador “BETWEEN”, apenas os posts entre a matriz de valor serão consultados, portanto, queremos compensá-los em um dia.
Com esta consulta, você exibirá qualquer evento que ocorra nos próximos 30 dias.
Conclusão
A WP_Query
classe é uma classe muito flexível que permitirá que você crie uma infinidade de consultas personalizadas. Se você quiser saber mais sobre os diferentes argumentos que pode usar para consultas, recomendo dar uma olhada na WP_Query
página do códice.