风彦疯语-杜风彦的博客 风彦疯语-杜风彦的博客
  • 首页
  • 技术交流
    • 网络技术
    • 微博微信
  • 经验分享
    • 文化交流
    • 语言学习
    • 音乐旅途
    • 生活杂谈
  • 旅游旅行
    • 单车旅行
    • 旅行故事
    • 旅途随笔
  • 摄影交流
    • 摄影练习
  • 专题汇总
    • 纪录短片创作
    • 环球骑行
    • 四国遍路
    • 看非洲
  • 媒体报道
    • 杜风彦简介
  • 投稿
  • 动态
首页 › 技术交流 › WordPress让分类/标签等存档页也能置顶文章
  • 0
  • 0

WordPress让分类/标签等存档页也能置顶文章

杜风彦
2014-05-08 9:52:51

WordPress有原生的文章置顶功能,不过只支持在首页让置顶文章在顶部显示,其他如分类页、标签页、作者页和日期页等存档页面,就没法让置顶文章在顶部显示了,只能按默认的顺序显示。有很多网友早前向我问过怎么解决这样的问题,当时查阅了一些资料没有解决就被搁置了。现在参考wp-includes/query.php中首页置顶的代码,稍微修改一下,可以让分类页、标签页、作者页和日期页等存档页面也能像首页一样在顶部显示其范围内的置顶文章。把下面的代码放到当前主题下的functions.php中就可以了:

[cc lang="php"]
add_filter('the_posts', 'putStickyOnTop' );
function putStickyOnTop( $posts ) {
if(is_home() || !is_main_query() || !is_archive())
return $posts;

global $wp_query;
// 获取所有置顶文章
$sticky_posts = get_option('sticky_posts');

if ( $wp_query->query_vars['paged'] <= 1 && !empty($sticky_posts) && is_array($sticky_posts) && !get_query_var('ignore_sticky_posts') ) {
$stickies1 = get_posts( array( 'post__in' => $sticky_posts ) );
foreach ( $stickies1 as $sticky_post1 ) {
// 判断当前是否分类页
if($wp_query->is_category == 1 && !has_category($wp_query->query_vars['cat'], $sticky_post1->ID)) {
// 去除不属于本分类的置顶文章
$offset1 = array_search($sticky_post1->ID, $sticky_posts);
unset( $sticky_posts[$offset1] );
}
if($wp_query->is_tag == 1 && !has_tag($wp_query->query_vars['tag'], $sticky_post1->ID)) {
// 去除不属于本标签的文章
$offset1 = array_search($sticky_post1->ID, $sticky_posts);
unset( $sticky_posts[$offset1] );
}
if($wp_query->is_year == 1 && date_i18n('Y', strtotime($sticky_post1->post_date))!=$wp_query->query['m']) {
// 去除不属于本年份的文章
$offset1 = array_search($sticky_post1->ID, $sticky_posts);
unset( $sticky_posts[$offset1] );
}
if($wp_query->is_month == 1 && date_i18n('Ym', strtotime($sticky_post1->post_date))!=$wp_query->query['m']) {
// 去除不属于本月份的文章
$offset1 = array_search($sticky_post1->ID, $sticky_posts);
unset( $sticky_posts[$offset1] );
}
if($wp_query->is_day == 1 && date_i18n('Ymd', strtotime($sticky_post1->post_date))!=$wp_query->query['m']) {
// 去除不属于本日期的文章
$offset1 = array_search($sticky_post1->ID, $sticky_posts);
unset( $sticky_posts[$offset1] );
}
if($wp_query->is_author == 1 && $sticky_post1->post_author != $wp_query->query_vars['author']) {
// 去除不属于本作者的文章
$offset1 = array_search($sticky_post1->ID, $sticky_posts);
unset( $sticky_posts[$offset1] );
}
}

$num_posts = count($posts);
$sticky_offset = 0;
// Loop over posts and relocate stickies to the front.
for ( $i = 0; $i < $num_posts; $i++ ) {
if ( in_array($posts[$i]->ID, $sticky_posts) ) {
$sticky_post = $posts[$i];
// Remove sticky from current position
array_splice($posts, $i, 1);
// Move to front, after other stickies
array_splice($posts, $sticky_offset, 0, array($sticky_post));
// Increment the sticky offset. The next sticky will be placed at this offset.
$sticky_offset++;
// Remove post from sticky posts array
$offset = array_search($sticky_post->ID, $sticky_posts);
unset( $sticky_posts[$offset] );
}
}
// If any posts have been excluded specifically, Ignore those that are sticky.
if ( !empty($sticky_posts) && !empty($wp_query->query_vars['post__not_in'] ) )
$sticky_posts = array_diff($sticky_posts, $wp_query->query_vars['post__not_in']);
// Fetch sticky posts that weren't in the query results
if ( !empty($sticky_posts) ) {
$stickies = get_posts( array(
'post__in' => $sticky_posts,
'post_type' => $wp_query->query_vars['post_type'],
'post_status' => 'publish',
'nopaging' => true
) );
foreach ( $stickies as $sticky_post ) {
array_splice( $posts, $sticky_offset, 0, array( $sticky_post ) );
$sticky_offset++;
}
}
}

return $posts;
}
[/cc]

