【问题标题】:How to separate WordPress posts loop in to two columns?如何将 WordPress 帖子循环分成两列?
【发布时间】:2016-03-31 20:54:28
【问题描述】:

我需要将 WordPress 帖子循环分成左右两列。

目前我正在使用 2 个单独的循环来执行此操作,但如果可能的话,我想使用一个。

<div class="left-side">
    <?php 
        $row_start = 1; 
        while ( have_posts() ) : the_post(); 
            if( $row_start % 2  != 0) {// odd
                get_template_part( 'blog','item');
            }
            ++$row_start; 
        endwhile;
    ?>
</div>
<div class="right-side">
    <?php  
      $row_start = 1; 
       while ( have_posts() ) : the_post(); 
        if( $row_start % 2 == 0) {// even
            get_template_part( 'blog','item');
        }
        ++$row_start; 
        endwhile;
    ?>
</div>

感谢任何帮助!

【问题讨论】:

  • 那不行,只要你直接输出内容。您需要先将内容组装到两个字符串变量中,然后在循环后输出。
  • @CBroe 知道我将如何通过 WP 编码标准来做到这一点吗?
  • 我不知道有任何内置函数可以将模板调用的结果放入变量中,但可以使用输出缓冲来完成,请参阅stackoverflow.com/questions/5817726/…
  • 你为什么要牺牲可读性和易于理解的代码来换取你最终会得到的一团意大利面条?
  • @Luke,我认为有比我现在拥有的更好、更清洁的方式。

标签: php wordpress while-loop


【解决方案1】:

将循环移动到单独的模板文件中。

在你的主题目录中创建两个文件,一个名为posts-odd.php,另一个名为posts-even.php,并分别添加post循环,即:

posts-odd.php:

<?php 
    $row_start = 1; 
    while ( have_posts() ) : the_post(); 
        if( $row_start % 2  != 0) {// odd
            get_template_part( 'blog','item');
        }
        ++$row_start; 
    endwhile;
?>

posts-even.php:

<?php  
  $row_start = 1; 
   while ( have_posts() ) : the_post(); 
    if( $row_start % 2 == 0) {// even
        get_template_part( 'blog','item');
    }
    ++$row_start; 
    endwhile;
?>

在您的主模板中,您现在可以使用get_template_part 函数将部分模板包含到您的主模板中:

<div class="left-side">
    <?php get_template_part('posts', 'odd') ?>
</div>
<div class="right-side">
    <?php get_template_part('posts', 'even') ?>
</div>

如果您在不同的地方显示奇数和偶数帖子,这将使您只需定义一次循环模板即可。

https://developer.wordpress.org/reference/functions/get_template_part/

【讨论】:

  • 现在我完全错过了! thnx 考虑一下。它不会将它们放在一个中,但它看起来比 2 个悬空的循环更好,并且可以在短代码中重复使用。
【解决方案2】:

不容易,但可能。

<?php

$i = 0;
$column = array();
$column[1] = $column[2] = '';

if (have_posts()) :
    while (have_posts()) :
        the_post();

        $i++;

        $column[$i] .= '<div class="'.esc_attr(implode(' ', get_post_class())) .'">';

            $column[$i] .= '<div class="post_inner">
                            '.get_the_content().'
                            </div>
                        </div>';

        $i = ($i==2) ? 0 : $i;

    endwhile; ?>

    <div id="grid_posts">
        <div class="span6"><?php echo $column[1]?></div>
        <div class="span6"><?php echo $column[2]?></div>
    </div>

<?php else: ?>
    <p><?php esc_html_e('No posts were found. Sorry!', 'mytheme'); ?></p>
<?php endif; ?>

基本上,您创建 columns 数组并将您的内容放在两个键(1 和 2)中,每 2 个帖子放在一列中,并不断将计数器增加到 2 并在达到 2 时将其重置。所以你不断用帖子填充数组 - 首先是键 1,然后是键 2,依此类推。

然后您只需将这两个输出到 2 列(在我的情况下为span6)。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多