Home > Article > CMS Tutorial > How to pin archive pages such as WordPress categories and tags to the top
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' ) ||4. If you don’t want an author’s page to display pinned articles, change the code in line 3 as follows:
if( //改成: // abc是作者昵称 if ( is_author( 'abc' ) ||5. The above code is only for The main loop is valid. If you use WP_Query or query_posts on the archive page to get a list of articles, and if you want to display pinned articles at the top of these lists, you can delete the following code in the third line of code (note: it may cause the number of articles displayed to be less than Your settings are different): The code is as follows:The code is as follows:
|| !is_main_query()Top style: If you want to add styles to the top article, add the following code to functions .php, a class named sticky will be added to the top article, and the specific css code will be customized by yourself: The code is as follows:
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; }I hope this article will be helpful to everyone
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!