代码说明

1、如果你想让存档页也都显示全部置顶文章,那么就删掉12-45行的代码;
2、如果不想在某分类页显示置顶文章,将第 3 行的
[cc lang="php"]

if(
[/cc]
改成:
[cc lang="php"]

// abc是分类名称
if ( is_category( 'abc' ) ||
[/cc]
3、如果不想某标签页显示置顶文章,将第 3 行的
[cc lang="php"]

if(
[/cc]
改成:
[cc lang="php"]

// abc是标签名称
if ( is_tag( 'abc' ) ||
[/cc]
4、如果不想某作者页显示置顶文章,将第 3 行的

if(
改成:

[cc lang="php"]
// abc是作者昵称
if ( is_author( 'abc' ) ||
[/cc]
5、以上代码只对主循环有效,如果你在存档页使用WP_Query或query_posts来获取文章列表,又像让这些列表顶部显示置顶文章,可以把第3行代码中的以下代码删掉(注意:可能会导致文章显示数量跟你设置的不一样):
[cc lang="php"]

|| !is_main_query()
[/cc]
置顶样式

如果你想给置顶文章添加样式,将以下代码添加到functions.php中,会给置顶文章添加一个名为 sticky 的class。具体的css代码,再自行自定义:

[cc lang="php"]
add_filter('post_class', 'addStickyClass' ,10,3 );
function addStickyClass( $classes, $class, $post_id ){
if( is_sticky() && is_category() && !isset( $classes['sticky'] ) ){
$classes[] = 'sticky';
}

return $classes;
}
[/cc]

来自:http://www.ludou.org/wordpress-sticky-posts-in-archive.html

分类 标签 置顶
0
WordPress后台双击评论内容可以编辑评论
上一篇
微信公众平台新增投票和多客服功能
下一篇

评论 (0)

再想想
暂无评论

相关文章

常用SSH命令
debian9升级10
服务器过期,重建网站:从数据丢失到重新上线
余光中:怎样改进英式中文?——论中文的常态与变态

归档

标签

africa Djibouti dufengyan du fengyan fengyan du india WordPress 亚美尼亚 伊朗 儿童 初见 单车亚非 印度 吉布提 四国遍路 土耳其 埃及 埃塞俄比亚 孩子 尼罗河肖像 摄影 日本 杜风彦 杜齐眼 格鲁吉亚 疫情 石灰石矿 索马里 索马里兰 约旦 美食 肯尼亚 致谢 苏丹 警察 赞比亚 郗光 非洲 骑在亚美尼亚 骑在伊朗 骑在埃及 骑在格鲁吉亚 骑在约旦 骑行 齐林

猜你喜欢

常用SSH命令

常用SSH命令

杜风彦
417 0 0
debian9升级10

debian9升级10

杜风彦
398 0 0
服务器过期,重建网站:从数据丢失到重新上线

服务器过期,重建网站:从数据丢失到重新上线

杜风彦
451 0 0
余光中:怎样改进英式中文?——论中文的常态与变态

余光中:怎样改进英式中文?——论中文的常态与变态

杜风彦
1,343 0 0
Copyright © 2004-2025 风彦疯语-杜风彦的博客. Designed by nicetheme.
讲述不同人生的相同故事 网备 DQ001 号
  • 首页
  • 技术交流
    • 网络技术
    • 微博微信
  • 经验分享
    • 文化交流
    • 语言学习
    • 音乐旅途
    • 生活杂谈
  • 旅游旅行
    • 单车旅行
    • 旅行故事
    • 旅途随笔
  • 摄影交流
    • 摄影练习
  • 专题汇总
    • 纪录短片创作
    • 环球骑行
    • 四国遍路
    • 看非洲
  • 媒体报道
    • 杜风彦简介
  • 投稿
  • 动态
  • 杜风彦
  • 单车亚非
  • 非洲
  • 纪录片
  • 杜齐眼
  • 尼罗河肖像

杜风彦

老杜,专注于非洲纪实影像。
334
文章
10
评论
10
喜欢