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

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

杜风彦
2014-05-08 9:52:51技术交流
928 0 0

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)
再想想
    近期文章
    • 京东限时达,不一定能达
    • 网站迁移到新的腾讯云服务器
    • 2011年8月-北京乘火车前往南宁
    • 9年前的我会感谢现在的我么?
    • As China evacuates citizens from India, one dad cannot wait to see his children after months away
    标签
    africa cycling dufengyan ethiopia india WordPress 亚美尼亚 伊朗 儿童 单车 单车亚非 印度 吉布提 四国遍路 土耳其 埃及 埃塞俄比亚 尼罗河肖像 摄影 旅行 日本 杜风彦 杜齐眼 格鲁吉亚 疫情 石灰石矿 索马里 索马里兰 约旦 肯尼亚 致谢 苏丹 警察 赞比亚 路 郗光 非洲 面孔 骑在亚美尼亚 骑在伊朗 骑在埃及 骑在格鲁吉亚 骑在约旦 骑行 齐林
    相关文章
    余光中:怎样改进英式中文?——论中文的常态与变态
    VPN 619,800等相关错误的解决办法
    Linux系统中常用操作命令
    office 安装中出现 error1935
    关于老杜

    杜风彦,摄影、武术、旅行、户外爱好者。曾历时2年2个月时间骑行亚非22国,总里程约3.5万公里。中国当代徐霞客,中国文化旅游摄影协会会士,中国探险协会顾问,八卦掌高级教练员,图库签约摄影师,杂志约稿作者,澎湃新闻特约记者,目前专注于非洲纪实影像项目。

    友情链接
    王媛老师 环球骑行 部分摄影作品 齐林-自由摄影师
    来这瞅瞅
    媒体报道 摄影交流 音乐旅途 旅行故事 旅行装备 旅途随笔 语言学习 文化交流 看非洲
    Copyright © 2014-2021 风彦疯语-杜风彦的博客. Designed by nicetheme. 讲述不同人生的相同故事 暂无备案号
    • 首页
    • 技术交流
      • 网络技术
      • 微博微信
    • 经验分享
      • 文化交流
      • 语言学习
      • 音乐旅途
      • 生活杂谈
    • 旅游旅行
      • 单车旅行
      • 旅行故事
      • 旅途随笔
    • 摄影交流
      • 摄影练习
    • 专题汇总
      • 纪录短片创作
      • 环球骑行
      • 四国遍路
      • 看非洲
    • 媒体报道
      • 杜风彦简介
    • 投稿
    热门搜索
    • 杜风彦
    • 单车亚非
    • 非洲
    • 纪录片
    • 杜齐眼
    • 尼罗河肖像
    杜风彦
    老杜,专注于世界纪实影像。
    371 文章
    11 评论
    11 喜欢
    • 0
    • 0
    • Top