Wordpress - 页面上的多个循环

时间:2014-02-08 09:29:48

标签: php wordpress-theming wordpress

我在页面上有多个循环。第一个循环从update帖子类型获取帖子,第二个循环获取页面链接,第三个获取post帖子类型,第四个获取特定页面链接,然后有最后一个循环获取当前页面数据。即我有类似的东西:

获取更新

<?php $updates = get_posts(array('post_type' => 'update', 'post_per_page' => 4)); ?>
<?php foreach ($updates as $update): ?>
    <?php setup_postdata($update); ?>
    <li>
        <span><?php the_time(get_option('date_format')); ?></span>
        <h4><a href="<?php echo $update->guid; ?>"><?php echo get_post_meta($update->ID, 'msp_onhome_title', true); ?></a></h4>
    </li>
<?php endforeach ?>

获取news页面链接:

<?php
    $the_slug = 'news';
    $args=array(
      'name' => $the_slug,
      'post_type' => 'page',
      'post_status' => 'publish',
      'numberposts' => 1
    );
    $blog_page = get_posts($args);

    if( $blog_page ) : 
?>
    <span class="stylish-extend">
        <a href="<?php echo $blog_page[0]->guid; ?>">More News &rarr;</a></span>                                    
<?php endif; ?>

获取帖子:

<?php $color_classes = array('dark-blue', 'dark-red', 'black', 'maroone', 'light-blue'); ?>

<?php $posts = get_posts(array('post_type' => 'post', 'post_per_page' => 5)); ?>
<?php foreach ($posts as $post): ?>
    <?php setup_postdata($post); ?>
    <li>
        <article class="blog-post">
            <header>
                <p class="post-title dark-blue">
                    <a href="<?php echo $post->guid; ?>"><?php the_title(); ?></a>
                    <span>Posted in <i><?php the_category(', '); ?></i> by <i><?php the_author(); ?></i></span>
                </p>
            </header>
        </article>
    </li>
    <!-- <span><?php the_time(get_option('date_format')); ?></span> -->
<?php endforeach ?>

获取页面链接

<?php
    $the_slug = 'blog';
    $args=array(
      'name' => $the_slug,
      'post_type' => 'page',
      'post_status' => 'publish',
      'numberposts' => 1
    );
    $blog_page = get_posts($args);

    if( $blog_page ) : 
?>
        <a href="<?php echo $blog_page[0]->guid; ?>">Head to blog &raquo;</a>

<?php endif; ?>

获取实际页面内容(当前页面)

<!-- Problem here -->
<section id="meet" class="light">
    <?php if (have_posts()): while( have_posts() ) : the_post();  ?>
        <?php the_content(); ?>
    <?php endwhile; endif; ?>
</section>

问题出在这里,即它没有显示实际的页面内容。奇怪的是,当我将此循环置于最顶部位置的所有循环之上时,它会正确显示页面数据。我在每个循环之后尝试了wp_reset_query()wp_reset_post_data()(或者它是wp_reset_postdata()?)但它没有用。我尝试的另一件事是,保存变量中$wp_query的引用,执行循环然后恢复$wp_query,如下所示:

global $wp_query;
$temp_wpquery = $wp_query;

// perform all the loops and stuff

global $wp_query;
$wp_query = $temp_wpquery;

// perform the stuff

结果仍然相同。任何人都可以告诉我,我在这里做错了什么?为什么不在最后一个循环中显示当前页面数据?

4 个答案:

答案 0 :(得分:1)

你需要在$post中专门使用变量名setup_postdata()(而不是另一个变量名),否则它将不起作用。

尝试更改代码:

<?php $updates = get_posts(array('post_type' => 'update', 'post_per_page' => 4)); ?>
<?php foreach ($updates as $post): ?>
    <?php setup_postdata($post); ?>
    <li>
        <span><?php the_time(get_option('date_format')); ?></span>
        <h4><a href="<?php echo $post->guid; ?>"><?php echo get_post_meta($post->ID, 'msp_onhome_title', true); ?></a></h4>
    </li>
<?php wp_reset_query(); endforeach ?>

取决于您使用setup_postdata()的位置(例如,如果它不在主循环中,或在函数/侧边栏小部件中),您可能还需要声明 - global $post;。< / p>

答案 1 :(得分:0)

您无需保存$wp_query的参考,而是保存global $post;的参考

get_header()

之后的最顶层

插入这段代码:

global $post;
$originalpost = $post;

//.... Then
//All your awesome stuff here
//...

//Before the actual page contents
<?php $post = $originalpost; ?>

<section id="meet" class="light">
    <?php if (have_posts()): while( have_posts() ) : the_post();  ?>
        <?php the_content(); ?>
    <?php endwhile; endif; ?>
</section>

答案 2 :(得分:0)

以下内容适用于我们有条件地包含各种PHP文件,这些文件具有基于帖子标记或该页面主帖子的其他元数据的子循环。正如之前的回复建议之一,包括wp_reset_postdata()是必要的。根据您当前的设计,您应该至少在最后一次内容循环之前运行wp_reset_postdata()。

案例1:简单地引用全局$ wp_query变量。

global $wp_query;
if (have_posts()) {
    while( have_posts() ) :
        $wp_query->the_post();
        the_content();
    endwhile;
}
wp_reset_postdata();

案例2:运行其他查询

$the_query = new WP_Query( 'page_id=1369' );
while ( $the_query->have_posts() ) :
    $the_query->the_post();
        the_content();
endwhile;
wp_reset_postdata();

答案 3 :(得分:0)

对我有用的是,将$post存储在某个变量中,执行所有操作,将存储的$post值分配回$post,之后我使用setup_postdata($post)然后,不使用任何循环。就是这样。以下是示例代码:

global $post;
$temp_post = $post;

//.....
// Every thing else
//...

//Before the actual page content
<?php $post = $temp_post; ?>

<section id="meet" class="light">
    <?php setup_postdata($post); ?>
        <?php the_content(); ?>
</section>