多分类和ACF过滤器分组依据

时间:2020-03-22 作者:blogob

我有一个小部件,它必须显示我的自定义帖子类型。我不显示标题或内容,只显示3个自定义字段(acf)的值:开始日期、结束日期和城市。

这是我的循环。我获取了所有具有选定分类法(类别和级别)的自定义帖子。它正在工作。

$args = array(
    \'post_type\' => \'formation\',
    \'posts_per_page\'    => $instance[\'number_events\'],
    \'tax_query\' => array(
        \'relation\' => \'AND\',
        array(
            \'taxonomy\' => \'categories-formations\',
            \'field\' => \'id\',
            \'terms\' => $tax_id,
        ),
         array(
            \'taxonomy\' => \'niveau-formations\',
            \'field\'    => \'id\',
            \'terms\'    =>  $niveau_id,
        ),
    ),

);
$upcoming_events = new WP_Query($args);

if ( $title ) {
    echo $before_title . $title . $after_title;
}
// vars
?>
<ul class="event_entries">
    <?php  
    while( $upcoming_events->have_posts() ): $upcoming_events->the_post();
        $event_start_date = get_field( \'date_de_debut\');
        $event_end_date = get_field(\'date_de_fin\' );
        $city = get_field(\'ville\'); 
        $posts = $upcoming_events->posts;
        echo \'<h3>\' . $city . \'</h3>\';
        echo \'<ul>\';
        echo \'<li>Du\' . $event_start_date . \' au \' . $event_end_date . \'</li>\';
        echo \'</ul>\';
    endwhile; ?>
    <?php
    wp_reset_query();
    echo $after_widget;
}
在前面,我有一个城市名称为h3的列表,以及ul li组中相应的开始和结束日期。

Paris

    Du13/07/2020 au 24/07/2020

Paris

    Du22/06/2020 au 26/06/2020

Orléans

    Du18/05/2020 au 22/05/2020
我想要的是按城市名称分组,以便:(与特定城市对应的所有日期分组在一起)

Paris

    Du13/07/2020 au 24/07/2020

    Du22/06/2020 au 26/06/2020

Orléans

    Du18/05/2020 au 22/05/2020
请任何人都能帮助我,因为我在这两天以来一直在尝试多个查询和循环。我不知道如何做到这一点。我想理解逻辑。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

首先,在您的税务查询中(tax_query), 您应该使用\'field\' => \'term_id\' 而不是\'field\' => \'id\' &mdash;i、 e.使用term_id 而不是id. 但默认值/字段为term_id (术语ID),尽管如此。

因此,您可以实现这样的分组显示,并使用代码代替从<ul class="event_entries"> 在那之前wp_reset_query(); &mdash;您不需要重置全局/主查询,因为您只是进行一个不涉及全局的辅助查询$wp_query 变量:

<?php
// First, group the posts by the city.
$groups = array();
foreach ( $upcoming_events->posts as $i => $p ) {
    $city = get_field( \'ville\', $p->ID );

    if ( ! isset( $groups[ $city ] ) ) {
        $groups[ $city ] = array();
    }
    $groups[ $city ][] =& $upcoming_events->posts[ $i ];
}

// Optional, sort the city names.
ksort( $groups, SORT_FLAG_CASE );

// Then display the posts.
if ( ! empty( $groups ) ) {
    echo \'<ul class="event_entries">\';
    foreach ( $groups as $city => $posts ) {
        if ( ! empty( $posts ) ) {
            // Display city name.
            echo \'<h3>\' . $city . \'</h3>\';

            // Display posts in that city.
            echo \'<ul>\';
            foreach ( $posts as $post ) {
                $event_start_date = get_field( \'date_de_debut\', $post->ID );
                $event_end_date   = get_field( \'date_de_fin\', $post->ID );

                echo \'<li>Du\' . $event_start_date . \' au \' . $event_end_date . \'</li>\';
            }
            echo \'</ul>\';
        }
    }
    echo \'</ul>\'; // close .event_entries
}
注意,我假设所有帖子都有一个有效的城市。

此外,上述技巧不会改变$upcoming_events 对象,如果您调用setup_postdata() 在代码中,还应该调用wp_reset_postdata() 在代码/函数的末尾。

更新:回应您的评论The Loop, 但查看链接的文章,您至少会了解什么是循环,以及如何使用或使用循环。

但是,我可以从上述代码中告诉您:

当你这样做的时候$upcoming_events = new WP_Query(), 这个$upcoming_events 变量成为WP_Query 类,因此,变量将继承/包含所有(公共)属性(例如。$upcoming_events->posts) 和方法/功能(例如。$upcoming_events->query()) 班级的。您可以通过查看官方参考来了解这些属性和方法here.

我也不明白$upcoming_events->posts as $i => $p\'..什么是$i$p??“-$i 是中当前项的索引$upcoming_events->posts 正在循环,而$p 是当前项目的值(即。$upcoming_events->posts[ $i ]) 这是一个WP_Post 实例(&M);但是如果您在理解“当前项”时遇到困难,那么您需要检查PHPmanual 在…上foreach, 或者你可以问或搜索“什么是foreach 在PHP中?“堆栈溢出。。

我也不明白$groups[ $city ][] =& $upcoming_events->posts[ $i ];“-嗯,这只是$groups[ $city ][] = $upcoming_events->posts[ $i ]; (复制;注意==&). 它被称为“通过引用分配”,这基本上有助于提高性能,因为我们不需要将post对象复制到$groups 只需在原文中引用$upcoming_events->posts.

看见this Stack Overflow question 和/或this article 了解更多详细信息。

但基本上,想想电脑中的快捷方式之类的参考;e、 例如,桌面上指向文件(例如文本文件)的图标。所以$my_var =& $file; 就像创建文本文件的快捷方式$my_var = $file; (再次注意= vs公司=&) 就像您将文件复制到了桌面。

我不明白$posts 变量“-如果您的意思是foreach ( $groups as $city => $posts ), 那么$posts 是post对象引用的数组,因此$posts[0] 例如,是对$upcoming_events->posts[0] 这是一个post对象。一、 e.它们都指向完全相同的WP_Post 实例(请参见上文第2点)。

因此,我希望这4点对您有所帮助,但有关PHP特定事物的更多信息,如foreach/循环和引用,请询问堆栈溢出或在Google上搜索等:)

相关推荐

Why my loop isn't working?

我正在使用这个循环,而不是获取我的帖子(博客),我在我的案例中获取主页和主页内容的页面标题<?php while(have_posts()) { the_post(); ?> <h2><?php the_title(); ?></h2> <?php the_content(); ?> <hr> <?php } ?>