所以我在我的博客中添加了一个警报部分,它只显示“警报”类别中包含的帖子的内容并且是“粘性的”。
这一切都可行。我现在想知道如何隐藏显示这些警报的包装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 } ?>
答案 0 :(得分:1)
正如我在评论中已经说过的那样,你永远不应该使用query_posts
,因为它打破了主查询对象,许多插件和自定义代码都依赖于这个对象。如果您必须运行自定义查询,请使用WP_Query
或get_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了。