我有这个类别,它是“社区帖子”,我不希望它出现在我的主页循环中,所以我将它添加到我的查询中
<?php query_posts(array('showposts' => 4,'category__not_in' => $id_communityposts,));?>
这对我来说工作正常,但我希望一些“社区帖子”出现在主页循环中。 (异常(exception))
所以我只想排除具有一个类别的帖子作为“社区帖子”,如果它有这个类别并且更多它正常显示。
最佳答案
第一件事do not use query_posts - 永远不要使用它,因为它会改变主查询。请改用 get_posts
- 它更安全并且执行相同的任务。
为了回答您的问题,让我们首先想象一下查询在 SQL 中的样子(假设您的 $id_communityposts
等于 2):
SELECT DISTINCT wp_posts.*
FROM wp_posts, wp_postmeta
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
LEFT JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
WHERE
wp_posts.ID = wp_postmeta.post_id AND
(
(wp_term_taxonomy.taxonomy = 'category' AND wp_term_taxonomy.term_id NOT IN(2))
OR
(wp_postmeta.meta_key = 'featured' AND wp_postmeta.meta_value = 1)
)
ORDER BY wp_posts.post_date DESC
LIMIT 4
因此我们查询帖子、帖子元和分类表并制定两个可能的条件:
- 类别 ID 不是 2,OR
- 帖子的
featured
元键设置为1
(根据您存储“特色”信息的方式将其更改为任何键/值)。<
对于那种特定情况,get_posts
并不是很好用 - 使用 WPDB
查询数据库会给你更多的灵 active 。
$posts = $wpdb->get_results(
"SELECT DISTINCT $wpdb->posts.*
FROM $wpdb->posts, $wpdb->postmeta
LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE
$wpdb->posts.ID = $wpdb->postmeta.post_id AND
(
($wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id NOT IN(2))
OR
($wpdb->postmeta.meta_key = 'featured' AND $wpdb->postmeta.meta_value = 1)
)
ORDER BY $wpdb->posts.post_date DESC
LIMIT 4"
);
如果您遇到任何问题请告诉我,因为这是一个未经测试的查询。
关于如果只有一个特定类别,则 wordpress 从循环中排除帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32696748/