【问题标题】:How to loop a while statement in PHP displaying WordPress posts?如何在 PHP 中循环显示 WordPress 帖子的 while 语句?
【发布时间】:2019-08-23 15:14:21
【问题描述】:

我创建了一个 PHP while 语句,它以特定布局显示来自 WordPress 的 8 个帖子。现在我想继续运行这个循环,直到显示所有帖子。所以我所做的是创建了一个名为 posts_displayed 的变量,我使用它来设置 post_offset 并在每次显示帖子时递增它。原始代码按预期工作,但是当我在它周围添加额外的 while 语句时,没有显示任何帖子。

我已经更新了代码,使得有一个主查询和循环,其中包含四个不同的查询和循环。我现在遇到的问题是在第 131 行,在那里我遇到了意外的 endwhile 错误。

    <?php $posts_displayed = 0; ?>

<?php 
   $main_query = new WP_Query( array(
     'category_name' => 'Travel',
   )); 
?>

<?php if ( $main_query->have_posts() ) : ?>
  <?php while ( $posts_displayed < ($main_query->post_count)  ) ?>

<?php 
   $first_query = new WP_Query( array(
     'category_name' => 'Travel',
      'posts_per_page' => 2,
      'offset' => $posts_displayed,
   )); 
?>

<div class="row row__padding--bottom homepage__row--one">

<?php if ( $first_query->have_posts() ) : ?>
  <?php while ( $first_query->have_posts() ) : $first_query->the_post(); ?>

    <div class="col-sm-12 col-md-6">
        <div class="journal__latest" style="background: url(<?php echo get_the_post_thumbnail_url( $post_id, 'large' ); ?>) !important; background-size: cover !important; background-position: center center !important; background-repeat: no-repeat !important;">

        </div>
        <div class="post__info--container">
          <a href="<?php echo esc_url( get_permalink()); ?>"><h4><?php the_title(); ?></h4></a>
        </div>
   </div>

  <?php endwhile; ?>
  <?php wp_reset_postdata(); ?>

<?php endif; ?>

</div>

<?php 
   $second_query = new WP_Query( array(
     'category_name' => 'Travel',
      'posts_per_page' => 3,
       'offset' => posts_displayed,
   )); 
?>

<div class="row row__padding--bottom">

<?php if ( $second_query->have_posts() ) : ?>
  <?php while ( $second_query->have_posts() ) : $second_query->the_post(); ?>


    <div class="col-12 col-md-4">
        <div class="portfolio__featured" style="background: url(<?php echo get_the_post_thumbnail_url( $post_id, 'large' ); ?>) !important; !important; background-size: cover !important; background-position: center center !important; background-repeat: no-repeat !important;">

        </div>
        <div class="post__info--container">
          <a href="<?php echo esc_url( get_permalink()); ?>"><h4><?php the_title(); ?></h4></a>
       </div>
    </div>

  <?php endwhile; ?>
  <?php wp_reset_postdata(); ?>

<?php endif; ?>

</div>

<?php 
   // the query
   $third_query = new WP_Query( array(
     'category_name' => 'Travel',
      'posts_per_page' => 1,
     'offset' => posts_displayed,
   )); 
?>

<div class="row row__padding--bottom">

<?php if ( $third_query->have_posts() ) : ?>
  <?php while ( $third_query->have_posts() ) : $third_query->the_post(); ?>

    <div class="col-12">
        <div class="journal__featured" style="background: url(<?php echo get_the_post_thumbnail_url( $post_id, 'large' ); ?>) !important; !important; background-size: cover !important; background-position: center center !important; background-repeat: no-repeat !important;">

        </div>
        <div class="post__info--container">
            <a href="<?php echo esc_url( get_permalink()); ?>"><h4><?php the_title(); ?></h4></a>
        </div>
    </div>

  <?php endwhile; ?>
  <?php wp_reset_postdata(); ?>

<?php endif; ?>

</div>

<?php 
   // the query
   $fourth_query = new WP_Query( array(
     'category_name' => 'Travel',
      'posts_per_page' => 2,
     'offset' => posts_displayed,
   )); 
?>

<div class="row row__padding--bottom">

