it-swarm.dev

Jak používat dotaz_posts () s filtrem data na vlastním poli?

Definoval jsem vlastní typ příspěvku, který používá meta pole pro ukládání dat.

V mém function.php mám následující kód, který ukládá počáteční datum. Formát data odeslaného v parametru startdate je 2010/12/01 9:00 AM

add_action('save_post', 'save_details');

function save_details(){
    global $post;
    update_post_meta($post->ID, "startdate", $_POST["startdate"]);
}

Snažím se o výstup seznamu všech událostí s startdate později než aktuální čas.

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key=startdate',
    'meta_value='.date("Y/m/d h:i A"),
    'meta_compare=>'
));

Zobrazí všechny události bez ohledu na datum jejich zahájení. Co dělám špatně?

ŘEŠENO:

Z nějakého důvodu poté, co jsem změnil kód na následující, to prostě funguje.

$args = array(
    'post_type' => array('seminar'),
    'showposts' => 3,
    'meta_key' => 'startdate',
    'meta_value' => date("Y/m/d h:i A"),
    'meta_compare' => '>',
    'orderby' => 'meta_value',
    'order' => 'ASC'
);

$seminars = get_posts($args);

Odpověď na @Rarst si vyberu jako přijatou, protože si myslím, že jsem vlastně měl několik otázek, které se tu děly, ale jeho problém se týkal nejlepšího titulu.

@ sorich87 měl dobrý názor na to, jak jsem měl ukládat data jako časová razítka, ale nakonec byl @Rarst správný, že pokud jsem zadal argument formát pro funkci date(), která odpovídá formátu používanému při ukládání dat do databáze, pak bych měl být schopen údaje porovnat.

Díky za pomoc.

2
jessegavin

Uložíte datum jako formátovaný řetězec, ale funkce time(), kterou použijete pro porovnání, vrátí číselné časové razítko. Takže se snažíte provést srovnání mezi příliš odlišnými formáty a je to nepravděpodobné WP je natolik chytrý, že to dokáže.

2
Rarst

Před uložením bych datum převedl na časovou značku:

add_action('save_post', 'save_details');

function save_details(){
    global $post;
    update_post_meta($post->ID, "startdate", strtotime($_POST["startdate"]));
}

Pro porovnání použijte aktuální časové razítko:

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key=startdate',
    'meta_value='.time(),
    'meta_compare=>'
));
3
sorich87

Možná by to udělal ten trik?

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key' => 'startdate',
    'orderby'=> 'meta_value',
    'order' => 'ASC'
));
1
Emrikol
  1. Uložit hodnotu do databáze jako:

    'enddate'   =>  date('Y-m-d');
    
  2. Generovat meta dotaz jako:

A. Podmínka:

$conArr[0]  =    array
(
'key'=> 'enddate',
'value' => date('Y-m-d'),
'compare' => '>=',
);

B. Dotaz:

$args = array(
    'meta_query'=>$conArr ,
    'post_type'=>'tournament',
    'orderby' => 'meta_value_num', 
)

Důležité 'orderby' => 'meta_value_num', a formát data jsou důležité.

0
user2823361