How to pin archive pages such as WordPress categories and tags to the top?
The example in this article describes how to achieve the top of archive pages such as WordPress categories and tags. Share it with everyone for your reference. The specific analysis is as follows:
Recommendation: "wordpress tutorial"
In wordpress, by default, the top article can be pinned to the home page. If we want to classify /Tag and other archive pages can also pin articles to the top. We need secondary development.
Now refer to the code of the homepage pinned to the top in wp-includes/query.php. With a slight modification, you can make the category page, tag page, and author page Archive pages such as and date pages can also display pinned articles within their range at the top like the homepage. Just put the following code into functions.php under the current theme.
The code is as follows:
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 && is_array($sticky_posts) && !emptyempty($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 ( !emptyempty($sticky_posts) && !emptyempty($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 ( !emptyempty($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 description:
1. If you want the archive page to also display all pinned articles, then delete lines 11-43 of the code;
2. If you don’t want to To display pinned articles on a certain category page, change the
code in line 3 as follows:
if( //改成: // abc是分类名称 if ( is_category( 'abc' ) ||
3. If you do not want a certain tab page to display pinned articles, change the code
# in line 3 ##The code is as follows:if( //改成: // abc是标签名称 if ( is_tag( 'abc' ) ||
if( //改成: // abc是作者昵称 if ( is_author( 'abc' ) ||
|| !is_main_query()
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; }
WordPress Website BuildingHelpful.
The above is the detailed content of How to pin archive pages such as WordPress categories and tags to the top. For more information, please follow other related articles on the PHP Chinese website!