用木材(细枝)按首字母显示Wordpress自定义邮件类型

用木材(细枝)按首字母显示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' =

我使用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' => '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}