我正在编写一个自定义多循环,用于自定义类别模板页面。循环应该将一个在admin中显示为特色的帖子放在一个单独的div中,并继续循环显示除特色之外的所有类别的帖子。
与codex page上提供的示例类似,但我不想为精选帖子创建单独的类别。
我正在使用Advanced Custom Fields插件来设置帖子为精选的复选框。
我的代码存在以下问题:if ($post->ID == $do_not_duplicate) continue;
阻止执行其余循环。下面的代码只是提取最新的精选帖子。
这是我的功能:
function featured() {
$featured = new WP_Query(array(
'meta_query' => array(
array(
'key' => 'featured',
'value' => '"top"',
'compare' => 'LIKE'
)
),
'posts_per_page' => 1
));
while ( $featured->have_posts() ) : $featured -> the_post();
$do_not_duplicate = $post->ID; ?>
<div id="featured">
//featured post
</div><!-- end #featured -->
<?php
endwhile;
if(have_posts()) : while (have_posts()) : the_post();
if ($post->ID == $do_not_duplicate) continue;
?>
<div class="container">
// normal posts
</div><!-- .charities-container -->
<?php
endwhile;
endif;
}
你新鲜的眼睛会有很多帮助!
谢谢!
答案 0 :(得分:1)
看起来您的$post
变量未通过循环分配当前发布信息。据我所知,您可以尝试以下任何一种方式:
$post
$post
变量位于featured()
function scope内。因此,当您运行循环时,它不会被识别为global $post
变量,这是一个WordPress通过循环填充帖子信息。只需在功能范围的开头声明$post
为global
变量,您就应该能够收集帖子信息:
function featured() {
global $post;
// ... all your function code, $post->ID should work now
}
get_the_ID()
您可以替换WP的本机函数$post->ID
get_the_ID()
。这与前一个解决方案大致相同,因为此函数将自动从全局ID
对象中检索$post
属性。我认为这是最好的解决方案,因为只要填充get_the_ID()
对象,只要使用post函数(get_the_title()
,$post
等)就不必担心范围(在调用the_post()
之后)。
所以你可以替换这一行:
$do_not_duplicate = $post->ID;
的
$do_not_duplicate = get_the_ID();
和
if ($post->ID == $do_not_duplicate) continue;
的
if (get_the_ID() == $do_not_duplicate) continue;
尝试其中一种解决方案,我敢打赌它们都适合你。实际上,您从codex页面获取的示例工作正常,问题是您将其应用于本地function
。这样,您的$post
变量就是本地(function scope)变量,而不是global
变量。