Запрос массива дат для отображения только будущих событий — PHP

#php #jquery #mysql #wordpress #date

#php #jquery #mysql #wordpress #Дата

Вопрос:

В WordPress я создал пользовательский тип записи под названием «События» и добавил в пользовательские поля, используя расширенные пользовательские поля. У меня есть только базовые поля, поскольку наша потребность в календаре сама по себе является базовой.

Поля: Дата начала, Дата окончания, время начала, время окончания, Местоположение, Заголовок

Я пытаюсь запрашивать сообщения с помощью массива, который в основном «Если конечная дата больше сегодняшней даты, тогда показывайте сообщения».

Проблема в том, что в Advanced Custom Fields встроен DatePicker, который форматирует даты как ГГГГМДД, а не ГГГГ-ММ-ДД, как это делает PHP. Вот мой код, как он есть сегодня:

 if (isset($_GET['_m'])) {

    $current_month = $_GET['_m'];
    $current_day = date('d'); // the actual day
    $current_year = $_GET['_y'];
    $future_year = 2016;

    $startday = $current_year.$current_month.$current_day;
    $endday = $future_year.$current_month.$current_day;

    echo $startday;
    echo $endday;

}
    $args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_key' => 'event_date_ends',
    'meta_query' => array( 
                'key' => 'event_date_ends',
                'compare' => '>=',
                'value' => $startday,
                'type' => 'DATE'
            ), 
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);
  

Я перепробовал не менее 20 вариантов и методов, конечным результатом которых было либо А) возвращаются все опубликованные «События», либо Б) Не возвращаются опубликованные «События».

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

Обновить:

Я смог преобразовать дату расширенных пользовательских полей в ГГГГ-ММ-ДД и использовал этот код, однако он возвращает все «События»

 $args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_query' => array(
                'key' => 'event_date_ends',
                'compare' => '>=',
                'value' => date(Y-m-d),
                'type' => 'DATE'
            ),
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);
  

Комментарии:

1. К вашему сведению, вы можете изменить формат, в котором ACF сохраняет дату.

2. @pmandell спасибо. Я смог внести изменения в формат!

Ответ №1:

Оказывается, мне просто нужно было преобразовать это через functions.php к метке времени unix, и это сработало.

functions.php

 function custom_unixtimesamp ( $post_id ) {
    if ( get_post_type( $post_id ) == 'events' ) {
    $startdate = get_post_meta($post_id, 'event_date_begins', true);

        if($startdate) {
            $dateparts = explode('/', $startdate);
            $newdate1 = strtotime(date('d.m.Y H:i:s', strtotime($dateparts[1].'/'.$dateparts[0].'/'.$dateparts[2])));
            update_post_meta($post_id, 'unixstartdate', $newdate1  );
        }
    }
}
add_action( 'save_post', 'custom_unixtimesamp', 100, 2);
  

затем запрос

 $today = time();    

    $args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_query' => array(
        array(
            'key' => 'unixstartdate',
            'compare' => '>=',
            'value' => $today,
            )
            ),
    'meta_key' => 'event_date_begins',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);
  

Надеюсь, кто-то еще может найти это полезным.

Ответ №2:

Я нашел актуальную проблему, поэтому решил обновить.

В документации ACF говорится, что для сравнения дат нужно использовать $today = date (‘Ymd’), но вам действительно нужно использовать current_time(‘Ymd’), поэтому я удалил functions.php код, который я добавил и исправил проблему, вместо того, чтобы обойти ее.

Вот мой запрос сейчас

 $event1 = current_time('Ymd');
    $args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_query' => array(
        array(
            'key' => 'event_date_ends',
            'compare' => '>=',
            'value' => $event1,
            )
            ),
    'meta_key' => 'event_date_ends',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);