按 ACF 日期对帖子进行排序并为每个月添加标题

Posted

技术标签:

【中文标题】按 ACF 日期对帖子进行排序并为每个月添加标题【英文标题】:Sort posts by ACF date and add title for each month 【发布时间】:2021-06-13 19:37:58 【问题描述】:

我正在尝试为我的博客文章创建一个存档页面,该页面按通过 ACF 日期选择器字段添加的日期排序。

这是我目前所拥有的:

$args = array(
'post_type'         =>  'post',
'posts_per_page'    =>  -1,
'orderby'           =>  'meta_value',
'order'             =>  'DESC',
'meta_key'          =>  'datum_artikel',
'meta_value'        =>  date('Ymd',strtotime("today")),
'meta_compare'      =>  '<='
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) 
    echo "<div class='posts'>";

        while ( $query->have_posts() ) 
            $query->the_post();

            $f = get_fields();
            $link = ($f['bericht_doorverwijzen'] ?? '' ? $f['bericht_doorverwijzen'] : get_the_permalink());
            $img_id = get_post_thumbnail_id();

            $date = $f['datum_artikel'];

            echo "<div class='post w-1/3'>";
                echo "<div class='postWrapper'>";

                    if(!empty($img_id)) 
                        $img = Images::get_image_resized($img_id, 397, 230, true);
                        echo "<a href='".$link."' title='Ga naar ".get_the_title()."'>";
                            echo '<picture class="img">';
                                echo '<img src="'.$img[0].'" />';
                            echo '</picture>';
                        echo "</a>";
                    

                    echo "<div class='content'>";
                        echo "<h2><a href='".$link."' title='Ga naar ".get_the_title()."'>".get_the_title()."</a></h2>";
                        if(!empty($date)) 
                            echo "<p class='date'>". $date ."</p>";
                        
                        echo the_excerpt_max_charlength($charlength = 130);
                    echo "</div>";
                echo "</div>";
            echo "</div>";
        
    echo "</div>";

wp_reset_postdata();

我在网上找到了一些示例,但似乎没有一个适用于我的代码。当月份发生变化时,如何在帖子之间添加月份名称,我可以创建一个包含所有月份和锚点的额外导航,以便跳转到正确的帖子?

【问题讨论】:

查看上面的orderBy 字段,我发现您正在按降序使用meta_value。将meta_value 更改为datum_artikel 怎么样? 帖子的顺序是我需要的,我唯一想要的是当两个帖子之间的月份变化时在不同帖子之间显示一个标题。 那你要实现一个经典的control break。您只需将当前记录的标准值(月份,分别是年份和月份的组合)与前一个记录的值进行比较 - 如果它们不同,则首先输出月份,然后继续输出数据当前记录。 $date 是什么格式的?你能贴一个例子吗? $date 的格式如下:j F Y 【参考方案1】:

我在网上找到了另一个似乎可以满足我需要的示例:

$query = new WP_Query( array(
'post_type'     => 'post',
'post_status'   => 'publish',
'meta_key'      => 'datum_artikel',
'orderby'       => 'meta_value',
'order'         => 'DESC',
) );

if ( $query->have_posts() ) 
    $current_header = "";

    echo "<div class='posts'>";

        while ( $query->have_posts() ) 
            $query->the_post();
            $f = get_fields();
            $date = $f['datum_artikel'];
            $temp_date = get_post_meta( get_the_ID(), 'datum_artikel', true);
            $pretty_month = date_i18n("F Y", strtotime($temp_date));

            if ($pretty_month != $current_header) 
                $current_header = $pretty_month;
                echo "<h2>". $pretty_month ."</h2>";
            


            $link = ($f['bericht_doorverwijzen'] ?? '' ? $f['bericht_doorverwijzen'] : get_the_permalink());
            $img_id = get_post_thumbnail_id();

            echo "<div class='post w-1/3'>";
                echo "<div class='postWrapper'>";

                    if(!empty($img_id)) 
                        $img = Images::get_image_resized($img_id, 397, 230, true);
                        echo "<a href='".$link."' title='Ga naar ".get_the_title()."'>";
                            echo '<picture class="img">';
                                echo '<img src="'.$img[0].'" />';
                            echo '</picture>';
                        echo "</a>";
                    

                    echo "<div class='content'>";
                        echo "<h2><a href='".$link."' title='Ga naar ".get_the_title()."'>".get_the_title()."</a></h2>";
                        if(!empty($date)) 
                            echo "<p class='date'>". $date ."</p>";
                        
                        echo the_excerpt_max_charlength($charlength = 130);
                        echo "<a href='".$link."' title='Ga naar ".get_the_title()."' class='link'>Lees meer</a>";
                    echo "</div>";
                echo "</div>";
            echo "</div>";
        
        echo "</div>";

wp_reset_postdata();

【讨论】:

【参考方案2】:
$today = date("Y/m/j");
$args = (array(
    'post_type' => 'post',
    'posts_per_page'    =>  -1,
    'meta_key' => 'datum_artikel',
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'meta_query' => array(
        array(
            'key' => 'datum_artikel',
            'value' => $today,
            'compare' => '<=',
            'type' => 'CHAR'
        )
    )
));
$query = new WP_Query($args); 

【讨论】:

以上是关于按 ACF 日期对帖子进行排序并为每个月添加标题的主要内容,如果未能解决你的问题,请参考以下文章

WordPress 查询:按年份 DESC 对帖子进行分组,然后在每个组中按月 ASC 发布帖子

如何按日期对字典数组进行排序?

从所有帖子中获取 ACF 转发器字段值,按子字段排序

按日期对不同内容类型的内容排序帖子

如何按日期对我的表格视图中的数组进行排序

按关系字段 (ACF) 的 Elementor 帖子的自定义查询过滤器