How to make WordPress category/tag/author page show sticky articles?

WordPressThere is a built-in article sticking function, but by default only the top page is supported to display sticky articles.

Other archive pages (such as category pages, tag pages, author pages, and date pages) cannot display sticky articles at the top, only in the default order.

a lot to do with WordPressSEOfriends, hope to solve these problems.

How to make WordPress category/tag/author page show sticky articles?

In fact, we only need to refer to the code of the home page of wp-includes/query.php and modify it slightly, so that the top of the archive page (such as category page, tab page, author page and date page) can also display the top article.

WordPress sticky article code

Please put the following code in the functions.php file under your current theme ▼

//让WordPress分类、标签、存档和作者页显示置顶文章
add_filter('the_posts', 'putStickyOnTop' );
function putStickyOnTop( $posts ) {
if ( is_series() || 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 && is_array($sticky_posts) && !empty($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;
}

//置顶文章添加样式
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;
} 

Instructions for using the code of the sticky article

1) If you want the archive page to display all the top articles, please delete the 11-43 lines of code;

2) If you do not want to display the top article on the category page, please add ▼ in line 3

if(

Modify to ▼

// abc是分类的名称
if ( is_category( 'abc' ) || 

3) If you do not want to display the top article on the tab page, please ▼ in line 3

if(

change into:

// abc是标签的名称
if ( is_tag( 'abc' ) || 

4) If you do not want the author page to display the top article, please ▼ in line 3

if(

Modify to ▼

// abc是作者的昵称
if ( is_author( 'abc' ) || 

5) If you do not want a custom category page to display the top article, put the

if(

Change it to:

// series是自定义分类、abc是自定义分类名称
if ( is_series( 'abc' ) ||

The above code is only valid for the main loop, if you are using WP_Query or query_posts to get a list of posts on the archive page, and want to display the pinned post on top of those lists.

You can delete the following code in line 3 (may cause the number of articles displayed to be different from what you set) ▼

|| !is_main_query() 

Add style to the top article

If you want to add styles to the sticky post, add the following code to functions.php and add a class named sticky to the sticky post.

In general WordPress themes, there will be CSS code for the top article style, you can also add custom ▼

//置顶文章添加样式
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;
} 

There is another way to make WordPress category archive pages show WordPress articles at the top▼

Hope Chen Weiliang Blog ( https://www.chenweiliang.com/ ) shared "How to make WordPress category/tag/author page show sticky articles? , to help you.

Welcome to share the link of this article:https://www.chenweiliang.com/cwl-878.html

Welcome to the Telegram channel of Chen Weiliang's blog to get the latest updates!

🔔 Be the first to get the valuable "ChatGPT Content Marketing AI Tool Usage Guide" in the channel top directory! 🌟
📚 This guide contains huge value, 🌟This is a rare opportunity, don’t miss it! ⏰⌛💨
Share and like if you like!
Your sharing and likes are our continuous motivation!

 

Comment

Your email address will not be published. Required fields * Callout

scroll to top