каков правильный способ сравнения дат в WP query_posts meta_query

У меня есть запрос query_posts в шаблоне WP. Благодаря использованию плагина More Fields я могу дать администратору сайта возможность создать событие (пользовательский тип сообщения), а затем ввести дату, которая отформатирована: ГГГГ /мм /дд.

Основной вопрос: какое значение следует передать параметру value в массиве meta_query? В настоящее время я пытаюсь передать «date (« Y /m /d h: i A »)» (минус кавычки), потому что, насколько я понимаю, это будет печатать текущую дату сегодня. Меня не волнует время, которое может быть неуместным. Ulitimatly Я пытаюсь использовать опцию сравнения, чтобы выявить предстоящие события, прошлые события в разных местах на этом сайте. В другом месте мне действительно нужно передать параметр значения массивом, который печатает этот первый и последний день текущего месяца, ограничивая вывод событий, происходящих в этом месяце.

<?php 
            query_posts( array( 
              'post_type'  => 'event',        // only query events
              'meta_key'    => 'event_date',  // load up the event_date meta
              'orderby'     => 'meta_value',  // sort by the event_date
              'order'       => 'asc',         // ascending, so earlier events first
              'posts_per_page' => '2',
              'meta_query'  => array(         // restrict posts based on meta values
                  'key'     => 'event_date',  // which meta to query
                  'value'   => date("Y/m/d h:i A"),  // value for comparison
                  'compare' => '>=',          // method of comparison
                  'type'    => 'DATE'         // datatype, we don't want to compare the string values
                ) // end meta_query array
              ) // end array
            ); // close query_posts call
                 ?>
29 голосов | спросил tjsherrill 4 MarpmFri, 04 Mar 2011 21:41:33 +03002011-03-04T21:41:33+03:0009 2011, 21:41:33

4 ответа


3

Я закончил со следующим. Я настраиваю поле event-momth и сравниваю его. спасибо за помощь

<?php 
        $event_query = new WP_Query(
        array( 
          'post_type'   => 'event',        // only query events
          'meta_key'    => 'event-month',  // load up the event_date meta
          'order_by'        => 'event_date',
          'order'       => 'asc',         // ascending, so earlier events first
          'meta_query'  => array(
             array(         // restrict posts based on meta values
              'key'     => 'event-month',  // which meta to query
              'value'   => date("n"),  // value for comparison
              'compare' => '=',          // method of comparison
              'type'    => 'NUMERIC'         // datatype, we don't want to compare the string values
            ) // meta_query is an array of query ites
           ) // end meta_query array
          ) // end array
        ); // close WP_Query constructor call

 ?>
   <?php while($event_query->have_posts()): $event_query->the_post(); //loop for events ?>
ответил tjsherrill 8 MaramTue, 08 Mar 2011 02:08:09 +03002011-03-08T02:08:09+03:0002 2011, 02:08:09
32

Я закончил работу над тем же, и этот пост был очень полезен. Я использовал пользовательские поля и вот код, который я использовал для создания списка всех событий больше, чем текущей даты. Обратите внимание на дополнительные фильтры, основанные на таксономии.

<?php // Let's get the data we need to loop through below

$events = new WP_Query( 
    array(
        'post_type' => 'event', // Tell WordPress which post type we want
        'orderby' => 'meta_value', // We want to organize the events by date    
        'meta_key' => 'event-start-date', // Grab the "start date" field created via "More Fields" plugin (stored in YYYY-MM-DD format)
        'order' => 'ASC', // ASC is the other option    
        'posts_per_page' => '-1', // Let's show them all.   
        'meta_query' => array( // WordPress has all the results, now, return only the events after today's date
            array(
                'key' => 'event-start-date', // Check the start date field
                'value' => date("Y-m-d"), // Set today's date (note the similar format)
                'compare' => '>=', // Return the ones greater than today's date
                'type' => 'DATE' // Let WordPress know we're working with date
                )
            ),
        'tax_query' => array( // Return only concerts (event-types) and events where "songs-of-ascent" is performing
            array(
                'taxonomy' => 'event-types',
                'field' => 'slug',
                'terms' => 'concert',
                ),
            array(
                'taxonomy' => 'speakers',
                'field' => 'slug',
                'terms' => 'songs-of-ascent',
                )
            )
        )
    );
?>
ответил Jonathan Wold 17 MarpmThu, 17 Mar 2011 19:28:29 +03002011-03-17T19:28:29+03:0007 2011, 19:28:29
7

Это во многом зависит от того, как ваша дата хранится в метазначении в первую очередь. В целом, рекомендуется хранить даты в MySQL как даты и временные метки MySQL.

Временные метки MySQL имеют формат Y-m-d h:i:s.

Тем не менее, всегда полезно использовать собственные функции управления речью WP. Таким образом, чтобы получить текущую дату в формате MySQL, используйте current_time('mysql').

Чтобы отформатировать дату MySQL для отображения, используйте mysql2date($format, $mysql_date). В этом случае лучше всего указать дату, настроенную в настройках, поэтому используйте $format = get_option('date_format');.

Чтобы сохранить выбранную пользователем дату, вам необходимо перекодировать ее в дату MySQL. Для этого самый простой, но не безопасный способ - это date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestamp часто может быть получен через strtotime($user_input).

Однако strtotime() не выполняет проверки на работоспособность, поэтому лучше написать собственную функцию конвертации.

Как для получения диапазона месяцев, вот функция, которую я использую, чтобы получить границы месяца для любой отметки времени MySQL:

function get_monthrange($time) {
    $ym = date("Y-m", strtotime($time));
    $start = $ym."-01";
    $ym = explode("-", $ym);
    if ($ym[1] == 12) {
        $ym[0]++; $ym[1] = 1;
    } else {
        $ym[1]++;
    }
    $d = mktime( 0, 0, 0, $ym[1], 1, $ym[0] );
    $d -= 86400;
    $end = date("Y-m-d", $d);
    return array( $start, $end );
}

Если вы хотите получить границы недели, WP уже имеет функцию для этого: get_weekstartend($time);, который также предоставляет границы в виде массива.

Затем вы можете использовать их в своем аргументе meta_query, выполнив два отдельных сравнения.

ответил wyrfel 4 MarpmFri, 04 Mar 2011 22:38:55 +03002011-03-04T22:38:55+03:0010 2011, 22:38:55
1

Привет, я отправляю свое решение. Где я сохранил дату в формате Y-m-d H:i (например, 2013-07-31 16:45).

  • Отсортировано в соответствии с датой начала события.
  • Событие, которое заканчивается после Today, будет запрашиваться только с помощью meta_query.

    date_default_timezone_set('Asia/Calcutta');

Я устанавливаю часовой пояс по умолчанию для функции date().

$args = array(
    'posts_per_page'  => 3,
    'orderby'         => 'meta_value',
    'meta_key'    => 'event_start_date_time',
    'order'           => 'ASC',
    'post_type'       => 'events',
    'meta_query' => array(
      array(
        'key' => 'event_end_date_time',
        'value' => date("Y-m-d H:i"),
        'compare' => '>=',
        'type' => 'DATE'
        )
      )
    ); 
query_posts( $args );

if( have_posts() ) : while ( have_posts() ) : the_post();
ответил Makarand Mane 30 J000000Tuesday13 2013, 14:37:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132