用Timber(树枝)首字母显示Wordpress自定义帖子类型

时间:2016-12-29 17:18:53

标签: wordpress twig timber

我使用Timber for Wordpress,我想创建一个这样的字典系统: https://wordpress.stackexchange.com/questions/119163/displaying-custom-post-type-by-first-letter-through-custom-taxonomy

我写了这个:

lexique.php

$query = get_posts(array('post_type' => 'lexique','posts_per_page' => -1));

但我不知道如何用木材改变这一点:

$by_letter = array();
while( $query->have_posts() ) { $query->the_post();
  global $post;
  $letter = substr($post->post_name, 0, 1);
  if ( ! isset($by_letter[$letter]) ) $by_letter[$letter] = array();
  $by_letter[$letter][] = $post;
}
wp_reset_postdata();

1 个答案:

答案 0 :(得分:2)

立即获取所有帖子是个好主意。通过添加orderby参数,您可以将它们放入正确的字母排序顺序。我使用title而非name进行排序并定义第一个字母,因为name / post_name是一个URL安全字符串(用于永久链接)可能与帖子的实际标题不同。

您可以通过Timber::get_posts()获得帖子,这样您就不必依赖The Loop了。在通过Twig文件呈现之前,您将获得一个包含可以使用的帖子的数组。这比您链接的方法更直接,因为您必须依赖其他功能和查询重置。

<强> lexique.php

$posts = Timber::get_posts( array(
    'post_type' => 'lexique',
    'posts_per_page' => -1,
    'orderby' => 'title',
    'order' => 'ASC',
) );

$posts_by_letter = array();

// Sort posts by letter
foreach ( $posts as $post ) {
    $first_letter = substr( $post->post_title, 0, 1);

    // Create array for letter if it doesn’t exist
    if ( ! isset( $posts_by_letter[ $first_letter ] ) ) {
        $posts_by_letter[ $first_letter ] = array();
    }

    $posts_by_letter[ $first_letter ][] = $post;
}

$context['posts_by_letter'] = $posts_by_letter;

Timber::render( [ 'lexique.twig' ], $context );

仅显示现有帖子的字母

<强> lexique.twig

<dl>
{% for letter, posts in posts_by_letter %}
    <dt>{{ letter }}</dt>

    {% for post in posts  %}
        <dd><a href="{{ post.link }}">{{ post.title }}</a></dd>
    {% endfor %}
{% endfor %}
</dl>

因为你有一个嵌套数组,你必须做两个for循环。第一个循环遍历字母(外部数组的键)。分配给字母键的值是另一个数组,包含以该字母开头的所有帖子。要将帖子标题显示为链接,请使用第二个for循环。

显示从A到Z的所有字母

如果您要生成A到Z中所有字母的列表并显示现有帖子,您可以使用range并检查posts_by_letter中该字母是否存在帖子。

此外,您可以使用range创建一个锚点链接列表,让访问者可以跳转到特定的字母。

<强> lexique.twig

 {# Anchor links to jump to letter #}
 {% for letter in range('A', 'Z') %}
     <a href="#{{ letter }}">{{ letter }}</a>
 {% endfor %}

 <dl>
 {% for letter in range('A', 'Z') %}
     <dt><a id="{{ letter }}">{{ letter }}</a></dt>
     {% if posts_by_letter[letter] is defined %}
         {% for post in posts_by_letter[letter]  %}
             <dd><a href="{{ post.link }}">{{ post.title }}</a></dd>
         {% endfor %}
     {% endif %}
 {% endfor %}
 </dl>