WordPress Sticky Posts 完全指南
在WordPress主题开发中,置顶文章是一个基础但容易让人困惑的功能。很多初学者在接触WP_Query时,会被ignore_sticky_posts参数搞晕,更别提如何优雅地处理置顶文章与常规文章的关系了。其实这个功能的设计初衷很简单:让某些重要内容始终出现在首页显眼的位置。但它与自定义文章类型、分类页面、分页逻辑的交互,却藏着不少细节。这篇文章会从基本的操作开始,逐步深入到WP_Query的各种参数组合,帮你理清置顶文章的正确使用方式,避免踩坑。
什么是置顶文章
置顶文章是WordPress内置文章类型(post)的一个标记功能。被标记的文章会固定在博客首页(is_home())的文章列表前面,不受发布时间的影响。这个功能不适用于页面(page)或自定义文章类型(如product、portfolio等)。
如何设置置顶文章
在WordPress后台的文章编辑页面,右侧边栏找到“发布”元框,点击“可见性”旁边的“编辑”链接,勾选“将本文置于首页顶部”选项,保存即可。
在主题中控制置顶文章的显示
WordPress通过WP_Query类来处理文章查询,置顶文章的控制主要通过以下几个参数实现:
post__in:指定需要查询的文章ID列表post__not_in:排除指定ID的文章ignore_sticky_posts:是否忽略置顶标记(值为1时忽略)
只显示一篇置顶文章
下面的代码会获取一篇置顶文章并显示,如果没有置顶文章,则显示新发布的一篇:
php
$args = array(
'posts_per_page' => 1,
'post__in' => get_option('sticky_posts'),
'ignore_sticky_posts' => 1,
);
$query = new WP_Query($args);
get_option('sticky_posts')返回一个包含所有置顶文章ID的数组,数组顺序是按照置顶时间排序的(新的在前)。
如果你希望在没有置顶文章时不显示任何内容,可以在循环前加一个判断:
php
$sticky_ids = get_option('sticky_posts');
if (!empty($sticky_ids)) {
$args = array(
'posts_per_page' => 1,
'post__in' => $sticky_ids,
'ignore_sticky_posts' => 1,
);
$query = new WP_Query($args);
// 循环输出文章
}
在首页主循环中排除所有置顶文章
如果你不想在首页显示任何置顶文章,可以使用post__not_in参数:
php
$args = array(
'post__not_in' => get_option('sticky_posts'),
);
$query = new WP_Query($args);
在特定分类中处理置顶文章
假设你需要在某个分类页面显示文章,但希望置顶文章按照自然顺序(如发布日期)排列,而不是强行置顶:
php
$args = array(
'ignore_sticky_posts' => 1,
'posts_per_page' => 3,
'cat' => 6,
);
$query = new WP_Query($args);
这里的ignore_sticky_posts设置为1,表示忽略置顶标记,所有文章按正常排序规则显示。
如果你希望在分类页面中彻底排除置顶文章(连自然位置都不显示):
php
$args = array(
'cat' => 3,
'ignore_sticky_posts' => 1,
'post__not_in' => get_option('sticky_posts'),
'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
);
$query = new WP_Query($args);
注意paged参数的用法:如果这个查询放在一个静态首页模板中,需要改用get_query_var('page')。
获取新的5篇置顶文章
php
$sticky_ids = get_option('sticky_posts');
rsort($sticky_ids); // 按ID倒序,新的在前
$top_five = array_slice($sticky_ids, 0, 5);
$args = array(
'post__in' => $top_five,
'ignore_sticky_posts' => 1,
);
$query = new WP_Query($args);
rsort()函数将数组按降序排列,因为置顶文章ID越大通常表示越新发布。
为置顶文章添加专属样式
WordPress的post_class()函数会自动为置顶文章添加一个名为sticky的CSS类。在主题模板中,可以这样使用:
php
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<!-- 文章内容 -->
</article>
然后通过CSS来定义样式:
css
.sticky {
background: #f9f9f9;
border-left: 4px solid #0073aa;
padding: 1.5em;
}
注意:sticky类只在首页一页(is_home()为true且is_paged()为false)时才会添加,这是WordPress的设计决定。
常见问题
置顶文章在自定义首页模板中不生效?
如果你将某个页面设置为静态首页(Settings > Reading > Front page),置顶文章默认不会显示。需要在WP_Query中显式传入post__in参数来获取置顶文章。
置顶文章在分类归档页面无效?
置顶功能默认只作用于博客首页。在分类、标签等归档页面中,置顶文章不会自动置顶,但也不会被排除,它们会按正常排序出现在列表中。
如何让置顶文章在自定义查询中正常工作?
在自定义WP_Query中,只有显式设置了post__in并传入置顶文章ID,同时将ignore_sticky_posts设为1,才能精确控制置顶文章的显示。
总结
置顶文章功能的核心在于理解WP_Query的三个参数:post__in用于指定文章集合,post__not_in用于排除,ignore_sticky_posts决定是否保留置顶行为。常规首页查询中置顶会自动生效,但在自定义查询中需要手动控制。记住一点:get_option('sticky_posts')获取的是ID数组,你可以用数组函数自由处理这个数据。掌握了这些,置顶文章就不会再让你困惑了。