Timber Wordpress - 显示两个类别的帖子块

doi*_*cky 0 wordpress twig timber

我用以下内容创建了一个新的page-test.php.

$query = array('category_name' => 'blog, portfolio');
$context['posts'] = Timber::get_posts($query);
Run Code Online (Sandbox Code Playgroud)

这显示了来自这些类别的帖子很棒,但我想将它们分组到页面上的特定div中.目前我无法获取我的自定义页面或挑逗twig文件(我不知道我是否需要两者或只是一个)来覆盖默认的树枝页面.我做了更改,要么打破页面,要么似乎什么都不做.

我确信这是完全错误的.

{% extends "base.twig" %}

{% block content %}
    {% for post in posts %}
        <div class="blog">
            {% include ['tease-'~post.post_type~'.twig', 'tease.twig'] %}
        </div>
    {% endfor %}

    {% for post in posts %}
        <div class="portfolio">
            {% include ['tease-'~post.post_type~'.twig', 'tease.twig'] %}
        </div>
    {% endfor %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我不知道如何让特定的twig文件显示我想要的内容.

在此先感谢您的帮助.

请注意我之前使用的是Expression Engine,Statamic和Craft,所以我对这种类型的东西非常熟悉(虽然不是php),但由于某种原因,这已经打败了我.

Gch*_*htr 5

为什么你的第一种方法不起作用

当您收到两个类别的帖子时,您会收到各种帖子,按日期排序,这是您第一次尝试时获得的.你循环遍历所有的帖子,一次是在一个带有类博客的div中,一次是在一个带有类别组合的div中.您没有添加检查帖子是否实际位于类别博客投资组合中.

据我了解,您希望post.post_type在您的包含中使用以区分类别.但是,post_type不是类别,它将为您的帖子"发布"和页面的"页面"(或使用自定义帖子类型时的任何其他名称).你的包裹试图找到tease-post.twig,这可能不存在.

所以这个唯一的区别是:

{% for post in posts %}
    <div class="blog">
        {% include ['tease-'~post.post_type~'.twig', 'tease.twig'] %}
    </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

还有这个:

{% for post in posts %}
    <div class="portfolio">
        {% include ['tease-'~post.post_type~'.twig', 'tease.twig'] %}
    </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

最后只有div;)上的类名.

现在要获取帖子的类别,您可以通过post.categorytwig文件访问它.

{% for post in posts %}
    <div class="blog">
        {% include ['tease-' ~ post.category.slug ~ '.twig', 'tease.twig'] %}
    </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

但是你的博客div中你仍然会有投资组合类别的帖子.

你怎么能这样做

Timber的美妙之处在于,您可以在将其处理到模板之前处理您的帖子.您还可以获取您获得的帖子Timber::get_posts()并将其拆分,过滤,扩展,无论您想要什么.

现在我们可以在将它们交给模板之前按类别对它们进行排序.

一种方法是在查询中传递一个额外的参数.但为了学习木材,我们将采取另一种方法.

我们将为每个类别创建一个包含子数组的新数组.我们称之为新阵列$sorted_posts.然后,我们遍历所有帖子,获取该帖子的类别并填充,$sorted_posts以便子阵列的键是帖子第一类的slu .. 像这样:

$query = array(
    'category_name' => 'blog,portfolio',
);

$posts = Timber::get_posts( $query );

$sorted_posts = array();

foreach ( $posts as $post ) {
    // Get first category of post
    $category = $post->category();

    // Fill post back to sorted_posts
    $sorted_posts[ $category->slug ][] = $post;
}

// Add sorted posts to context
$context['posts'] = $sorted_posts;
Run Code Online (Sandbox Code Playgroud)

A var_dump()on $sorted_posts看起来像下面这样,共有5个帖子(3个投资组合帖子和2个博客帖子).

$sorted_posts = array (size=2)
    'portfolio' => array (size=3)
        0 => object(Timber\Post)[379]
        1 => object(Timber\Post)[430]
        2 => object(Timber\Post)[375]
    'blog' => array (size=2)
        0 => object(Timber\Post)[378]
        1 => object(Timber\Post)[429]
Run Code Online (Sandbox Code Playgroud)

在你的twig文件中,你可以循环遍历这些子数组:

{% extends 'base.twig' %}

{% block content %}

<div class="blog">
    <h3>Blog</h3>
    {% for post in posts.blog %}
        {% include ['tease-blog.twig', 'tease.twig'] %}
    {% endfor %}
</div>

<div class="portfolio">
    <h3>Portfolio</h3>
    {% for post in posts.portfolio %}
        {% include ['tease-portfolio.twig', 'tease.twig'] %}
    {% endfor %}
</div>

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

当您为帖子分配两个或更多类别时,此方法无法处理的内容.

你的第二个解决方案为什

你在第二种方法中所做的是通过只获得一个类别的帖子来绕过帖子排序.这样,您就会知道$context['posts']只会有类别的帖子,story而且$context['posts2']只会有类别的帖子news.你没有得到一个你必须先排序的混合帖子数组.

现在好消息是:您可能找到了最适合您的案例的解决方案,因为它使用的数据库查询少于分别获取每个帖子的类别.

当我这样做时(如"你怎么做")......

foreach ( $posts as $post ) {
    $category = $post->category();
}
Run Code Online (Sandbox Code Playgroud)

...然后WordPress将获得其他数据库查询中每个帖子的类别.老实说,我不知道是否有可能获得包含该类别的帖子.如果您没有必须在首页上显示的帖子很多,那么您或您网站访问者的性能差异可能会微不足道.

TL; DR:干得​​好,坚持你找到的解决方案!