您的位置:首页 > 其它

Wordpress文章过滤插件开发记录[已完成]

2015-05-13 17:08 232 查看
最近使用Wordpress有一个新的需求,可能这个需求已经有插件可以实现了,只可惜实在是没有查到,就准备自己来动手开发一个。

业务功能也很简单,就是显示给游客和登录用户的文章有所区别,而不止是允许不允许阅读,要根据一些指定的配置属性对展示给用户的文章进行过滤,对用户所见进行区别划分

功能描述

功能其实正如文头描述的一样,对用户所见进行区别对待,这个功能使用已经存在的那些插件,比如根据角色来区分显示的内容,这就对后续扩展有所限制,毕竟Wordpress自带的角色只有那么几种,如果后期要增加的类型变多,那就是无能为力了。

所以目前文章过滤机制将采用下面几个方法:

预定义用户分组并分配用户分组

编写文章并指定允许的用户分组

用户阅读,文章过滤

采用以上思路基本可以解决这个需求啦,下面是一些基本流程图。

预定义用户分组并分配用户分组

根据业务属性,预定义一些用户分组,并根据用户业务属性指定用户分组。

Created with Raphaël 2.1.2开始配置文章过滤功能定义用户分组指定用户分组结束配置文章过滤功能

编写文章并指定允许的用户分组

编写文章,并指定文章允许的用户类型。

Created with Raphaël 2.1.2开始编写文章指定文章允许的用户分组结束编写文章

用户阅读,文章过滤

根据用户分组来展示相应分组的文章,包括游客分组。

Created with Raphaël 2.1.2开始文章过滤根据用户分组以及文章允许的用户分组来进行文章过滤结束文章过滤

计划功能·页面

用户分组管理页面(包括用户分组的新增、修改、删除等功能)

用户编辑页面嵌入分配用户分组功能,计划可以分配到多个分组,采用多选框方式

用户列表页面,增加所属分组列

文章或页面嵌入分配分组功能,即指定用户分组才可以看到这篇文章或者页面

插件目标
有用户分组区别的文章可见性功能


功能交互类型

列表功能(用户分组管理页面)

文本表单、多选框表单(用户分组管理页面)

自定义列表字段

存储的数据

用户分组数据(新创建数据表:pfu_user_group[
id
,
name
,
desc
])

用户与分组关系(
user_meta


文章或者页面与分组关系(
post_meta


界面截图

主页/帮助页面



用户分组列表页面



添加/编辑用户分组页面



配置用户分组页面



配置文章分组页面



配置完成

配置完成即可正常显示,按照已经分配好的用户分组。

已完成

第二次做Wordpress插件开发,几乎是走的模仿之路,不过我认为多模仿写的好的插件,也不失为一种快速进步的方法,多做思考,多做比较,多做甄选,一定会有自己的风格出来。

下面是插件中使用到的Wordpress内置钩子或者是方法:

方法

add_action


dbDelta


current_user_can


add_submenu_page


get_user_meta


delete_user_meta


add_user_meta


get_post_meta


delete_post_meta


add_post_meta


get_current_user_id


is_super_admin


is_user_logged_in


menu_page_url


plugins_url


trigger_error


WP_List_Table


Action钩子

plugins_loaded


_admin_menu


edit_user_profile


edit_user_profile_update


edit_form_after_title


save_post


pre_get_posts


admin_menu


菜单用户分组显示

既然文章内容的显示可以实现分用户分组显示,那网站的其他内容为何不可呢?那就先来拿菜单来做个实现吧!

嗯,经过大半天的搜索,不管是墙内还是墙外都没有找到关于菜单配置页面的钩子,难道Wordpress确实没有提供么?

如下图,就是这个位置,我想添加一些自定义的字段:



不过经过进一步搜索,在(wordpress进阶教程(二十五):给菜单项添加字段)找到了个类似的。大体实现起来有点麻烦,需要利用钩子来替代原生的代码实现,比较侵入,不过在没有更好的实现方式之前,可以先拿这个方法来试试。

菜单的分组属性添加

经过一点测试,最终还是改出来了,还是模仿之路,不过还挺管用,虽然在最后的结果过滤有点疑问,就是下面这部分:

/*
添加过滤文章钩子
*/
add_action( 'pre_get_posts', 'pfu_post_filter_by_user_group' );
function pfu_post_filter_by_user_group($query) {
if(is_user_logged_in()) {
$user_id = get_current_user_id();
//处理文章查询
if(!is_super_admin( $user_id )) {
//文章过滤
// if($query->is_main_query()) {
//如果登录则根据用户所在分组显示
$current_user_groups = get_user_meta( $user_id, 'user_group' );
$query->set('meta_query',array(
array(
'key' => 'user_group',
'value' => $current_user_groups,
'compare' => 'IN'
)
));
// }
}

}else {
// if($query->is_main_query()) {
$query->set('meta_key','user_group');
$query->set('meta_value', '1' );

// }

}
return $query;

}


这里采用了通盘过滤,只要是存储在
wp_posts
表中的数据都会根据用户分组被过滤显示最后内容。

当然也尝试了
found_posts
这个过滤器,不过官网没有文档,也就暂时没查了,不过我认为应该还有更好的过滤文章结果列表或者是菜单的方法。

一些截图

菜单分组设置页面



总结

插件暂时开发完毕,代码已经上传到
Github
,有兴趣的小朋友,可以去下下来看看,这里下载。非常欢迎大家提出建议,才开始写插件,有许多需要改进的地方,慢慢进步!现行谢谢各位。

贴出代码截图



各位大神如果有好的建议可以在评论中提出,我定查询改良!先谢谢啦.

继续·开发·记录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: