Three Methods for Sticky Posts on WordPress Category Pages_Plugin_Code
📅November 18, 2019
👤Lee
⏱️Reading time: 3 minutes
🔄Last Updated: November 27, 2019
📚 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 for category pages, so they only appear on the WP category page and not on the homepage? This article introduces twoWordPress category page sticky posts的plugins and codeimplementation methods.
Category Directory Sticky Post Plugin
There are two plugins introduced here that can achieve sticky posts 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 at the top of each category directory page.
Allows you to select the category directory where you want to display sticky posts
Just like the built-in sticky feature, display posts at the top of category directories
Allows displaying different sticky posts in specific category directories
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 you want to make sticky.Download Link
Sticky Posts – Switch
The Sticky Posts – Switch plugin is newer; besides supporting sticky posts on category directories, 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 whether to display sticky posts on the homepage in the settings.Download Link
Code Implementation for Displaying Sticky Posts in Categories
Naiba has not tested the code version; those who do not want to use a plugin 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 for assistance; 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 the archive page to also display all sticky posts, then delete the code from lines 12-45; ② If you do not want to display sticky posts on a certain category page, change the code on line 3if(to
// abc是分类名称
if ( is_category( 'abc' ) ||
③ If you do not want to display sticky posts on a certain tag page, change the code on line 3if(Change it to:
// abc是标签名称
if(is_tag('abc')||
④ If you do not want to display sticky posts on a certain author page, change the code on line 3if(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.
「Naibabiji WordPress Website Building Coaching Service」—From choosing a domain and buying hosting, to installing a Theme and publishing content, I「ll coach you through every step, helping you avoid detours and reach your goal 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.