Loop / consulta personalizada com base em campos personalizados - CSS-Tricks

Anonim
Última atualização por Jason Witt.

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_Queryclasse query_posts(), ou get_posts(). Uma vez que query_posts()e get_posts()são wrappers para a WP_Queryclasse. 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_keyargumento 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_valueargumento consulta a postagem que possui o valor definido por você. O meta_valueargumento é 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_valueargumento é 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_compareargumento 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_queryque serão usados ​​para definir a consulta.

chave, valor e comparar

O argumentos key, valuefunciona exatamente da mesma forma que meta-key, meta-valuecomo descrito acima. O complexo compareé semelhante ao simples compareacima, mas requer uma lista diferente de comparadores. O complexo compareusa '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN ',' NÃO EXISTE ',' EXISTE 'ou' NÃO EXISTE '. valuepode 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 valueargumento.

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 ANDou OR. Por exemplo, você usará ANDpara comparar se data1 e data2 atendem aos critérios e usará ORse 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 relationpara “OU”. Em seguida, ele consultaria qualquer postagem se “field1” tivesse o valor de “data1” ou se “field2” tivesse o valor de “data2”.

modelo

O typeargumento 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_queryargumento da mesma forma que queremos usar o typeargumento 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_Queryclasse é 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_Querypágina do códice.