Home WP Plugins Standard Post

Standard Post

Three Methods for Sticky Posts on WordPress Category Pages_Plugin_Code

You probably know how to make a WordPress post sticky: simply check the option to stick the post to the front page when publishing. But how do you set sticky posts for category pages, showing sticky posts only on category pages and not on the homepage? This article introduces two plugins for WordPress category page sticky posts...

Updated on November 27, 2019 About 10 minutes read
三种WordPress分类目录页文章置顶的方法_插件_代码

You probably know how to make a WordPress post sticky. Simply check the 'Stick this post to the blog front page' () option.

But how do you set sticky posts for category pages, showing sticky posts only on category pages and not on the homepage? This article introduces twoWordPress category page sticky postsplugins and codeimplementation methods.

wordpress文章分类目录置顶

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, you can easily achieve the effect of sticking posts on category pages.

Category Sticky Pos allows you to display specified posts at the top of each category 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

Category Sticky PostAfter 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, supporting sticky posts on category pages, as well as on tag pages and custom post types.

Moreover, posts made sticky through this plugin will show a star icon in the backend post list, making it easy to manage sticky posts.

Sticky Posts – Switch

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. If you don't want to use a plugin, you can research the code implementation method yourself.

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 help. Reference:Safe Method to Add Code to the functions.php File: Code Snippets

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;
}

Code Explanation

① If you want archive pages to also display all sticky posts, delete lines 12-45 of the code;
② If you don't want to display sticky posts on a certain category page, modify 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):

|| !is_main_query()

The code method is fromLudou Blog

Rate this article post
Previous What Skills and Abilities Are Needed to Register and Open a Shopify Store for Foreign Trade Continue reading content around the same timeline. Next Top 20 Cross-Border E-commerce Independent Websites: Benchmark Cases of Chinese Brands Going Global (2026 Update) View the next related tutorial or experience.

AI Website Building Assistant

🤖
Hello! I am the Naibabiji AI Assistant. How can I help you?
Quick Consultation: