多循环问题 - 拉出1个特征并在没有它的情况下继续循环

时间:2013-09-23 23:14:31

标签: php wordpress-theming wordpress

我正在编写一个自定义多循环,用于自定义类别模板页面。循环应该将一个在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;
}

你新鲜的眼睛会有很多帮助!

谢谢!

1 个答案:

答案 0 :(得分:1)

看起来您的$post变量未通过循环分配当前发布信息。据我所知,您可以尝试以下任何一种方式:

1)全球$post

$post变量位于featured() function scope内。因此,当您运行循环时,它不会被识别为global $post变量,这是一个WordPress通过循环填充帖子信息。只需在功能范围的开头声明$postglobal变量,您就应该能够收集帖子信息:

function featured() {
    global $post;
    // ... all your function code, $post->ID should work now
}

或2)使用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变量。