Three Methods for Sticking Posts on WordPress Category Archive Pages_Plugin_Code
📅November 18, 2019
👤Lee
⏱️Reading time: 3 minutes
🔄Last updated: November 27, 2019
📚 Article Table of Contents
You probably know how to make a WordPress post sticky: simply check the "Stick this post to the blog front page" () option when publishing the post. But how do you set sticky posts to appear only on WP category pages, not on the homepage? This article introduces twoWordPress Category Page Sticky Posts的plugins and codeimplementation methods.
Category Sticky Post Plugin
There are two plugins introduced here that can make posts sticky on category pages,Naibabijitested and working properly under WordPress 5.3.
Category Sticky Post
It is recommended to use the Category Sticky Post pluginWordPress Plugin, which can easily achieve the effect of sticky posts on category pages. Category Sticky Post allows you to display specified posts as sticky on each category page.
Allows you to select the category where you want to display sticky posts
Just like the built-in sticky feature, it displays posts as sticky on category pages
Allows displaying different sticky posts in specific categories
Supports WordPress 5.3
After installing the plugin, when publishing a post, a Category Sticky option will appear in the right sidebar; simply select the category where you want it to be sticky.Download Link
Sticky Posts – Switch
The Sticky Posts – Switch plugin is newer; besides supporting sticky posts on category pages, it also supports displaying them on tag pages and custom post types. Moreover, posts made sticky via this plugin will display a star icon in the backend post list, making it easier for you to manage sticky posts.Additionally, you can set in the options whether to display sticky posts on the homepage.Download Link
Implementing Sticky Posts Display by Category via Code
Naiba has not tested the code version; those who do not want to use plugins can study the code implementation method themselves. Insert the following code into your theme's functions.php file. If you don't know how to insert it, you can use a plugin to help; refer to:Safe method to add code to the functions.php file: Code Snippets
add_filter('the_posts','putStickyOnTop');functionputStickyOnTop($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($stickies1as$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 positionarray_splice($posts,$i,1);// Move to front, after other stickiesarray_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 resultsif(!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($stickiesas$sticky_post){array_splice($posts,$sticky_offset,0,array($sticky_post));$sticky_offset++;}}}return$posts;}
Code Explanation① If you want archive pages to also display all sticky posts, then delete lines 12-45;
② If you do not want to display sticky posts on a certain category page, change line 3'sif(to
// abc是分类名称
if ( is_category( 'abc' ) ||
③ If you do not want to display sticky posts on a certain tag page, change line 3'sif(Change it to:
// abc是标签名称
if(is_tag('abc')||
④ If you do not want to display sticky posts on a certain author page, change line 3'sif(Change it to:
// abc是作者昵称
if ( is_author( 'abc' ) ||
⑤ The above code only works for the main loop. If you use WP_Query or query_posts to fetch post lists on archive pages and still want sticky posts to appear at the top of these lists, you can delete the following code from line 3 (note: this may cause the number of displayed posts to differ from your settings):
🚀 Still feeling confused after reading the tutorial? Let me guide you step-by-step instead.
「Naibabiji WordPress Website Building Coaching」 — From selecting a domain and purchasing hosting to installing themes and publishing posts, I「ll guide you through every step, helping you avoid detours and reach your goals directly.
Comments are closed
The comment function for this article is closed. If you have any questions, please feel free to contact us through other channels.