WordPress选择特定的分类 也可以置顶文章


WordPress有一个很大的毛病,家居替代情况下是会显示放置顶文章的,而分类,标签,放置页面等就不能显示放置顶。它的逻辑是,人们只在家里需要注意一些放置顶文章,而填充页面不需要。

但现实中其实是,我们常常把首页弄成CMS模式,让最新的文章被用户看到,而到了分类页时,为了突出某些文章的本质,又把它置顶。

为了解决分类标签页不能放置顶的问题,我特意找了一下,露兜在文章中中总结出了这个解决方案。但这个方案存在一个问题,它让所有的填充页面都能实现把放置顶文章放在最前面,问题就来了,例如按时间补充的页面,读者当然想知道这个月份的文章发文顺序,如果置顶,那就不伦不类了。

还有一个问题,能不能做到某些分类可以置顶,有些分类不置顶,可以自己控制呢?答案是肯定的,下面的代码可以解决这个问题。

我已经将这个项目托管在GitHub,你可以通过下面的按钮去访问。欢迎Fork哦。

获取代码(git永久停止更新了,为了安全,我们不提供地址)

github上的代码有一点问题,我在自己的博客中使用时,发现has_category函数无法正常运行,可能由于某些原因吧,而不是说明存在兼容性问题,因此,我把代码进行了改进,完整的代码如下:

<?php

add_filter('the_posts',?'putStickyOnTop',1,100);
函数putStickyOnTop($ posts){
?if(is_home()||!is_main_query()||!is_archive())返回$ posts;
?全局$ wp_query;

?//如果这个分类没有开启显示置顶的话
?if($ wp_query-> is_category == 1 || $ wp_query-> is_tag == 1){
??? if($ wp_query-> is_category == 1)$ term_id = $ wp_query-> query_vars ['cat'];
??? 否则$ term_id = $ wp_query-> query_vars ['tag_id'];
??? $ show_sticky = get_term_meta($ term_id,'show_sticky');
??? if(!$ show_sticky)返回$ posts;
?}
?//不是分类或标签就不要置顶了
?其他{
??? 返回$ posts;
?}

?//获取所有置顶文章
?$ 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')){
??? foreach($ sticky_posts as $ sticky_post){
?????? //判断当前是否分类页
?????? if($ wp_query-> is_category == 1){
??????? $ post_cats = wp_get_post_categories($ sticky_post); 
??????? if(in_array($ wp_query-> query_vars ['cat'],$ post_cats))继续;
??????? //消除不属于本分类的置顶文章
??????? $ offset = array_search($ sticky_post,$ sticky_posts);
??????? unset($ sticky_posts [$ offset]);
?????? }
?????? if($ wp_query-> is_tag == 1){
??????? $ post_tags = wp_get_post_tags($ sticky_post,array('fields'=>'ids')); 
??????? if(in_array($ wp_query-> query_vars ['tag_id'],$ post_tags))继续;
??????? //去除不属于本标签的文章
??????? $ offset = array_search($ sticky_post,$ sticky_posts);
??????? unset($ sticky_posts [$ offset]);
?????? }
??? }
??? $ num_posts = count($ posts);
??? $ sticky_offset = 0;
??? //循环发布帖子,并将即时贴移到最前面。
??? 对于($ i = 0; $ i <$ num_posts; $ i ++){
?????? 如果(in_array($ posts [$ i]-> ID,$ sticky_posts)){
??????? $ sticky_post = $ posts [$ i];
??????? //从当前位置移除粘性
??????? array_splice($ posts,$ i,1);
??????? //在其他便利贴之后移到最前面
??????? array_splice($ posts,$ sticky_offset,0,array($ sticky_post));
??????? //增加粘性偏移量。下一个胶粘物将放置在此偏移处。
??????? $ sticky_offset ++;
??????? //从粘性帖子数组中删除帖子
??????? $ offset = array_search($ sticky_post-> ID,$ sticky_posts);
??????? unset($ sticky_posts [$ offset]);
?????? }
??? }

??? //如果明确排除了任何帖子,请忽略那些粘性的帖子。
??? 如果(!empty($ sticky_posts)&&!empty($ wp_query-> query_vars ['post__not_in'])))
?????? $ sticky_posts = array_diff($ sticky_posts,$ wp_query-> query_vars ['post__not_in']);

