WP query_posts meta_query에서 날짜를 비교하는 올바른 방법은 무엇입니까


32

WP 템플릿에 query_posts 호출이 있습니다. 추가 필드 플러그인을 사용하여 사이트 관리자에게 이벤트 (사용자 정의 게시물 유형)를 작성하고 YYYY / mm / dd 형식의 날짜를 입력 할 수있는 기능을 제공 할 수 있습니다.

주요 질문은; meta_query 배열의 value 옵션에 어떤 값을 전달해야합니까? 나는 현재 "date ("Y / m / dh : 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
                 ?>

답변:


44

나는 똑같은 일을 끝내고이 게시물은 매우 도움이되었습니다. 사용자 정의 필드를 사용 했으며 현재 날짜 보다 큰 모든 이벤트 목록을 작성하는 데 사용한 코드는 다음과 같습니다 . 추가 분류 기반 필터를 참고하십시오.

<?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',
                )
            )
        )
    );
?>

5
왜 안돼 'type' => 'DATE'?
Francisco Corrales Morales

@FranciscoCorralesMorales의 의심을 확인할 수 있습니다. 특히 날짜 메타 필드는 숫자로 저장되지 않고 "Ymd"(하이픈에 유의하십시오) 형식으로 저장되므로 '날짜'유형을 지정해야합니다. Jonathan의 답변을 편집했습니다.
Marco Panichi

국제화 date_i18n()를 위해 php native 대신 WordPress 함수를 사용할 수 있습니다 date().
Jake

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두 개의 개별 비교를 수행 하여 인수에 사용할 수 있습니다 .


"MySQL 타임 스탬프의 형식이 Y-m-d G:i:s" 임을 의미하지 않습니까? G:i:s24 시간, h:i:s12 시간입니다.
admcfajn

3

나는 다음과 같이 끝났다. 나는 이벤트-엄마 필드를 설정하고 거기에서 비교합니다. 도와 주셔서 감사합니다

<?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 ?>

1

안녕 내 솔루션을 게시하고 있습니다. 날짜를 Y-m-d H:i형식으로 저장 한 위치 (예 : 2013-07-31 16:45).

  • 이벤트 시작 날짜에 따라 정렬되었습니다.
  • 오늘 이후에 끝나는 이벤트는 님 만 쿼리합니다 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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.