it-swarm.dev

query_posts -> pomocí meta_compare/kde meta hodnota je menší nebo větší nebo rovná

Používám query_posts( $args ) filtrovat smyčku. Chci filtrovat příspěvky na základě jejich hlasu meta_value, někdy menšího, někdy rovného a tak dále.

Rozhodně chci použít funkci query_posts() a předat filtr přes $args! Nechci používat add_filter('posts_where', 'filter_where'); a pak přidat do dotazu AND prohlášení.

Chci použít danou funkci WordPressu k filtrování příspěvků pomocí meta_key, meta_value a meta_compare takto:

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

query_posts( $args );

Výsledkem je:

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

Problémem je:

wp_postmeta.meta_value >= '5' 

To by mělo být:

wp_postmeta.meta_value >= 5

Pak by to fungovalo dobře.

Nechápu, proč WordPress přidává citace.

Používám předdefinovaný parametr z WordPressu (<, >, <=, >=) a je zřejmé, že to bude fungovat pouze s čísly a nikoli řetězci, které by musely být v uvozovkách.

Dokumentace říká:

Vrátí příspěvky s vlastním klíčem pole „míle“ s vlastní hodnotou pole, která je NEJMÉ NEŽ OR EQUAL TO 22

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

3
Joakim

Vzhledem k tomu, že WP 3.1, můžete hodnotu meta přenést na libovolnou hodnotu pomocí argumentu typu „meta_query“:

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

query_posts( $args );
11
scribu

Z rychlého pohledu na dokumentaci se zdá, že meta_value je určen pro řetězce a pro numerické hodnoty je meta_value_num.

Viz Parametry objednávky

Aktualizovat

Nějaké kopání.

meta_value_num je pro účely filtrování skutečně ignorováno. Myslím, že prostě zapomněli přidat tu část. :)

Problém je v tom, že WP_Query správně přijímá číslo jako int (předávání jako pole nezáleží), ale předává vygenerovanou podmínku meta_compare prostřednictvím $wpdb->prepare() a explicitně označuje hodnotu jako řetězec %s. V tom případě je prepare silně uvozeno.

Takže se zdá, že budete muset filtrovat posts_where po všem. Namísto generování stavu můžete zkusit jednoduše zrušit tento konkrétní řetězec.

3
Rarst

Doporučil bych analyzovat vaše pole $args a převést jej na řetězec, než ho předáte do query_posts. Když vytvoříte pole $args, systém automaticky převede číslo 5 na řetězec "5", když se pole vrátí zpět do řetězce.

Použijte to místo toho:

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

To je stále předávání stejné informace do query_posts, ale měl by projít v čísle 5 spíše než řetězec "5".


Aktualizace

Protože jsme nyní zjistili, že meta_value ukládá řetězce spíše než čísla, a nemůžete účinně udělat větší než/menší než porovnání s řetězci. Nicméně po dalším výzkumu jsem narazil na dotaz flag meta_value_num.

Pokud spustíte následující volání query_posts:

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

Pak byste měli dostat chování, které chcete. meta_value_num řekne WordPressu, aby vyhodnotil vaše meta_values jako čísla spíše než řetězce.

0
EAMann