??? //获取不在查询结果中的粘性帖子
??? 如果(!empty($ sticky_posts)){
?????? $ stickies = get_posts(array(
??????? 'post__in'=> $ sticky_posts,
??????? 'post_type'=> $ wp_query-> query_vars ['post_type'],
??????? 'post_status'=>'发布',
??????? 'nopaging'=>是
?????? ));

?????? foreach($ stickies as $ sticky_post){
??????? array_splice($ posts,$ sticky_offset,0,array($ sticky_post));
??????? $ sticky_offset ++;
?????? }
??? }
?}
?返回$ posts;
}

/ **
下方的代码可以实现term_meta
** /

add_action('category_add_form_fields','extra_term_show_sticky__fields');
add_action('edit_category_form_fields','extra_term_show_sticky__fields');
add_action('add_tag_form_fields','extra_term_show_sticky__fields');
add_action('edit_tag_form_fields','extra_term_show_sticky__fields');
函数extra_term_show_sticky__fields($ term){
?$ metas =数组(
??? array('meta_name'=>'置顶文章','meta_key'=>'show_sticky'),
?);
?$ term_id = $ term-> term_id;
?foreach($ metas as $ meta){
??? $ meta_name = $ meta ['meta_name'];
??? $ meta_key = $ meta ['meta_key'];
??? $ meta_value = get_option(“ term _ {$ term_id} _meta _ {$ meta_key}”);
??? ?>
<tr class =“ form-field”>
?<th scope =“ row” valign =“ top”> <label for =“ term _ <?php echo $ meta_key;?>”> <?php echo $ meta_name; ?> </ label> </ th>
?<td> <输入类型=“文本” name =“ term_meta _ <?php echo $ meta_key;?>” id =“ term _ <?php echo $ meta_key;?>” class =“ regular-text” value =“ <? php echo $ meta_value;?>“> </ td>
</ tr>
??? <?php
?}
}

add_action('created_category','save_extra_term_show_sticky__fileds');
add_action('edited_category','save_extra_term_show_sticky__fileds');
add_action('created_post_tag','save_extra_term_show_sticky__fileds');
add_action('edited_post_tag','save_extra_term_show_sticky__fileds');
函数save_extra_term_show_sticky__fileds($ term_id){
?if(!empty($ _ POST))foreach($ _ POST as $ key => $ value){
??? echo $ key;
??? if(strpos($ key,'term_meta_')=== 0 && trim($ value)!=''){
?????? $ meta_key = str_replace('term_meta _','',$ key);
?????? $ meta_value = trim($ value);
?????? update_option(“ term _ {$ term_id} _meta _ {$ meta_key}”,$ meta_value)或add_option(“ term _ {$ term_id} _meta _ {$ meta_key}”,$ meta_value);
??? }
?}
}

if(!function_exists('get_term_meta')):
函数get_term_meta($ term_id,$ meta_key){
?if(is_object($ term_id))$ term_id = $ term_id-> term_id;
?$ term_meta = get_option(“ term _ {$ term_id} _meta _ {$ meta_key}”);
?如果($ term_meta){
??? 返回$ term_meta;
?}其他{
??? 返回null;
?}
}
万一;

注意:上面这段代码和github中的代码有一个简单的区别,已经用红色区分开来。当然还有一些区别,例如github上的代码有在日期替换列表中也有效的代码,但是我们介绍文章说的是,可以通过后台来控制,而且也精选了没有必要让标题页都使用该功能,所以仅仅把这个放置顶功能定义在分类列表页面和标签粘贴列表页面。

将所有的代码拷贝到你的主题functions.php中,上传覆盖即可。

进入后台,如果你想让某人分类或标签实现该功能,那么进入这个分类或标签的编辑页,在下面你可以找到如下图的选项,填入1即可。

2014-10-29-235721

更新之后去这个分类看下,是否有置顶文章被放上来了?

还有一种情况,你希望所有的分类标签都置顶,但是可以控制某几个分类不置顶。这当然可以办到,稍作修改即可。如果你有相关需要可以通过下方评论框回复给我哦。对了,大赏给我呀!




除了特别申明外,本站资源均来自互联网公开内容,如果侵犯了您的权益,请进行投诉
电脑学习网 » WordPress选择特定的分类 也可以置顶文章

发表评论