我在我的插件中创建了一个短代码,效果很好。 短代码需要采用一些参数并创建一个带输出的自定义循环。
其中一个参数是输出循环的帖子数($ markers)
$args=array(
'meta_key'=>'_mykey',
'post_status'=>'publish',
'post_type'=>'post',
'orderby'=>'date',
'order'=>'DESC',
'posts_per_page'=>$markers,
);
$wp_query = new WP_Query();
$wp_query->query($args);
if ($wp_query->have_posts()) : while (($wp_query->have_posts()) ) : $wp_query->the_post();
// do the loop using get_the_id() and $post->id
endwhile;endif;
wp_reset_query();//END query
在结束时,我需要包含所有帖子($markers = '-1' )
的数据,有时只需要一个($markers = '1' )
或多个($markers = 'x')
。
所有这些都适用于单页/帖子 - 但我的问题是,当这个函数位于我有多个帖子(!is_single)和($ markers = '1'
)的地方时,它总会返回LATEST帖子的数据,而不是正确的帖子。
(例如在默认的wordpress主题中,它将显示10个帖子 - 它们都将是相同的数据)
这显然是$post->ID
的一个问题 - 但在wp循环外进行自定义循环时如何才能拥有正确的帖子ID?
我试图通过
解决问题global $post;
$thePostIDtmp = $post->ID; //get the ID before starting new query as temp id
$wp_query = new WP_Query();
$wp_query->query($args);
// Start Custom Loop
if (!is_single()){
$post_id_t = $thePostIDtmp;}
else {
$post_id_t = $post->ID;}
然后使用$post_id_t
- 但它似乎不起作用,
我应该不使用get_the_id()吗?或者我应该不使用查询(并使用get_posts)??
任何想法/解决方案/想法??
答案 0 :(得分:1)
我会使用query_posts(http://codex.wordpress.org/Function_Reference/query_posts)而不是覆盖$ wp对象。您应该可以在页面上包含任意数量的循环。如果您遇到此问题,可以在致电之前使用:http://codex.wordpress.org/Function_Reference/wp_reset_query。
我找到了这个:http://blog.cloudfour.com/wordpress-taking-the-hack-out-of-multiple-custom-loops/ 也消除了一些痛苦。
答案 1 :(得分:0)
WordPress中基本上有两种查询帖子:那些改变主循环和那些不改变主循环的帖子。如果要更改主循环(如用于显示类别归档页面的循环),请使用query_posts。它让你做到这一点。删除,更改和附加默认查询的参数以更改典型页面的结果。 query_posts虽然有一些drawbacks。
然后有一些查询只是用来从数据库中取出东西来玩游戏,例如在侧栏或当前帖子的附件中显示最新的帖子标题。
为此,创建一个新的WP_Query对象,它将独立于主循环构建自定义循环,如下所示:
// The Query
$the_query = new WP_Query( $args );
// The Loop
while ( $the_query->have_posts() ) : $the_query->the_post();
echo '<li>';
the_title();
echo '</li>';
endwhile;
// Reset Post Data
wp_reset_postdata();
然后有get_posts()就像WP_Query的小兄弟。在我看来,它有一个更简单的界面,并返回一个数组,结果更容易使用。 它看起来像这样:
$myposts = get_posts( $args );
foreach($myposts as $post) : setup_postdata($post);
echo "<li>";
the_title();
echo "</li>";
endforeach;
在foreach模板中,像get_the_id()这样的标签可以正常工作。