Timber Wordpress - 显示来自两个类别的帖子块
Timber Wordpress - Show blocks of posts from two categories
我创建了一个新页面-test.php,内容如下。
$query = array('category_name' => 'blog, portfolio');
$context['posts'] = Timber::get_posts($query);
这显示了这些类别的帖子,这很好,但我想将它们分组到页面上的特定 div 中。目前我无法获取我的自定义页面或 tease twig 文件(我不知道我是否需要两者或只需要一个)来覆盖默认的 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 %}
我不知道如何让特定的 twig 文件只显示我想要的内容。
在此先感谢您的帮助。
请注意,我以前使用过 Expression Engine、Statamic 和 Craft,所以对这类东西非常熟悉(虽然不是 php),但出于某种原因,这让我很吃惊。
所以我让它工作了,但我确信这是一个非常糟糕的解决方案。
我在我的页面中添加了第二个查询-test.php 所以帖子是故事,帖子 2 是新闻。
$query = array('category_name' => 'Story');
$context['posts'] = Timber::get_posts($query);
$query2 = array('category_name' => 'News');
$context['posts2'] = Timber::get_posts($query2);
然后我添加了第二个 div,它引用了 posts2 查询并且有效。
{% extends "base.twig" %}
{% block content %}
<div class="blog">
<h3>Story</h3>
{% for post in posts %}
{% include ['tease-story.twig', 'tease.twig'] %}
{% endfor %}
</div>
<div class="news">
<h3>News</h3>
{% for post in posts2 %}
{% include ['tease-news.twig', 'tease.twig'] %}
{% endfor %}
</div>
{% endblock %}
我还创建了专用的 'tease-story.twig' 和 'tease-news.twig' 作为测试,但实际上并不需要这些。
老实说,我不太确定我在这里做了什么,但它确实有效。
如果有人可以帮助澄清,将不胜感激。
为什么你的第一种方法不起作用
当您获得两个类别的 post 时,您会得到 post 的混合,按日期排序,这是您第一次尝试时得到的结果。您遍历了所有 posts,一次在 div 中使用 class blog 一次在 div 中使用 class 投资组合。您没有添加检查 post 是否实际上属于 blog 或 portfolio.
类别
据我了解,您想在包含中使用 post.post_type
来区分类别。但是,post_type
不是类别,对于您的 post,它将是 "post",对于您的页面,它将是 "page"(或使用自定义 [=99= 时的任何其他名称) ] 类型)。您的包含试图找到 tease-post.twig
,它可能不存在。
所以这之间的唯一区别是:
{% 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 %}
最后只是div
上的class名字;).
现在要获取 post 的类别,您可以通过 twig 文件中的 post.category
访问它。
{% for post in posts %}
<div class="blog">
{% include ['tease-' ~ post.category.slug ~ '.twig', 'tease.twig'] %}
</div>
{% endfor %}
但是您的博客 div 中仍然有 post 个投资组合类别。
你怎么做到的
Timber 的美妙之处在于,您可以先处理 post,然后再将它们处理到模板中。您还可以使用从 Timber::get_posts()
获得的 post 并拆分它们、过滤它们、扩展它们,随心所欲。
现在我们可以在将它们交给模板之前按类别对它们进行排序。
一种方法是在查询中传递一个附加参数。但为了学习 Timber,我们将采用另一种方法。
我们将为每个类别创建一个包含子数组的新数组。我们称这个新数组为 $sorted_posts
。然后我们遍历所有 posts,得到那个 posts 的类别并填充 $sorted_posts
这样子数组的键就是 post 的 slug第一个类别。像这样:
$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;
$sorted_posts
上的 var_dump()
可能如下所示,总共有 5 post(3 个投资组合 post 和 2 个博客 posts).
$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]
在你的 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 %}
当您为 post.
分配两个或更多类别时,这种方法无法处理
为什么你的第二个解决方案有效
您在第二种方法中所做的是通过仅获取一个类别的 post 来绕过 post 排序。这样,您就知道在 $context['posts']
中只有 post 类别为 story
,而在 $context['posts2']
中只有 post 类别为 [=] 30=]。您不会得到必须先排序的混合 posts 数组。
现在好事是:您可能找到了最适合您案例的解决方案,因为它使用的数据库查询比分别获取每个 post 的类别少.
当我这样做时(如 "How you could do it")...
foreach ( $posts as $post ) {
$category = $post->category();
}
… 然后 WordPress 将在额外的数据库查询中获取每个 post 的类别。老实说,我不知道是否有可能获得包含该类别的 posts。如果您没有很多必须显示在首页上的 post,那么您或您的网站访问者在性能上的感知差异可能可以忽略不计。
TL;DR:干得好,坚持你找到的解决方案!
我创建了一个新页面-test.php,内容如下。
$query = array('category_name' => 'blog, portfolio');
$context['posts'] = Timber::get_posts($query);
这显示了这些类别的帖子,这很好,但我想将它们分组到页面上的特定 div 中。目前我无法获取我的自定义页面或 tease twig 文件(我不知道我是否需要两者或只需要一个)来覆盖默认的 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 %}
我不知道如何让特定的 twig 文件只显示我想要的内容。
在此先感谢您的帮助。
请注意,我以前使用过 Expression Engine、Statamic 和 Craft,所以对这类东西非常熟悉(虽然不是 php),但出于某种原因,这让我很吃惊。
所以我让它工作了,但我确信这是一个非常糟糕的解决方案。
我在我的页面中添加了第二个查询-test.php 所以帖子是故事,帖子 2 是新闻。
$query = array('category_name' => 'Story');
$context['posts'] = Timber::get_posts($query);
$query2 = array('category_name' => 'News');
$context['posts2'] = Timber::get_posts($query2);
然后我添加了第二个 div,它引用了 posts2 查询并且有效。
{% extends "base.twig" %}
{% block content %}
<div class="blog">
<h3>Story</h3>
{% for post in posts %}
{% include ['tease-story.twig', 'tease.twig'] %}
{% endfor %}
</div>
<div class="news">
<h3>News</h3>
{% for post in posts2 %}
{% include ['tease-news.twig', 'tease.twig'] %}
{% endfor %}
</div>
{% endblock %}
我还创建了专用的 'tease-story.twig' 和 'tease-news.twig' 作为测试,但实际上并不需要这些。
老实说,我不太确定我在这里做了什么,但它确实有效。
如果有人可以帮助澄清,将不胜感激。
为什么你的第一种方法不起作用
当您获得两个类别的 post 时,您会得到 post 的混合,按日期排序,这是您第一次尝试时得到的结果。您遍历了所有 posts,一次在 div 中使用 class blog 一次在 div 中使用 class 投资组合。您没有添加检查 post 是否实际上属于 blog 或 portfolio.
类别据我了解,您想在包含中使用 post.post_type
来区分类别。但是,post_type
不是类别,对于您的 post,它将是 "post",对于您的页面,它将是 "page"(或使用自定义 [=99= 时的任何其他名称) ] 类型)。您的包含试图找到 tease-post.twig
,它可能不存在。
所以这之间的唯一区别是:
{% 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 %}
最后只是div
上的class名字;).
现在要获取 post 的类别,您可以通过 twig 文件中的 post.category
访问它。
{% for post in posts %}
<div class="blog">
{% include ['tease-' ~ post.category.slug ~ '.twig', 'tease.twig'] %}
</div>
{% endfor %}
但是您的博客 div 中仍然有 post 个投资组合类别。
你怎么做到的
Timber 的美妙之处在于,您可以先处理 post,然后再将它们处理到模板中。您还可以使用从 Timber::get_posts()
获得的 post 并拆分它们、过滤它们、扩展它们,随心所欲。
现在我们可以在将它们交给模板之前按类别对它们进行排序。
一种方法是在查询中传递一个附加参数。但为了学习 Timber,我们将采用另一种方法。
我们将为每个类别创建一个包含子数组的新数组。我们称这个新数组为 $sorted_posts
。然后我们遍历所有 posts,得到那个 posts 的类别并填充 $sorted_posts
这样子数组的键就是 post 的 slug第一个类别。像这样:
$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;
$sorted_posts
上的 var_dump()
可能如下所示,总共有 5 post(3 个投资组合 post 和 2 个博客 posts).
$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]
在你的 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 %}
当您为 post.
分配两个或更多类别时,这种方法无法处理为什么你的第二个解决方案有效
您在第二种方法中所做的是通过仅获取一个类别的 post 来绕过 post 排序。这样,您就知道在 $context['posts']
中只有 post 类别为 story
,而在 $context['posts2']
中只有 post 类别为 [=] 30=]。您不会得到必须先排序的混合 posts 数组。
现在好事是:您可能找到了最适合您案例的解决方案,因为它使用的数据库查询比分别获取每个 post 的类别少.
当我这样做时(如 "How you could do it")...
foreach ( $posts as $post ) {
$category = $post->category();
}
… 然后 WordPress 将在额外的数据库查询中获取每个 post 的类别。老实说,我不知道是否有可能获得包含该类别的 posts。如果您没有很多必须显示在首页上的 post,那么您或您的网站访问者在性能上的感知差异可能可以忽略不计。
TL;DR:干得好,坚持你找到的解决方案!