我在页面上有多个循环。第一个循环从更新帖子类型获取帖子, 第二个循环获取页面链接, 第三个循环获取特定的页面链接, 第四个循环获取特定的页面链接, 然后最后一个循环获取当前页面数据。即我有类似以下内容:
获取更新
<?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 ?> 获取新闻页面链接:
<?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 →</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 »</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 结果仍然相同。有人可以告诉我我在做什么错吗?为什么在最后一个循环中不显示当前页面数据?
#1
你需要在setup_postdata()中专门使用变量名$ post(而不是其他变量名), 否则它将无法工作。
尝试像这样更改代码:
<?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()的位置(例如, 如果它不在主循环或函数/边栏小部件中), 则可能还需要声明-全局$ post;。 。
#2
你无需保存$ wp_query的引用, 而是保存全局$ 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> #3
当有条件地包含具有子循环的各种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(); #4
对我有用的是, 将$ 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>
srcmini
评论前必须登录!
注册