【问题标题】:Sort WP_Query by ACF Datepicker按 ACF Datepicker 对 WP_Query 进行排序
【发布时间】:2015-03-09 20:43:28
【问题描述】:

我有一个“即将举行的活动”页面和一个“过去的活动”页面。每个事件都有一个名为“event_date”的自定义字段。

我想创建一个循环来显示比今天更大的所有事件。我浏览了这些文章,但无法正常工作: http://support.advancedcustomfields.com/forums/topic/how-do-i-filter-and-sort-event-posts-with-start-and-end-date/

https://wordpress.org/support/topic/plugin-advanced-custom-fields-sorting-by-date-picker

wordpress advanced custom fields order posts by date-picker

根据我在上面三个链接中收集的信息,我会将其放入我的 functions.php 文件中:

    // CREATE UNIX TIME STAMP FROM DATE PICKER
function custom_unixtimesamp ( $post_id ) {
    if ( get_post_type( $post_id ) == 'event_type' ) {
    $event_date = get_post_meta($post_id, 'event_date', true);

        if($event_date) {
            $dateparts = explode('/', $event_date);
            $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);

然后我会在我的页面模板中添加这样的内容:

<?php 
$today = time();
$args = array(
        'post_type' => 'event_type',
        'posts_per_page' => 5,
        'meta_query' => array(
            array(
            'key' => 'unixstartdate',
            'compare' => '>=',
            'value' => $today,
            )
        ),
        'meta_key' => 'event_date',
        'orderby' => 'meta_value',
        'order' => 'ASC',
    );

$query = new WP_Query( $args );
$event_type = $query->posts;
?>

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

目前没有任何结果。我的post-type叫“event_type”,key是“event_date”。

对我哪里出错有什么想法吗?

【问题讨论】:

  • event_date在数据库中的格式是什么?是否有任何内容保存在 unixstartdate 的 postmeta 表中。添加此代码后,您是否浏览并重新保存了所有自定义帖子?

标签: php wordpress datepicker unix-timestamp advanced-custom-fields


【解决方案1】:

感谢svsdnb,我在这里找到了解决方案。

https://wordpress.org/support/topic/query-date-array-to-display-future-events-only

不必在functions.php中转换时间戳,有一种方法可以专门在您使用的ACF中执行此操作

current_time('Ymd')

而不是

 $today = date ('Ymd')

这是我最终得到的结果(它似乎有效,包括今天发生的事件):

<?php 
$today = current_time('Ymd');
$args = array(
    'post_type' => 'event_type',
    'post_status' => 'publish',
    'posts_per_page' => '0',
    'meta_query' => array(
        array(
            'key' => 'event_date',
            'compare' => '>=', // Upcoming Events - Greater than or equal to today
            'value' => $today,
        )
    ),
    'meta_key' => 'event_date',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    );

$query = new WP_Query( $args );
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
?>

【讨论】:

  • Ymd 的参数 current_time() 不存在,因此返回 gmdate('Ymd')。我不认为这是这里的问题,因为它与date() 的作用相同,除了 gmdate 返回格林威治标准时间。我用date() 在这里工作,没有问题。重要的是,无论返回值设置为什么,ACF 都将日期选择器值作为Ymd 存储在数据库中。
  • 我认为您需要在元查询中添加'type'=&gt; 'DATE',以绑定查找
【解决方案2】:

您的代码似乎有一些问题。您的日期解析似乎也不正确,尽管没有更多信息很难说。在设置unixstarttime 的函数中使用strtotime 和您的查询代码会很好。您的代码使用time(),其中将包括秒数并省略“今天”的事件。您没有时区,因此所有内容都将被视为 GMT,只要您牢记这一点就可以了。

没什么大不了的,但是您在 add_action 中为回调指定了两个参数,但该函数只接受一个参数。

下一个问题是 have_posts() 循环 - 您需要指定自定义查询 $query 来循环它。

<?php if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>

我还使用updated_{type}_meta 操作以稍微不同的方式实现它,仅在正确的元键上触发,然后检查帖子类型。它应该只在更新元值而不是每次保存帖子时运行。我还建议按 unixstarttime 元值排序,因为它是数字。

functions.php

// create/update unixstartdate based on event_type.event_date update
add_action( 'updated_post_meta', 'my_updated_post_meta', 20, 4 );
function my_updated_post_meta( $meta_id, $object_id, $meta_key, $_meta_value ){
    if ( $meta_key == 'event_date' && 'event_type' == get_post_type( $object_id ) ){
        $unixstartdate = strtotime( $_meta_value );
        update_post_meta( $object_id, 'unixstartdate', $unixstartdate );
    }
}

模板页面

$args = array(
    'post_type' => 'event_type',
    'posts_per_page' => 5,
    'meta_query' => array(
        array(
            'key' => 'unixstartdate',
            'compare' => '>=',
            'value' => strtotime('m/d/Y', time()),
        )
    ),
    'meta_key' => 'unixstartdate',
    'orderby' => 'meta_value',
    'order' => 'ASC',
);

$query = new WP_Query( $args );
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
    the_title(); // whatever you want to use from $post
endwhile; endif;

【讨论】:

  • 我尝试了即将发布的代码,但仍然无法使其正常工作。日期的保存格式是 yymmdd - ACF 说这是最通用的保存格式。这可能是我的问题吗?
  • 如果是这种情况,那么您根本不需要转换为纪元/unix 时间。日期将自然排序,因为它全是数字,并按年、月、日排序。
【解决方案3】:
<div class="row">

<?php 
$today = current_time('Ymd');
$args = array(
    'post_type' => 'your-custom-post-type',
    'post_status' => 'publish',
    'posts_per_page' => '-1',
    'meta_query' => array(
        array(
            'key' => 'event_date',//your date picker field name
            'compare' => '>=', // Upcoming Events - Greater than or equal to today
            'value' => $today,
        )
    ),
    'meta_key' => 'event_date',
    'orderby' => 'meta_value',
    'order' => 'Desc',
    );

$query = new WP_Query( $args );
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
?>
<?php  $dateformatstring = "F d, Y";

$unixtimestamp = strtotime(get_field('event_date')); ?>

<div class="post">

    <a href="<?php the_permalink; ?>"><?php the_title(); ?></a>
 <?php echo date_i18n($dateformatstring, $unixtimestamp); ?>

</div>

 <?php
  endwhile;
endif;
wp_reset_query();  // Restore global post data stomped by the_post().
?>

</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2015-01-12
    • 1970-01-01
    • 2019-12-20
    相关资源
    最近更新 更多