WordPress检查帖子是否存在类别外循环

时间:2015-07-17 10:53:03

标签: php wordpress

所以我在我的博客中添加了一个警报部分,它只显示“警报”类别中包含的帖子的内容并且是“粘性的”。

这一切都可行。我现在想知道如何隐藏显示这些警报的包装div(如果不存在的话)。

这就是我到目前为止......

        /* This is the if statement that i'm having trouble with */
                <?php if (have_posts() && in_category('alert')) {?>
        /* Below here works fine */

<div id="alert">
        <div class="wrapper">
            <div class="close"><i class="fa fa-times"></i></div>
            <div class="ticker">
                <ul>
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post();
            if(is_sticky() && in_category('alert')) {?>
                <li>
                <strong><?php the_title(); ?> - </strong>
                <?php the_content(); ?>
                </li>
        <?php } ?>
    <?php endwhile; else: ?>
    <?php endif; ?>
                </ul>
            </div>
        </div>
    </div>

    <?php } ?>

1 个答案:

答案 0 :(得分:1)

正如我在评论中已经说过的那样,你永远不应该使用query_posts,因为它打破了主查询对象,许多插件和自定义代码都依赖于这个对象。如果您必须运行自定义查询,请使用WP_Queryget_posts

其次,您的查询无效且浪费。您目前正在查询所有粘性帖子,然后使用条件标记跳过内部循环中的帖子。所有这些都会运行不必要的db调用,从而浪费资源。

要纠正您的问题,我们会:

  • WP_Query并将no_found_rows设置为true以跳过分页,因为我们不需要分页

  • 使用ignore_sticky_posts忽略要移到前面的粘贴帖子

  • 使用cat(使用类别ID)或category_name(使用类别 slug )参数来获取特定类别的帖子

您可以尝试这样的事情:(我不打算对循环进行编码,但您需要使用自己的循环,只需记住删除条件检查,is_sticky()in_category() < / em>的)

$stickies = get_option( 'sticky_posts' );
if ( $stickies ) {
    $args = [
        'post__in' => $stickies,
        'ignore_sticky_posts' => 1,
        'no_found_rows' => true,
        'cat' => 1, // Change to correct ID
        //'category_name' => 'cat-slug',
    ];
    $q = new WP_Query( $args );
    if ( $q->have_posts() ) {
        while ( $q->have_posts() ) {
        $q->the_post();

            // YOUR LOOP

        }
        wp_reset_postdata();
    }
}

修改

我在这里滑倒了。如果没有粘贴帖子,get_option( 'sticky_posts' )将返回一个空数组。如果您将空数组传递给post__in,则会返回所有帖子。这是WP_Query类中的一个愚蠢的错误。恕我直言,一个空数组应该没有帖子。我已经将代码更新为gaurd了。