我在页面上有多个循环。第一个循环从更新帖子类型获取帖子, 第二个循环获取页面链接, 第三个循环获取特定的页面链接, 第四个循环获取特定的页面链接, 然后最后一个循环获取当前页面数据。即我有类似以下内容:
获取更新
<
?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="http://www.srcmini.com/<
?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="http://www.srcmini.com/<
?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="http://www.srcmini.com/<
?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="http://www.srcmini.com/<
?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 stuffglobal $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="http://www.srcmini.com/<
?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【WordPress-页面上的多个循环】对我有用的是, 将$ 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>
推荐阅读
- WordPress-多站点+多种语言
- WordPress菜单消失了,现在菜单位置将不会更新
- WordPress循环以显示表格中的帖子
- WordPress-单击类别链接后按类别列出的帖子
- 带有自定义字段的WordPress列表页面
- WordPress(is_single不适用于帖子类型)
- WordPress没有创建自定义图像大小
- WordPress(是否可以始终在blog.wordpress.com的TOP上发表一篇特定文章())
- WordPress的(index.php vs home.php())