php – 按类别分类的Foreach循环分组

我在
WordPress Stack Exchange上问了这个问题,并且在24小时后没有得到太多响应.所以我想我会把它带到一个更大的社区.

无论如何,我正在创建一个事件插件,这是有效的,但是我在确定列表页面时遇到了一些麻烦.它显示了所有事件,但是我希望它按月分组.该声明需要提取事件的日期,抓住月份,并将特定月份的记录组合在一起.我知道这将是一个foreach,但我不知道如何写它.

这是我的循环:

 // Query Post Type
$args = array(
    'post_type' => 'events',
    'post_status' => 'publish',
    'meta_key' => '_eDate',
    'orderby' => 'meta_value_num'
);
$the_query = new WP_Query($args);

// Build It
if ($the_query->have_posts()) :
    ?>
    <div id="event-list">
        <?php
        global $post;

        $month_array = array();
        while ($the_query->have_posts()) : $the_query->the_post();

            var_dump( get_post_meta( $post->ID, '_eDate', true ) ); 

            $date_field = get_post_meta( $post->ID, '_eDate', true );
            $month_format = new DateTime();
            $month_format->createFromFormat('Y-m-d', $date_field); 
            $month_number = $month_format->format('m'); 
            $month_array[] = $month_number; 

            if ($the_query != 0 && $month_number != $month_array[$the_query->current_post - 1]) //LINE 38
                echo '<h2>' . $month_format->format( 'F' ) . '</h2>'; 
            ?>

            <div class="row">
                <div class="event-image">
                    <a href="<?php echo get_permalink(get_the_ID()); ?>">
                        <?php
                        if (has_post_thumbnail()) {
                            the_post_thumbnail('thumbnail');
                        }
                        ?>
                    </a>
                </div>
                <div class="event-content">
                    <h3><a href="<?php echo get_permalink(get_the_ID()); ?>"><?php the_title(); ?></a></h3>
                    <div class="event-date"><?php display_event_date(); ?></div>
                    <div class="event-time"><?php display_event_time(); ?></div>
                    <div class="event-price"><?php display_event_price(); ?></div>
                    <br/>
                    <a href="<?php echo get_permalink(get_the_ID()); ?>" class="event-info">More Information</a>
                </div>
                <div class="event-buy">
                    <?php display_event_buy_online_url(); ?>
                </div>
            </div>
        </div>
        <?php wp_reset_postdata(); ?>
        <?php
    endwhile;
endif;

—编辑1 —

我已根据输入更新了我的代码块.

var_dump输出为string(10)“2015-07-09”

我也遇到两个错误.

Notice: Object of class WP_Query could not be converted to int in C:\xampp\apps\wordpress\htdocs\wp-content\plugins\wp-events-em4b\views\shortcode.php on line 38

Notice: Undefined offset: -1 in C:\xampp\apps\wordpress\htdocs\wp-content\plugins\wp-events-em4b\views\shortcode.php on line 38

从int转换为文本的月份是错误的,它是最后一次编辑帖子,但var_dump具有正确的日期.

最佳答案 正如我在回答您关于WPSE的问题时所述,您需要根据自定义字段中的日期对帖子进行排序.这与向查询参数添加正确的参数一样简单

如果您的日期保存为以下格式,Y-m-d,则非常简单.您的年份将保持不变,因此您可以在技术上按月分类.

您只需要为订单和orderby参数添加正确的值.您可以尝试以下方法

// Query Post Type
$args = array(
    'post_type' => 'events',
    'post_status' => 'publish',
    'meta_key' => '_eDate',
    'orderby' => 'meta_value'
);

如果您需要按月分类而不管年份,那么您需要使用usort()在执行循环之前对其进行排序.如果是这种情况,请告诉我,以便我可以相应地调整我的答案.

您已经声明自定义字段中的日期格式为Y-m-d,因此您的循环应根据自定义字段中的日期按日期正确排序_eDate

您现在需要做的就是检查循环中当前帖子与循环中上一个帖子之间的日期(月份),如果它们不同,则输出月份.您不需要foreach循环,也不需要输出缓冲或创建包含原始帖子数组中的帖子的新数组

以下代码未经测试,同时确保自定义字段中的日期格式正确无误.在你的循环中你想要首先做var_dump(get_post_meta($post-> ID,’_ eDate’,true));验证您是否以正确的格式获得了正确的值.我的代码中的所有内容都依赖于这一小段信息.如果_eDate自定义字段中的值或格式不正确,则我的代码将失败.请根据需要调整,修改和滥用我的代码

 // Query Post Type
$args = array(
    'post_type' => 'events',
    'post_status' => 'publish',
    'meta_key' => '_eDate',
    'orderby' => 'meta_value' //HAD A BUG HERE, DID NOT SORT CORRECTLY, NEEDS TO BE meta_value
);
$the_query = new WP_Query($args);

// Build It
if ( $the_query->have_posts() ) :
    ?>
    <div id="event-list">
        <?php
        $month_array = array();
        while ( $the_query->have_posts() ) : 
            $the_query->the_post();

            $date_field = get_post_meta( $post->ID, '_eDate', true );
            $month_format = DateTime::createFromFormat( 'Y-m-d', $date_field ); // HAD A BUG HERE, CONVERTED WRONG DATE
            $month_number = $month_format->format('m');
            $month_array[] = $month_number; 

            // Choose the format you want to display as indicated below
            if ( $the_query->current_post == 0 ) // Output date id this is the first post
                echo '<h2>' . $month_format->format( 'F' ) . '</h2>'; // Output month name as January

            if (    $the_query->current_post != 0 //HAD A BUG HERE, WAS $the_query != 0
                 && $month_number != $month_array[$the_query->current_post - 1] 
            )
                echo '<h2>' . $month_format->format( 'F' ) . '</h2>'; // Output month name as January            
            ?>

            <div class="row">
                <div class="event-image">
                    <a href="<?php echo get_permalink(get_the_ID()); ?>">
                        <?php
                        if (has_post_thumbnail()) {
                            the_post_thumbnail('thumbnail');
                        }
                        ?>
                    </a>
                </div>
                <div class="event-content">
                    <h3><a href="<?php echo get_permalink(get_the_ID()); ?>"><?php the_title(); ?></a></h3>
                    <div class="event-date"><?php display_event_date(); ?></div>
                    <div class="event-time"><?php display_event_time(); ?></div>
                    <div class="event-price"><?php display_event_price(); ?></div>
                    <br/>
                    <a href="<?php echo get_permalink(get_the_ID()); ?>" class="event-info">More Information</a>
                </div>
                <div class="event-buy">
                    <?php display_event_buy_online_url(); ?>
                </div>
            </div>
        </div>
        <?php wp_reset_postdata(); ?>
        <?php
    endwhile;
endif;

编辑

我修复了上面的代码并进行了测试.现在一切都按预期工作了.请参阅代码中的注释以修复错误

点赞