好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WordPress分类/标签等存档页也能置顶文章方法 -

WordPress分类/标签等存档页也能置顶文章方法

在wordpress中默认能置顶文章就是只有首页了,如果我们希望分类/标签等存档页也能置顶文章我们需要二次开发.

现在参考wp-includes/query.php中首页置顶的代码,稍微修改一下,可以让分类页、标签页、作者页和日期页等存档页面也能像首页一样在顶部显示其范围内的置顶文章,把下面的代码放到当前主题下的functions.php中就可以了.

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 ) && ! empty 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 empty ( $sticky_posts ) && ! empty 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 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 ;  } 

代码说明:

1、如果你想让存档页也都显示全部置顶文章,那么就删掉11-43行的代码;

2、如果不想在某分类页显示置顶文章,将第 3 行的

if (   //改成:   // abc是分类名称   if  ( is_category(  'abc'  ) || 

3、如果不想某标签页显示置顶文章,将第 3 行的代码

if (   //改成:   // abc是标签名称   if  ( is_tag(  'abc'  ) || 

4、如果不想某作者页显示置顶文章,将第 3 行的

if (  //改成:     // abc是作者昵称   if  ( is_author(  'abc'  ) || 

5、以上代码只对主循环有效,如果你在存档页使用WP_Query或query_posts来获取文章列表,又像让这些列表顶部显示置顶文章,可以把第3行代码中的以下代码删掉(注意:可能会导致文章显示数量跟你设置的不一样):

代码如下: || !is_main_query() 

置顶样式: 如果你想给置顶文章添加样式,将以下代码添加到functions.php中,会给置顶文章添加一个名为 sticky 的class,具体的css代码,再自行自定义:

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分类/标签等存档页也能置顶文章方法 -的详细内容...

  阅读:60次