首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >细枝:在有if条件的N列网格中输出数组元素的优雅方法

细枝:在有if条件的N列网格中输出数组元素的优雅方法
EN

Stack Overflow用户
提问于 2016-11-18 18:17:26
回答 1查看 628关注 0票数 1

我正在使用Timber & Twig来编写Wordpress主题。据我理解,在有N列的网格中输出帖子的惯用方法是使用batch过滤器:

代码语言:javascript
复制
{% 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 %})

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-18 22:56:51

据我所知,这是不可能的。如果你在寻找一种优雅的方式,我建议你换一种方法:

只要有可能,我就不会在Twig中过滤帖子,而是在PHP中过滤文章,然后再将帖子传递给模板。对于Timber,您可以使用多种方法:

1.调整查询

使用适当的查询,您通常只能选择所需的帖子。

代码语言:javascript
复制
$context['posts'] = Timber::get_posts( array(
    'post_parent' => 0
) );

2.过滤查询结果

有时,在WP_Query中使用大量参数会使查询变得缓慢。出于性能原因,有时最好查询更多的文章,然后再用PHP进行筛选。

代码语言:javascript
复制
$posts = Timber::get_posts();

$filtered = array();

foreach ( $posts as $post ) {
    if ( $post->post_parent === 0 ) {
        $filtered[] = $post;
    }
}

$context['posts'] = $filtered;

代码语言:javascript
复制
$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()中使用它们,我们可以使用方便的参数函数。我们将新参数作为第一个参数传递,主查询的查询变量作为要覆盖的默认参数传递。

代码语言:javascript
复制
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。

代码语言:javascript
复制
// 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干扰。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40683614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档