问题描述
我试图使用嵌套循环与帖子来发布插件。循环都有效,但问题出现在第二个嵌套循环 ($ issue) 之后。我想再次访问 $ publication 循环,但数据仍然是 $ issue 数据。
wp_reset_query()
将重新设置为 single.php 中不需要的主循环。
我可以使用 get_posts()
而不是新的 WP_Query,但我想要能够使用 get_template_part()
。
如何将数据重新设置回发布循环,以便第二个’Publication title’ 返回发布,而不是问题的标题?
这是我在 one.php 中的代码:
$publication = new WP_Query( array(
'connected_type' => 'publication_to_post',
'connected_items' => $post->ID,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
echo '<h2>Publication title = '.get_the_title().'</h2>';
$pub_id = get_the_ID();
$issue = new WP_Query( array(
'connected_type' => 'publication_to_issue',
'connected_items' => $pub_id,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $issue->have_posts() ) {
while ( $issue->have_posts() ) : $issue->the_post();
// need to be able to use template parts in here
echo '<h2>Issue title = '.get_the_title().'</h2>';
endwhile;
}
// This currently returns the issue title, not the publication title
echo '<h2>Publication title = '.get_the_title().'</h2>';
endwhile;
}
最佳解决方案
我会自己回答这个问题,但是这是为我解决这个问题的人民法典中非常聪明的 @simonwheatley 。
而不是使用 wp_reset_postdata()
或 wp_reset_query()
,您可以使用以下内容:
$publication->reset_postdata();
其中 $ publication 是您的查询对象。
工作代码现在看起来像:
$publication = new WP_Query( array(
'connected_type' => 'publication_to_post',
'connected_items' => $post->ID,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
echo '<h2>Publication title = '.get_the_title().'</h2>';
$pub_id = get_the_ID();
$issue = new WP_Query( array(
'connected_type' => 'publication_to_issue',
'connected_items' => $pub_id,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $issue->have_posts() ) {
while ( $issue->have_posts() ) : $issue->the_post();
// need to be able to use template parts in here
echo '<h2>Issue title = '.get_the_title().'</h2>';
endwhile; $publication->reset_postdata();
}
echo '<h2>Publication title = '.get_the_title().'</h2>';
endwhile;
}
次佳解决方案
首先,我认为可以使用 get_posts()
与 setup_postdata()
组合使用。通过这些,您可以像普通的 WordPress 循环一样使用模板标签。
但是你也可以在你的嵌套循环中使用这个功能:
# make sure $post is the global in your scope (which should be the case in single.php)
global $post;
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
echo '<h2>Publication title = '.get_the_title().'</h2>';
$pub_id = get_the_ID();
# preserve the current post in the higher loop
$preserve_post = get_post();
$issue = new WP_Query( array(
'connected_type' => 'publication_to_issue',
'connected_items' => $pub_id,
'fields' => 'ids',
'posts_per_page' => 1,
) );
if ( $issue->have_posts() ) {
while ( $issue->have_posts() ) : $issue->the_post();
// need to be able to use template parts in here
echo '<h2>Issue title = '.get_the_title().'</h2>';
endwhile;
}
# set the global back to your first loop post
$post = $preserve_post;
setup_postdata( $post );
// This currently returns the issue title, not the publication title
echo '<h2>Publication title = '.get_the_title().'</h2>';
endwhile;
}
wp_reset_query();
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。