query_posts -usando meta_compare / onde meta value é menor ou maior ou igual a

3

Estou usando query_posts( $args ) para filtrar o Loop. Quero filtrar as postagens com base em seus meta_value "voto", às vezes menores que, às vezes iguais e assim por diante ....

Eu definitivamente quero usar a função query_posts() e passar meu filtro por $args ! Eu não quero usar add_filter('posts_where', 'filter_where'); e, em seguida, adicionar uma instrução AND à consulta.

Eu quero usar a funcionalidade do WordPress para filtrar as postagens com meta_key , meta_value e meta_compare assim:

$args = array( 'meta_key'=>'vote', 'meta_compare'=>'>=', 'meta_value'=>5, 'posts_per_page'=>100 ) )

query_posts( $args );

O resultado disso é:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND wp_postmeta.meta_key = 'vote' AND wp_postmeta.meta_value >= '5' GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 100

O problema disso é:

wp_postmeta.meta_value >= '5' 

Deve ser:

wp_postmeta.meta_value >= 5

Então funcionaria bem.

Eu não entendo porque o WordPress adiciona citações.

Estou usando o parâmetro predefinido do WordPress ( < , > , <= , >= ) e é óbvio que isso só funcionará com números e não sequências que precisariam estar entre aspas.

A documentação diz:

  

Retorna postagens com a chave do campo personalizado de   'milhas' com um valor de campo personalizado que   é menor que ou igual a 22

     

query_posts('meta_key=miles&meta_compare=<=&meta_value=22');

    
por EAMann 22.09.2010 / 22:18

3 respostas

11

Desde o WP 3.1, você pode converter o meta-valor para qualquer coisa que você quiser usando o argumento 'type' em 'meta_query':

$args = array(
  'meta_query'=> array(
    array(
      'key' => 'vote',
      'compare' => '>=',
      'value' => 5,
      'type' => 'numeric',
    )
  )
  'posts_per_page' => 100
) );

query_posts( $args );
    
por scribu 16.03.2011 / 16:57
3

A partir da consulta rápida sobre a documentação, meta_value parece ter a finalidade de strings e, para valores numéricos, há meta_value_num .

Veja Orderby Parameters

Atualizar

Fiz algumas escavações.

meta_value_num é de fato ignorado para fins de filtragem. Eu acho que eles simplesmente esqueceram de adicionar essa parte. :)

O problema é que WP_Query recebe corretamente o número como int (a passagem como matriz não importa), mas passa a condição meta_compare gerada por $wpdb->prepare() e marca explicitamente o valor como %s string. Nesse caso, prepare forçosamente aspas simples.

Então parece que você terá que filtrar posts_where depois de tudo. Você pode tentar apenas desmarcar essa string específica em vez de gerar a condição manualmente.

    
por Rarst 22.09.2010 / 22:31
0

Eu recomendaria analisar sua matriz $args e convertê-la em uma string antes de passá-la para query_posts . Quando você cria a matriz $args , o sistema converte automaticamente o número 5 em uma string "5" quando a matriz é transformada novamente em uma string.

Então use isso:

query_posts('meta_key=vote&meta_compare=>=&meta_value=5&posts_per_page=100');

Isso ainda está passando a mesma informação para query_posts, mas deve passar o número 5 em vez de uma string "5".

Atualizar

Como agora descobrimos que o meta_value armazena strings em vez de números, e você não pode efetivamente fazer uma comparação maior que / menor que a das strings. No entanto, depois de mais algumas pesquisas , tropecei na bandeira da consulta meta_value_num .

Se você executar a seguinte chamada query_posts :

query_posts('meta_key=vote&meta_compare=>=&meta_value=5&posts_per_page=100&orderby=meta_value_num');

Então você deve ter o comportamento que deseja. meta_value_num diz ao WordPress para avaliar seu meta_value s como números em vez de strings.

    
por EAMann 22.09.2010 / 22:29