测试与特定类别匹配且不属于排除类别的帖子

时间:2009-12-01 19:27:35

标签: wordpress

我在下面有一个功能,其目的是创建一个帖子列表,其中分配给每个帖子的类别是“顶级菜单”。但是,我首先要排除任何类别为“隐藏”的帖子...

如何编辑此代码才能执行此操作?

global $post;
$cat = get_cat_ID('top-menu');
if ($cat > 1) 
  $myposts = get_posts('numberposts=5&category='.$cat);
else
  $myposts = get_posts('numberposts=10');
foreach ($myposts as $post) :
?> 
<li>
  <a href="<?php the_permalink(); ?>">
    <?php the_title(); ?>
  </a>
</li>
<?php endforeach; ?>

2 个答案:

答案 0 :(得分:2)

这应该做你想要的。不确定为什么你有if声明,所以如果你需要,请随时再次合并。您可以随时使用category并为其指定ID而不是category_name,因为我在此处使用此作为快捷方式。

$exclude_cat = get_cat_ID('hidden');
$include_cat = get_cat_ID('top-menu');

$myposts = get_posts( array(
    'numberposts'      => 5,
    'category__in'     => array( $include_cat ),
    'category__not_in' => array( $exclude_cat )
));

编辑: category_name无法与category__not_in结合使用,因此我稍微更改了代码,以便运行两个过滤器。

我已对此进行了测试,并且可以在WordPress 2.8中使用,只需确保在get_cat_ID来电中提供实际的类别名称,而不是偶然提供slug

答案 1 :(得分:1)

注意到dcneiner的修订建议有效。该查询生成此SQL

SELECT SQL_CALC_FOUND_ROWS  wp_posts.* FROM wp_posts  
INNER JOIN wp_term_relationships 
  ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_term_taxonomy 
  ON (wp_term_relationships.term_taxonomy_id = 
    wp_term_taxonomy.term_taxonomy_id)  
WHERE 1=1  
  AND wp_term_taxonomy.taxonomy = 'category'  
  AND wp_term_taxonomy.term_id IN ('3')  
  AND wp_posts.ID NOT IN 
  ( SELECT tr.object_id FROM wp_term_relationships AS tr 
    INNER JOIN wp_term_taxonomy AS tt 
      ON tr.term_taxonomy_id = tt.term_taxonomy_id 
    WHERE tt.taxonomy = 'category' 
    AND tt.term_id IN ('1') ) 
    AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' 
  OR wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 5