在帖子旁边显示索引 - WP & Twig/Timber

问题描述

我是 WP 和 Twig/Timber 的新手。我正在一个网站上工作,我需要在 WP 帖子旁边显示一个数字:

  1. 第一篇文章
  2. 第二篇文章
  3. 第三篇文章

……等等

我找不到有关如何操作的任何信息。我可以用 Twig/Timber 实现这一点吗?另外,我对此知之甚少,但如果建议为此使用 ACF,我愿意接受。

谢谢

编辑:我想在包含所有博客帖子的页面和每个帖子页面上都显示帖子编号。

编辑 2:我希望有一个强大的解决方案可以解决删除的帖子

解决方法

您可以使用 Twig 过滤器查询保存在瞬态中的自定义帖子编号索引:订单当前设置为菜单顺序,瞬态缓存 1 分钟。

树枝

{{ post.id|get_post_number }}

php

/**
 * Adds functionality to Twig.
 * 
 * @param \Twig\Environment $twig The Twig environment.
 * @return \Twig\Environment
 */
add_filter( 'timber/twig','add_to_twig' );
function add_to_twig( $twig ) {

    // Adding functions as filters.
    $twig->addFilter( new Timber\Twig_Filter( 'get_post_number','get_post_number_by_id' ) );

    return $twig;
}

/**
 * Get post number from ID,based on menu order.
 *
 * @param [type] $id
 * @return void
 */
function get_post_number_by_id( $id ) {

    // Check we have a string
    $target_id =  strval( $id );

    // Save quesry and index in transient
    $post_number_index = Timber\Helper::transient(
        'get_post_number_by_id',function () {

            // Update parameters to match desired search order
            $args = array(
                'orderby'    => 'menu_order','posts_per_page' => -1,'post_status'    => 'publish',);

            // Query
            $posts = get_posts( $args );
            if ( !empty( $posts ) ) {
                
                // Store list
                $data = [];
                
                // Set post numer count
                $count = 0;

                // build index.
                foreach( $posts as $post ) {
                    $data[ $post->ID ] = array(
                        'post_id' => $post->ID,'post_number' => ++$count,);
                }

                return !empty( $data ) ? $data : false;
            }
            return false;
        },MINUTE_IN_SECONDS
    );

    // Retrun post number
    if ( !empty ( $post_number_index ) && array_key_exists( $target_id,$post_number_index ) ) {
        return $post_number_index[ $target_id ]['post_number'];
    }

    return false;

}
,

这是存在于 Twig 的循环变量中的东西,应该使它变得超级简单:

https://twig.symfony.com/doc/3.x/tags/for.html#the-loop-variable