Twig:使用if条件在N列网格中输出数组元素的优雅方式

时间:2016-11-18 18:17:26

标签: wordpress twig timber

我使用的是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 %}

1 个答案:

答案 0 :(得分:3)

据我所知,这是不可能的。如果您正在寻找一种优雅的方式,我建议您选择另一种方式:

每当我可以,我不会过滤Twig中的帖子,但是在PHP中,在帖子传递给模板之前。有了Timber,您可以采用多种方式:

1。调整查询

使用正确的parameters for WP_Query,您通常只能选择所需的帖子。

$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;

一个小警告:默认查询使用设置&gt;下WordPress后端中定义的帖子数量。阅读&gt; 博客页面最多显示。当您过滤返回的帖子时,最终可能会发布比您预期更少的帖子。

3。使用并覆盖默认参数

作为评论中提到的Dan,如果一个人在特殊页面上,比如一个存档页面,则需要再次构建整个WP_Query个参数。

要获取主查询使用的所有参数并使用我们自己的参数覆盖它们以便稍后在Timber::get_posts()中使用它们,我们可以使用方便的wp_parse_args函数。我们将新参数作为第一个参数和主查询的查询变量作为要覆盖的默认参数传递。

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()等)来确保您所做的更改仅应用于有意义的地方。在查询中,您可以设置/重置要更改的查询变量。

// 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 );
    }
} );

如果您可以在实际使用它们的模板文件中设置查询变量,这样会更方便。这就是为什么我更喜欢#3而不是#4。我遇到调试会话,我的查询很奇怪,直到我意识到存在pre_get_posts干扰。