【问题标题】:Query Posts by Custom Meta and Current Date按自定义元和当前日期查询帖子
【发布时间】:2021-10-18 18:48:08
【问题描述】:

我创建了一个名为“事件”的自定义帖子类型,并且我正在使用高级自定义字段(Wordpress 插件)将自定义字段添加到帖子中。一个自定义字段是事件的日期,我的目标是根据该日期(在数据库中存储为“yymmdd”)查询帖子,并且只显示未来的事件。我已经接近了,但似乎无法弄清楚如何将过滤器与我已经编写的代码集成。

我知道 Wordpress Codex 有这方面的信息 (http://codex.wordpress.org/Class_Reference/WP_Query) 但作为 PHP 新手,我不知道如何使它与我的自定义字段数据一起工作。这是 Wordpress 代码:

// Create a new filtering function that will add our where clause to the query
function filter_where( $where = '' ) {
    // posts for March 1 to March 15, 2010
    $where .= " AND post_date >= '2010-03-01' AND post_date < '2010-03-16'";
    return $where;
}

add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );

但我不确定如何将它与我当前的查询集成,或者如何将我的日期字段用作查询值而不是发布日期。以下是我目前写的内容。

<?php
$args = array(
            'post_type'         => 'events',
            'posts_per_page'    => 4,
            'meta_key'          => 'event_date', 
            'orderby'           => 'meta_value_num',
            'order'             => 'ASC'
        );
$loop = new WP_Query( $args );
if ( $loop->have_posts() ) : while ( $loop->have_posts() ) : $loop->the_post();
?>

    <h1><?php the_title()</h1>
    <?php $eventdate = date_create(get_field('event_date')); ?>
    <small><?php echo date_format($eventdate,'M d'); ?></small>

<?php endwhile; endif; ?>

如果有人能告诉我如何将过滤器添加到我的查询中,以及如何将自定义字段元用于事件日期而不是发布日期,我将不胜感激。我想我已经提供了所有需要的信息,但如果我错过了什么,请告诉我。谢谢!

【问题讨论】:

    标签: php html wordpress


    【解决方案1】:

    在研究 meta_query 顺序时,根据您的需要找到真正满足的东西

    <?php
    $today = date("Y-m-d");
    query_posts(array(
    'post_type' => 'events',
    'posts_per_page' => 4,
    'meta_key' => 'event_date',
    'orderby' => 'meta_value',
    'order' => 'ASC',
        'meta_query' => array(
            array(
               'key' => 'event_date',
               'meta-value' => $value,
               'value' => $today,
               'compare' => '>=',
               'type' => 'CHAR'// you can change it to datetime also
           )
    )
    ));
    if (have_posts()) :
    while (have_posts()) : the_post();
    ?>
        <a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a>
    
    <?php endwhile; ?>
    <?php else : ?>
    <?php endif; ?> 
    

    【讨论】:

    • 这很棒!我确实对其进行了一些修改以与 WP_Query 一起使用,因为据我了解,这是在 Wordpress 中查询帖子以及正确格式化日期(Ymd)的更正确方法,但这是一个很好的提示。谢谢!
    【解决方案2】:

    我会尝试不使用过滤器,而只是使用修改后的 WP_Query

    <?php
        $today = date('Ymd');
        $args = array(
                'post_type'         => 'events',
                'posts_per_page'    => 4,
                'meta_key'          => 'event_date', 
                'orderby'           => 'meta_value_num',
                'order'             => 'ASC',
                'meta_value_num'    => $today,
                'meta_compare'      => '>'
            );
        $loop = new WP_Query( $args );
        if ( $loop->have_posts() ) : while ( $loop->have_posts() ) : $loop->the_post();
    ?>
    
        <h1><?php the_title()</h1>
        <?php $eventdate = date_create(get_field('event_date')); ?>
        <small><?php echo date_format($eventdate,'M d'); ?></small>
    
    <?php endwhile; endif; ?>
    

    我确定它可以通过meta_value_num 订购,所以meta_value_num 也应该可以解决。

    【讨论】:

    • 由于某种原因这不起作用。不知道为什么,但@dianuj 的回答似乎很有魅力。不过感谢您的帮助!
    • @fluid 可能meta_value_num 不会强制类型为INT,所以meta_value 是正确的方法吗?无论如何,其他答案有效。
    【解决方案3】:

    我确实尝试并在自定义元框字段中测试了它与当前事件的正常工作,其中包含 stardate 和 end date。

    //here is main query and then after use this metaquery 
    $meta_query = array( // WordPress has all the results, now, return only the events after today's date
                        'relation' => 'AND',
                        array(
                            'key' => 'edgtf_event_start_date', // Check the start date field
                            'value' => date("Y-m-d"), // Set today's date (note the similar format)
                            'compare' => '<=', // Return the ones greater than today's date
                            'type' => 'DATE' // Let WordPress know we're working with date
                        ),
                        array(
                            'relation' => 'OR',
                            array(
                            'key'     => 'edgtf_event_end_date',
                            'value'   => date("Y-m-d"),
                            'compare' => '>=',
                            'type'    => 'DATE',
                            ),
                            array(
                                'key' => 'edgtf_event_end_date',
                                'compare' => 'NOT EXISTS'
                            ),
                        ),
                        
                        );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 2022-01-10
      • 2021-06-29
      • 1970-01-01
      相关资源
      最近更新 更多