CMB2 сортирует данные по дате на CPT с WP_Query - PullRequest
0 голосов
/ 14 мая 2018

Привет, я пытаюсь отсортировать события семинара по дате события? Я могу сортировать данные по другим метаданным по городам, лидерам и т. Д. но не по дате события.

Существует мета "страна", но, поскольку они находятся рядом друг с другом, нет разницы в UTC.

В функции CBM2 я установил поле «дата», которое является частью мета-блока function.php

<!-- language: lang-php -->
        $cmb_data->add_field( array(
            'name'        => __( 'Event Date', 'workshops' ),
            'desc'        => __( 'Event Date', 'workshops' ),
            'id'          => $prefix . 'event_date',
            'type'        => 'text_date',
            'date_format' => 'd-m-Y',
    ) ) ;

А вот и шаблон CPT Workshop.php

<!-- language: lang-php -->
      <section id="" class="">
                    <div class="">
                        <?php
                        $args = array(
                            'post_type'      => 'workshops',
                            'posts_per_page' => 10,
                            'meta_key'       => 'workshop_data_event_date',
                            'orderby'        => 'meta_value',
                            'order'          => 'DESC'
                        );

                        $articles = new WP_Query( $args );

                        if ( $articles->have_posts() ) : $articles->the_post();
                            echo '<div class="cptul-stripe-2 article-post__stats">';
                            foreach ( $articles->posts as $article ) {
    //                            var_dump($article);
                                echo '<div class="cptli-stripe-2__wrap">
                                <div class="cptli-stripe-2--header">
                                <div><span class="name">'
                                     . get_post_meta( $article->ID, 'workshop_data_leader', true )
                                     . '</span>
                                <span class="nameWhat"> povede workshop</span>
                                </div>
                                        <a class="stripe-title-mid" href="' . get_permalink( $article->ID ) . '">'
                                     . $article->post_title . '</a> 
                                         <ul>
                                            <li id="event-date" class="article-post__event-date"><span 
                                            class="article-post__stats-icon">'
                                     . webovkar_get_svg( array( 'icon' => 'calendar' ) ) . '</span>'
                                     . get_post_meta( $article->ID, 'workshop_data_event_date', true ) .

                                     '</li><li class="article-post__event-town"><span class="article-post__stats-icon"> '
                                     . webovkar_get_svg( array( 'icon' => 'mmarker' ) ) . '</span>'
                                     . get_post_meta( $article->ID, 'workshop_data_town', true ) . ' | '
                                     . get_post_meta( $article->ID, 'workshop_data_country', true ) .
                                     '</li></ul> </div>


                                     <div class="cptli-stripe-2--data">'
                                     . apply_filters( 'the_content', get_post_meta( $article->ID, 'workshop_data_excerpt',
                                        true ) ) .
                                     '</div>
                                    </div>';
                            }
                            echo '</div>';
                        endif; ?>
                        <?php wp_reset_postdata(); ?>
                    </div>
                </section> 

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Немного поиграв с кодом, я нашел решение, которое работает для меня, но я не знаю, правильный ли это стиль кода. Мне пришлось переместиться на временную метку, чтобы она заработала.

$args = array(
    'post_type' => 'workshops',
    'meta_query' => array(
        array(
            'key' => 'workshop_data_event_date',
            'value' => current_time('timestamp'),
            'compare' => '>'
        )
    ),
    'meta_type' => 'text_date_timestamp',
    'orderby'   => 'meta_value_num',
    'order'     => 'DESC'
);

В foreach цикл равен

$datum = get_post_meta( $article->ID, 'workshop_data_event_date', true );

и я использую date() для преобразования UNIX в формат даты для внешнего интерфейса, повторяя

date('d-m-Y', $datum)

РЕДАКТИРОВАТЬ: Поскольку мне нужно показать на первой странице события, которые произойдут в ближайшие 30 дней, я добавил этот запрос на первую страницу.

$today = current_time('timestamp');
$featuremonth = current_time('timestamp') + 2629743 ; // num = UNIX 30 days
$meta_query = array(
    'value' => array( $today, $featuremonth),
    'compare'   => 'BETWEEN',
    'type'      => 'NUMERIC'
);
    $args = array(
        'post_type'      => 'workshops',
        'posts_per_page' => -1,
        'meta_key'       => 'workshop_data_event_date',
        'orderby'        => 'meta_value',
        'order'          => 'DESC',
        'meta_query'     => array( $meta_query )
    );

$articles = new WP_Query( $args );
0 голосов
/ 14 мая 2018

Я не помню, как CMB2 хранит поля даты в базе данных, но вы можете использовать расширенные опции WP_Query *1001*, чтобы указать тип настраиваемого поля в качестве даты.

Начиная с документы (выделение мое):

meta_query также содержит один или несколько массивов со следующими ключами:

  • ключ (строка) - Пользовательскийключ поля.
  • значение (строка | массив) - значение настраиваемого поля.[...]
  • сравнить (строка) - оператор для проверки.[...]
  • тип (строка) - тип настраиваемого поля.Возможные значения: «NUMERIC», «BINARY», «CHAR», «DATE», «DATETIME» , «DECIMAL», «SIGNED», «TIME», «UNSIGNED».Значением по умолчанию является «CHAR».Вы также можете указать точность и масштаб для типов «DECIMAL» и «NUMERIC» (например, «DECIMAL (10,5)» или «NUMERIC (10)» действительны).

'type' DATE работает со значением 'сравнение' МЕЖДУ, только если дата хранится в формате YYYY-MM-DD и проверяется в этом формате.

Если ваши даты хранятся как метки времени Unix,сравнить с ними численно.Если они хранятся в виде значений даты, используйте DATE или DATETIME.

...