我正在使用Timber & Twig来编写Wordpress主题。据我理解,在有N列的网格中输出帖子的惯用方法是使用batch过滤器:
{% block content %}
{% for row in posts | batch(3) %}
<div class='grid-3'>
{% for post in row %}
<div class='col'>
{% include ['tease-'~post.post_type~'.twig', 'tease.twig'] %}
</div>
{% endfor %}
</div>
{% endfor %}
</div>
{% endblock %}如何使用带有batch条件的if筛选器,以便只输出层次结构中的顶级职位?
(条件是{% if not post.parent %})
发布于 2016-11-18 22:56:51
据我所知,这是不可能的。如果你在寻找一种优雅的方式,我建议你换一种方法:
只要有可能,我就不会在Twig中过滤帖子,而是在PHP中过滤文章,然后再将帖子传递给模板。对于Timber,您可以使用多种方法:
1.调整查询
使用适当的查询,您通常只能选择所需的帖子。
$context['posts'] = Timber::get_posts( array(
'post_parent' => 0
) );2.过滤查询结果
有时,在WP_Query中使用大量参数会使查询变得缓慢。出于性能原因,有时最好查询更多的文章,然后再用PHP进行筛选。
$posts = Timber::get_posts();
$filtered = array();
foreach ( $posts as $post ) {
if ( $post->post_parent === 0 ) {
$filtered[] = $post;
}
}
$context['posts'] = $filtered;或
$posts = Timber::get_posts();
$posts = array_filter( $posts, function( $post ) {
return $post->post_parent === 0;
} );
$context['posts'] = $posts;一个小警告:默认查询最多使用设置>阅读>博客页面下在WordPress后端定义的帖子数量。当您筛选返回的帖子时,您可能会得到比您预期的更少的帖子。
3.使用和覆盖默认的args
正如丹在注释中提到的,对于#1,如果是在一个特殊的页面上,比如一个归档页面,那么就必须再次构建整个WP_Query参数。
为了获得主查询使用的所有参数并用我们自己的参数覆盖它们,以便以后在Timber::get_posts()中使用它们,我们可以使用方便的参数函数。我们将新参数作为第一个参数传递,主查询的查询变量作为要覆盖的默认参数传递。
global $wp_query;
// Set query args before posts are queried in get_context()
$args = wp_parse_args( array(
'post_type' => 'page',
'post_parent' => 0,
), $wp_query->query_vars );
$context = Timber::get_context();
$posts = Timber::get_posts( $args );
$context['posts'] = $posts;4.使用pre_get_posts动作钩子( WordPress方式)
调整主查询的默认WordPress方法是使用pre_get_posts操作钩子。虽然这可能是最干净的方法,但使用起来不太方便。
pre_get_posts动作钩子需要在functions.php中定义。如果在任何模板文件(如page.php或archive.php)中定义它,则为时已晚。这里的缺点是你必须使用条件词($query->is_main_query()等)。以确保您所做的更改仅适用于有意义的地方。在查询内部,您可以设置/重置要更改的查询vars。
// In your functions.php
add_action( 'pre_get_posts', function( $query ) {
if ( $query->is_main_query() && $query->is_front_page() ) {
$query->set( 'post_type', 'page' );
$query->set( 'post_parent', 0 );
}
} );如果您可以在模板文件中设置query,那么它就更方便了,您可以在其中实际使用它们。这就是为什么我更喜欢#3而不是#4。我遇到了一些调试会话,在这些过程中,我遇到了一个奇怪的查询,直到我意识到存在一个pre_get_posts干扰。
https://stackoverflow.com/questions/40683614
复制相似问题