使用 Timber(树枝)按第一个字母显示 Wordpress 自定义 post 类型
Displaying Wordpress custom post type by first letter with Timber (twig)
我将 Timber 用于 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));
但我不知道如何用 Timber 转换它:
$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();
一次获取所有 post 是个好主意。通过添加 orderby
参数,您已经可以将它们按 letter-sorting 的正确顺序排列。我会使用 title
而不是 name
进行排序和定义第一个字母,因为 name
/post_name
是一个 URL-safe 字符串(用于永久链接) 可能与 post.
的实际标题不同
您通过 Timber::get_posts()
获得 posts,这样您就不必依赖 The Loop。在通过 Twig 文件渲染它之前,您会得到一个包含 post 的数组,您可以使用它。这比您链接到的方法更直接,因为您不必依赖额外的函数和查询重置。
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 );
仅显示现有 posts
的字母
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-loops。第一个循环遍历字母(这是外部数组的键)。分配给字母键的值是另一个数组,包含所有以该字母开头的 post。要将 post 标题显示为链接,请使用第二个 for-loop.
显示从 A 到 Z 的所有字母
如果要生成从 A 到 Z 的所有字母的列表并显示现有的 posts,您可以使用 range
并检查该字母是否存在 posts在 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>
我将 Timber 用于 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));
但我不知道如何用 Timber 转换它:
$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();
一次获取所有 post 是个好主意。通过添加 orderby
参数,您已经可以将它们按 letter-sorting 的正确顺序排列。我会使用 title
而不是 name
进行排序和定义第一个字母,因为 name
/post_name
是一个 URL-safe 字符串(用于永久链接) 可能与 post.
您通过 Timber::get_posts()
获得 posts,这样您就不必依赖 The Loop。在通过 Twig 文件渲染它之前,您会得到一个包含 post 的数组,您可以使用它。这比您链接到的方法更直接,因为您不必依赖额外的函数和查询重置。
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 );
仅显示现有 posts
的字母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-loops。第一个循环遍历字母(这是外部数组的键)。分配给字母键的值是另一个数组,包含所有以该字母开头的 post。要将 post 标题显示为链接,请使用第二个 for-loop.
显示从 A 到 Z 的所有字母
如果要生成从 A 到 Z 的所有字母的列表并显示现有的 posts,您可以使用 range
并检查该字母是否存在 posts在 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>