CMB2按日期在CPT上使用WP_Query对数据进行排序

时间:2018-05-14 18:34:35

标签: wordpress cmb2

您好我试图按活动日期对Workshop活动进行排序? 我可以通过其他meta_key对数据进行排序,如城镇,领导者,国家等。但不是按活动日期。

有meta" country"但因为它们彼此相邻,所以UTC没有区别。

在CBM2功能中,我设置了字段" date"这是元框的一部分 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 :(得分:0)

我不记得CMB2如何在数据库中存储日期字段,但您可以使用WP_Query的高级meta_query选项将自定义字段的类型指定为日期。

来自the docs(强调我的):

  

meta_query还包含一个或多个具有以下键的数组:

     
      
  • key(string) - 自定义字段键。
  •   
  • value(string | array) - 自定义字段值。 [...]
  •   
  • compare(string) - 要测试的运算符。 [...]
  •   
  • type(string) - 自定义字段类型。可能的值为'NUMERIC','BINARY','CHAR','DATE','DATETIME','DECIMAL','SIGNED','TIME',   'UNSIGNED'。默认值为“CHAR”。您还可以指定精度   和'DECIMAL'和'NUMERIC'类型的比例(例如,   'DECIMAL(10,5)'或'NUMERIC(10)'有效。
  •   
     

只有当日期以YYYY-MM-DD格式存储并使用此格式进行测试时,'type'DATE才能使用'compare'值BETWEEN。

如果您的日期存储为Unix时间戳,请在数字上与它们进行比较。如果它们存储为日期值,请使用DATEDATETIME

答案 1 :(得分:0)

在使用代码后,我找到了适用于我的解决方案,但我不知道它是否是正确的代码风格。我不得不搬到时间戳地,以使其发挥作用。

$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 );