<?php if ( $fourth_query->have_posts() ) : ?>
  <?php while ( $fourth_query->have_posts() ) : $fourth_query->the_post(); ?>

    <div class="col-sm-12 col-md-6">
        <div class="journal__featured" style="background: url(<?php echo get_the_post_thumbnail_url( $post_id, 'large' ); ?>) !important; !important; background-size: cover !important; background-position: center center !important; background-repeat: no-repeat !important;">

        </div>
        <div class="post__info--container">
            <a href="<?php echo esc_url( get_permalink()); ?>"><h4><?php the_title(); ?></h4></a>
        </div>
    </div>

  <?php endwhile; ?>
  <?php wp_reset_postdata(); ?>

<?php endif; ?>

</div>

<?php endwhile; ?>

<?php else : ?>
  <p><?php __('No News'); ?></p>
<?php endif; ?>

【问题讨论】:

  • 为什么要查询数据库这么多次?为什么不对所有帖子查询一次,然后将它们排列成您想要的布局?我认为这会使代码更具可读性。
  • @muka.gergely 如果我只查询一次,那我怎么能以某种方式显示 2 个帖子,然后以某种方式显示 3 个帖子,等等?
  • 只需遍历 $the_query 变量中的数组,并按照您所见排列项目(每个项目都是 post)适合。
  • @muka.gergely 我明白了,我只是不知道如何安排它,使前两个排成一排,然后排成三排,依此类推。然后一旦8的模式完成,然后重新开始

标签: php html wordpress


【解决方案1】:

我发现您的代码存在一些问题。首先在你的第一个 if

if ( $the_query->have_posts() )

$the_query 仍然未定义,因此它没有帖子,您在下面的几行代码中将 $the_query 定义为 WP_Query 类的实例。

其次,您有条件地调用wp_reset_postdata(),这意味着如果查询没有帖子,则帖子数据不会被重置。

当然,您查询数据库的次数太多了,我不明白您为什么需要它。

我做了一些快速更正(注意下面的代码未经测试,我只是应用了我能想到的快速解决方案)

<?php
$the_query = new WP_Query(
    array(
        'category_name'  => 'Travel',
        'posts_per_page' => 64,
    )
);
?>
<div class="row row__padding--bottom">
    <?php
    if ( $the_query->have_posts() ) :
        $i         = 0;
        $class_map = [
            0 => 'col-md-6',
            1 => 'col-md-6',
            6 => 'col-md-6',
            7 => 'col-md-6',
            2 => 'col-md-4',
            3 => 'col-md-4',
            4 => 'col-md-4',
            5 => 'col-md-12',
        ];
        while ( $the_query->have_posts() ) :
            $the_query->the_post();
            ?>
            <div class="col-sm-12 <?php echo esc_attr( $class_map[ $i % 8 ] ); ?>">
                <div class="journal__featured" style="background: url(<?php the_post_thumbnail_url( 'large' ); ?>) !important; !important; background-size: cover !important; background-position: center center !important; background-repeat: no-repeat !important;">
                </div>
                <div class="post__info--container">
                    <a href="<?php the_permalink(); ?>"><h4><?php the_title(); ?></h4></a>
                </div>
            </div>
            <?php
            if ( 1 === ($i % 8) || 4 === ($i % 8) || 5 === ($i % 8) ) {
                echo '</div><div class="row row__padding--bottom">';
            }
            $i++;
        endwhile;
    else :
        echo '<p>' . esc_html( __( 'No News' ) ) . '</p>';
    endif;
    wp_reset_postdata();
    ?>
</div>
<?php

希望它对你有用!

干杯!

【讨论】:

  • 感谢您帮助我!几乎完美地工作,我只想删除每页部分的帖子,以便它显示所有帖子。当我这样做时,前 8 个之后的所有帖子都有“col-md-12”类。所以我认为我需要每 8 次迭代重置 i 变量?
  • 如果你想这样做,即使我不推荐它(在某些情况下我们可能会谈论数千个帖子),你可以设置 'posts_per_page' => -1 然后替换输出像这样的类 然后在 if 语句中 if ( 1 === $i % 8 || .... )
  • 好点,所以我将posts_per_page设置为64,然后实施您的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2015-02-15
  • 2018-09-02
  • 2021-05-05
  • 2017-03-09
相关资源
最近更新 更多