WordPress中如何设置/配置/显示置顶文章sticky功能详解/作用/方法/步骤

WordPress 加入了很多新特性,官方文档给出了一个列表,很多很多。其中一个新特性是”置顶文章(Sticky Posts)”,这个特性很多国人,特别是用过 PJBlog 的都不会陌生。置顶文章的作用基本固定,文章的内容是希望长时间引起读者注意,可以表明站点的简介、版权声明、友情链接的交换原则等。这一特性有很大的作 用,鉴于还没有对此特性详细介绍的文章,遂写(翻译+演绎)此文。

将文章设置为”置顶文章”

WordPress Publish Module

将视线注意在 WordPress 2.7 发布面板(Write Panel)的发布模块(publish module),点击 “Visibility: Public”旁的”Edit”链接,打开更多选项,其中有一项为”Stick this post to front page”,勾选,即将对应文章设置为”置顶文章”。

或者在文章列表页面,对相应文章进行 Quick Edit,勾选”Make this post sticky”。

在对应的位置,取消勾选便取消对文章的置顶操作。

给”置顶文章”定义样式

因为置顶文章不同于普通文章,它不是按照时间顺序出现在页面中,所以比较好的建议是为置顶的文章设置特殊的样式,以区别于其他普通文章。 WordPress 2.7 中加入了 post_class(《WordPress 2.7 中增加的新模板标签》一文有简介) 标签,会为置顶文章加入”sticky”的 class,所以设置置顶文章的样式很简便。

.sticky{

background:#000;

border:1px solid #F00;

}

类似 PJBlog 的置顶文章设置是个不错的选择,普通状态下隐藏文章内容,点击标题链接后显示内容。这样的效果通过 jQuery 是很容易实现的,有兴趣的可以试试。

is_sticky()

除了通过 post_class 识别置顶文章外,还可以通过 is_sticky() 查看文章是否为置顶文章。一个小例子,在主循环中使用。

<?php

if(is_sticky()) echo ‘This is a sticky post!’;

?>

is_sticky() 返回布尔值(TRUE 或 FALSE),取决于文章是否为置顶文章。

获取全部置顶文章的自定义循环 (Custom Loop)

如果你想获取全部置顶文章,可以使用 Otto 提供的方法:

query_posts(array(‘post__in’=>get_option(‘sticky_posts’)));

这段代码在循环之前使用,限定循环只返回标识为”sticky”的文章。当然你仍然可以结合其他的 query_posts 参数做进一步限定。

忽略置顶文章的自定义循环 (Custom Loop)

一般而言,置顶文章会出现在主页模板的每一个循环中,所以使用多循环(multiple loops)的模板就会出现多个相同的置顶文章。更糟糕的是,似乎 query_posts 的 post__not_in 参数在忽略置顶文章时不起作用了。不管你怎么做,置顶文章始终会出现。

幸好 Otto 及时的出现,并给出了解决方案。如果你要把置顶文章从某个循环中忽略,在该循环开始前加入下面的代码:
query_posts(‘caller_get_posts=1′);
同样地,可以结合 query_posts 的其他参数做进一步限定。事实上,这个参数并不会忽略被标记为”sticky”的文章,而是将置顶状态给忽略了。

完全禁用”置顶文章”

看到现在,如果你的头有些大了,发现置顶文章的操作这么复杂,而决定放弃使用这一特性,那么就永远也别勾选那个让人头大的选项,或者做的更绝,将置顶特性完全禁用,只需一步,将以下代码写入主题的 functions.php

update_option(‘sticky_posts’, array());

置顶文章是wp2.7引进的一个功能,具体作用如名称“置顶”。由于设置方便,样式多样并且合乎很多人的偏好,所以用处比较大。昨天折腾的时候想添加一个功能:首页的顶部框框里滚动显示置顶文章,首页内容区隐藏置顶文章。解决办法可以用 is_sticky() 判断或者 query(...) 来输出。

但是在具体实施过程中遇到了三个问题:

  • 不显示置顶文章则每页文章有多有少,看着不爽。
  • 前一页、后一页功能失效。
  • archive等归档页面失效。

一、首先可以肯定,直接判定 !is_sticky() 就输出的办法是可行的。但是分页依旧按照原来的,比如第一页的9篇文章中有4篇置顶的,除去置顶文章,第一页就只显示4篇文章,对于边栏内容比较丰富的同学们,主要内容部分必然会空出一大片。

二、其次,用 query_posts() 可以吗?当然,这也是官方给出的解决方案。只需按需要在while(…)前加入

$paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : 1;
$sticky = get_option( 'sticky_posts' );
$args = array(
	'ignore_sticky_posts' => 1,//忽略sticky_posts,不置顶,但是输出
                                   //置顶文章
	'post__not_in' => $sticky,//排除置顶文章,不输出
	'paged' => $paged
);
query_posts( $args );

这里遇到了一个问题,由于这个主题脱胎于twenty ten,所以文章列表显示用的是loop.php文件,稍微看看可以知道,所有需要列表文章的地方全是在这一个文件中实现的,所以在这里面改明显是不行 的,直接影响的是所有页面。所以最后的解决办法还是在index.php里面的 get_template_part( 'loop', 'index' ); 的前面加入上述的语句,后面记得 wp_reset_query(); 以防不测。

三、附上只输出置顶文章的解决办法:

/* 获取所有置顶文章 */
$sticky = get_option( 'sticky_posts' );
/* 对这些文章排序, 日期最新的在最上 */
rsort( $sticky ); /* 获取5篇文章 */
$sticky = array_slice( $sticky, 0, 5 );
/* 输出这些文章 */
query_posts( array( 'post__in' => $sticky,
                  'ignore_sticky_posts' => 1 ) );
while ( have_posts() ) : the_post();  
/* 输出内容 */
endwhile;
wp_reset_query();