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数组,你可以用数组函数自由处理这个数据。掌握了这些,置顶文章就不会再让你困惑了。