用木材(细枝)按首字母显示Wordpress自定义邮件类型
我使用Wordpress的Timber,我想创建一个这样的词典系统: 我写道: lexique.php用木材(细枝)按首字母显示Wordpress自定义邮件类型,wordpress,twig,timber,Wordpress,Twig,Timber,我使用Wordpress的Timber,我想创建一个这样的词典系统: 我写道: lexique.php $query = get_posts(array('post_type' => 'lexique','posts_per_page' => -1)); $posts = Timber::get_posts( array( 'post_type' => 'lexique', 'posts_per_page' => -1, 'orderby' =
$query = get_posts(array('post_type' => 'lexique','posts_per_page' => -1));
$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 );
但我不知道如何用木材来改造它:
$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();
一次获得所有帖子是个好主意。通过添加
orderby
参数,您可以将它们放入正确的字母排序顺序中。我会使用title
而不是name
来排序和定义第一个字母,因为name
/post\u name
是一个URL安全字符串(在永久链接中使用)可能与文章的实际标题不同
您可以通过Timber::get_posts()
获取帖子,这样就不必依赖循环。在通过细枝文件渲染之前,将获得一个包含可以使用的帖子的数组。这比链接到的方法更直接,因为不必依赖其他函数和查询重置
lexique.php
$query = get_posts(array('post_type' => 'lexique','posts_per_page' => -1));
$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.trigg
<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>
{# 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>
一次获得所有帖子是个好主意。通过添加
orderby
参数,您可以将它们放入正确的字母排序顺序中。我会使用title
而不是name
来排序和定义第一个字母,因为name
/post\u name
是一个URL安全字符串(在永久链接中使用)可能与文章的实际标题不同
您可以通过Timber::get_posts()
获取帖子,这样就不必依赖循环。在通过细枝文件渲染之前,将获得一个包含可以使用的帖子的数组。这比链接到的方法更直接,因为不必依赖其他函数和查询重置
lexique.php
$query = get_posts(array('post_type' => 'lexique','posts_per_page' => -1));
$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.trigg
<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>
{# 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>
您应该避免使用
substr()
这是一种密集型操作,更好的方法是使用术语
,然后使用$wpdb
进行一次查询,您可以选择所有自定义帖子和按术语排序。@Erevald,谢谢,但我可以在木材中使用这个循环?将循环放在主题中的函数中,然后在小树枝
文件中,您可以像这样显示它{function(“mytheme_loop_function”)}
如何使用术语和$wpdb?我不知道引入术语
会使解决方案变得更简单。使用木材的方法是不要在细枝文件中再次调用使用循环的函数。您使用Timber是因为您想摆脱循环。您应该避免使用substr()
这是一种密集型操作,更好的方法是使用terms
,然后使用$wpdb
进行一次查询,您可以选择所有自定义帖子并按术语排序。@Erevald,谢谢,但我可以在木材中使用这个循环?将循环放在主题中的函数中,然后在小树枝
文件中,您可以像这样显示它{function(“mytheme_loop_function”)}
如何使用术语和$wpdb?我不知道引入术语
会使解决方案变得更简单。使用木材的方法是不要在细枝文件中再次调用使用循环的函数。你使用木材是因为你想去掉这个环。哇!这太完美了!这正是我需要的!非常感谢!但我有一个问题,我想生成一个字母a,B,C,D的列表。。。带有锚,但所有字母都不显示。A目前只为A和B创建单词,但我想拥有所有的字母,可能吗?我目前只为A和B创建单词,所以在我的字母列表A、B、C中。。我只有A和B。有可能所有的字母都是空的吗?我看到类似$keys=range('a','z');但是如何使用它呢?@Jandon是的,可以显示从A到Z的所有字母,并在它们存在时显示帖子。我用一个解决方案更新了答案。非常感谢,这是完美的工作!谢谢你对你的代码发表评论,我现在理解了它的工作原理。我尝试在字母为空时更改href,但这不起作用{%if字母为空%}{%else%}{%endif%}@Jandon{{letter}}
本身永远不会为空。您需要检查是否存在以该字母开头的帖子。尝试使用{%posts\u by\u letter[letter]不是空的%}
。哇!这太完美了!这正是我需要的!非常感谢!但我有一个问题,我想生成一个字母a,B,C,D的列表。。。带有锚,但所有字母都不显示。A目前只为A和B创建单词,但我想拥有所有的字母,可能吗?我目前只为A和B创建单词,所以在我的字母列表A、B、C中。。我只有A和B。有可能所有的字母都是空的吗?我看到类似$keys=range('a','z');但是如何使用它呢?@Jandon是的,可以显示从A到Z的所有字母,并在它们存在时显示帖子。我用一个解决方案更新了答案。非常感谢,这是完美的工作!谢谢你对你的代码发表评论,我现在理解了它的工作原理。我尝试在字母为空时更改href,但这不起作用{%if字母为空%}{%else%}{%endif%}@Jandon{{letter}}
本身永远不会为空。您需要检查是否存在以该字母开头的帖子。如果按字母[letter]投递的邮件不是空的,请尝试使用{%posts}
。