【问题标题】:PHP loop ignore output if before today如果在今天之前,PHP 循环会忽略输出
【发布时间】:2014-03-04 12:56:52
【问题描述】:

我创建了一个循环来显示在 Wordpress 主题中创建的课程(自定义帖子类型)。但是,这个循环也会显示今天之前举行的课程,这就是为什么我在$date_start 上添加了一个检查,如果日期早于今天,则将日期替换为Ingen kommende kurser

但是,我想要的是它完全忽略今天之前具有date_start 的实例。现在发生的情况如下:

如果日期在今天之前,它将被替换为Ingen kommende kurser(没有未来的课程)。如果显示的三个课程之一,则输出如下:

  • Ingen kommende kurser
  • Ingen kommende kurser
  • 星期四。 2014 年 3 月 6 日

我需要的是完全忽略今天之前的日期,因为它可能是 3 月 6 日之后的课程,现在不会显示。

这是循环:

$loop = new WP_Query( $args );
while ( $loop->have_posts() ) {
    $loop->the_post();
    $category_course = get_the_category(2);
    $cat_slug_course = $category_course[0]->slug;
    $date_start = get_post_meta(get_the_ID(), 'date_start', true);
    $date_start = date("D, M d, Y", $date_start);
    if( strtotime($date_start) > strtotime('now') ) { ?>
        <li>                            
            <a href="<?php the_permalink(); ?>" class="date_fp"><?php echo $date_start; ?></a>
        </li>
    <?php } else { ?>
        <li>                            
            Ingen kommende kurser
        </li>
    <?php }
}   ?>

结果:

所以,简而言之:

如果date_start 在今天之前,则忽略循环中的数据。当根本没有数据显示时(当所有date_starts 都在今天之前),它应该显示Ingen kommende kurser

【问题讨论】:

  • 所以如果我做对了,它应该显示所有日期,或者如果根本没有日期,显示Ingen kommende kurser?

标签: php wordpress loops


【解决方案1】:

在你之前,设置一个标志:

$empty = true;

在循环内部,在if 语句之后,将标志设置为false:

    if( strtotime($date_start) > strtotime('today') ) { ?>
        <li>                            
            <a href="<?php the_permalink(); ?>" class="date_fp"><?php echo $date_start; ?></a>
        </li>
    <?php $empty = false; }

删除整个else 部分,然后在最后检查您的标志

}
if($empty) { ?>
    <li>                            
        Ingen kommende kurser
    </li>
<?php } ?>

首先确定列表为空。然后在循环中,如果某项有效并出现在列表中,则将空标志设置为false,以标记列表不再为空。检查所有条目后,如果列表仍然为空,则包含您的默认空列表条目。

编辑
我刚刚看到您对另一个答案的评论。您可以轻松地调整标志以用作计数器。只需将其声明为$items = 0;,然后在if 中,使用$items++; 而不是$empty = false;,最后检查if($items==0)。此外,您的循环条件应扩展为while( $loop-&gt;have_posts() AND $items &lt; 3 )

【讨论】:

  • 爱它! :D 我更像是一个前端开发人员,所以这有点超出我的舒适区,哈哈!
【解决方案2】:

只需检查今天之前或之后的日期(无论您想要什么),就像您已经在做的那样,并使用 php 中的 continue keyword 来跳过该迭代。

【讨论】:

  • 这部分工作,但我猜 Wordpress 是这里的罪魁祸首:它通过循环运行了三遍,之后它就停止了。 Continue 有效,但输出只有一个日期(因为三个实例中只有一个在今天之后)。我需要的是今天之后的所有日期,最多三个,所以我想我必须把它塞进 PHP 循环,而不是 WP_Query。编辑:我从$args 中删除了“posts_per_page”要求,这部分解决了它。现在只需要弄清楚最大 3 个。
  • 只需使用计数器并数到 3,当它达到 3 时,您可以使用 break 打破循环。
【解决方案3】:

试试这个:

$loop = new WP_Query( $args );
while ( $loop->have_posts() ) {
    $loop->the_post();
    $category_course = get_the_category(2);
    $cat_slug_course = $category_course[0]->slug;
    $date_start = get_post_meta(get_the_ID(), 'date_start', true);
    if( strtotime($date_start) > strtotime('today') ) { ?>
        <li>                            
            <a href="<?php the_permalink(); ?>" class="date_fp"><?php echo $date_start; ?></a>
        </li>
    <?php } else { ?>
        <li>                            
            Ingen kommende kurser
        </li>
    <?php }
    }   ?>

【讨论】:

  • 这只是减去日期格式转换,这有什么帮助?
  • 这只是用“Ingen kommende kurser”替换所有实例。你能解释一下它应该做什么吗?
  • @Rvervuur​​t strtotime('now') 返回当前时间的时间戳,而 strtotime('today') 返回今天“0:00”的时间戳。
  • 我不懂丹麦语,也不知道“Ingen kommende kurser”的意思。并感谢您的反对!
  • 为了记录,我没有投反对票。但问题是(我相信即使您不知道字符串的含义,问题也很清楚)他希望根本不显示日期错误的项目。仅当根本没有项目出现时才应该显示替换字符串。您的回答删除了日期格式转换并与今天而不是现在进行比较,这对这个问题完全没有任何作用。
猜你喜欢
  • 1970-01-01
  • 2014-09-04
  • 2021-12-05
  • 2010-11-09
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
相关资源
最近更新 更多