web-dev-qa-db-ja.com

Meta_queryを使用してカスタムフィールドの日付順にイベントを表示する

カスタム投稿タイプのイベントの特定のカテゴリアーカイブ用のテンプレートを作成しています。

カスタムフィールドの日付順に並べて、将来の進行中のイベントを示すクエリを作成する必要があります。

$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time('Y-m-d');

$args = array(
    'post_type' => 'event',
    'event-categories' => $termSlug,
    'post_status' => 'publish',
    'posts_per_page' => 10,
    'order' => 'ASC',
    'meta_query' => array(
        'relation'    => 'OR',
        array(
            'relation'    => 'AND',

        array(

            'key' => '_event_start_date',
            'value' => $event1,
            'compare' => '>=',
            'type' => 'DATE',

        ),


        array(

            'key' => '_event_end_date',
            'value' => $event1,
            'compare' => '>=',
            'type' => 'DATE',

        )
        ),
        array(
            'key' =>  $event1,
            'value' => array('_event_start_date','_event_start_date'),
            'type' => 'DATE',
            'compare' => 'BETWEEN'
        )

    ),

     'orderby' => '_event_start_date',
 );
$events = new WP_Query($args);
echo $events->post_count   ;

結果には将来のイベントのみが表示され、進行中のイベントは表示されません。

どうしましたか?

2
Filippo Tah

より簡単なコード:

論理的には、>=_event_start_dateの両方について_event_end_dateをチェックすると、自動的にBETWEENチェックがカバーされます。

したがって、次のコードは機能するはずです。

$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time( 'Y-m-d' );

$args = array(
    'post_type'        => 'event',
    'event-categories' => $termSlug,
    'post_status'      => 'publish',
    'posts_per_page'   => 10,
    'order'            => 'ASC',
    'meta_query' => array(
        'relation'    => 'OR',
        array(
            'key'     => '_event_start_date',
            'value'   => $event1,
            'compare' => '>=',
            'type'    => 'DATE',
        ),
        array(
            'key'     => '_event_end_date',
            'value'   => $event1,
            'compare' => '>=',
            'type'    => 'DATE',
        )
    ),
    'orderby' => '_event_start_date',
);
$events = new WP_Query( $args );
echo $events->post_count;

日付チェック:

また、日付値$event1がDatabase(post meta table)に格納されているものとして正しく設定されていることを確認してください。通常、WordPressは内部的にすべてのdateGMTタイムゾーン内にあると見なします。ただし、それは_event_start_date_event_end_dateがあなたの場合にどのように保存されているかによって異なります。格納されている値によって異なります。

// MySQL DATETIME field format
$event1 = current_time( 'mysql' );

// MySQL DATETIME field format in GMT
$event1 = current_time( 'mysql', 1 );

// Unix timestamp in local time zone
$event1 = current_time( 'timestamp' );

// Unix timestamp in GMT
$event1 = current_time( 'timestamp', 1 );

そのため、そのデータがどのように保存されているかを確認するか、これらの差異を使用してテストしてください。 dateフィールドに時間も含まれる場合は、DATETIME型を使って作業することもできます。

また、 codex :からのメモ

'type' DATEは、日付がYYYY-MM-DDという形式で格納されていて、この形式でテストされている場合にのみ、 'compare'値BETWEENと連動します。

taxクエリ:

古いtaxクエリは廃止予定です。だから代わりに:

'event-categories' => $termSlug,

つかいます:

'tax_query' => array(
    array(
        'taxonomy' => 'event-categories',
        'field'    => 'slug',
        'terms'    => $termSlug,
    ),
),
1
Fayaz