Как использовать сообщения запроса() с фильтром даты в пользовательском поле?


Я определил пользовательский тип записи, который использует мета-поле для хранения дат.

В моем functions.php У меня есть следующий код, который сохраняет дату начала. Формат даты, отправляемой в параметре формы startdate, равен 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"]);
}

Я пытаюсь вывести список всех событий с startdate позже текущего времени.

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

Здесь перечислены все события, независимо от даты их начала. Что я делаю неправильно?

РЕШЕНО:

По какой-то причине после того, как я изменил свой код на следующий, он просто работает.

$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);

Я собираюсь выбрать ответ от @Rarst как принятый, потому что я думаю, что на самом деле у меня было несколько проблем, происходящих здесь, но он решил проблему, связанную с названием best.

У @sorich87 была хорошая мысль о том, как я должен был хранить даты в виде меток времени, но, в конце концов, @Rarst был прав, если бы я указал аргумент формата для date() функция, которая соответствует формату, который я использовал при хранении данных в базе данных, тогда я должен иметь возможность сравнивать данные.

Спасибо за всю помощь.

Author: Community, 2010-09-29

4 answers

Вы сохраняете дату в виде форматированной строки, но функция time(), которую вы используете для сравнения, возвращает числовую метку времени. Таким образом, вы пытаетесь сравнить слишком разные форматы, и вряд ли WP достаточно умен, чтобы понять это.

 2
Author: Rarst, 2010-09-29 18:11:29

Я бы преобразовал дату в метку времени перед ее сохранением:

add_action('save_post', 'save_details');

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

И используйте текущую метку времени для сравнения:

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key=startdate',
    'meta_value='.time(),
    'meta_compare=>'
));
 3
Author: sorich87, 2010-09-29 19:54:48

Возможно, это сработает?

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key' => 'startdate',
    'orderby'=> 'meta_value',
    'order' => 'ASC'
));
 1
Author: , 2010-09-29 20:10:51
  1. Сохраните значение в базе данных, например:

    'enddate'   =>  date('Y-m-d');
    
  2. Генерировать мета-запрос, например :

А. Условие:

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

Б. Запрос:

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

Важно 'orderby' => 'meta_value_num', и формат даты важны.

 0
Author: user2823361, 2015-01-05 11:18:17