0

我正在编写要在自定义类别模板页面上使用的自定义多重循环。循环应该将一个在管理员中检查为特色的帖子放在一个单独的 div 中,并继续循环显示除特色之外的类别中的所有帖子。

与codex 页面上提供的示例类似,但我不想为特色帖子创建单独的类别。

我正在为将帖子设置为特色的复选框使用高级自定义字段插件。

我的代码存在以下问题: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;
}

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

谢谢!

4

1 回答 1

1

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

1) 全球$post

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

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

或 2) 使用get_the_ID()

您可以替换$post->ID为 WP 的本机功能get_the_ID()。这与之前的解决方案几乎相同,因为此函数将自动ID从全局$post对象中检索属性。我认为这是最好的解决方案,因为只要填充了对象(调用之后),就不必担心使用 post 函数(get_the_ID(),get_the_title()等)的范围。$postthe_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变量是一个本地(函数范围)变量,而不是global一个。

于 2013-09-24T05:49:21.580 回答