今日要制作的功能,就是将多重的role加入到我们的使用者之上,我们可以使用简单的程序码就可以加入了,而在role的产生,也可以藉由第三方的外挂,或是自己撰写的扩充来支援,而我们可以基於单纯使用的使用wp user来增加role,并且使用is_user_in_role
来当检查的前哨,我们的is_user_in_role真的是曝光率极高,又非常实用的好东西!
$user_id = 12;
$user = new WP_User( $user_id );
if(false === is_user_in_role($user,'role-1')) $user->add_role( 'role-1' );
if(false === is_user_in_role($user,'role-2')) $user->add_role( 'role-2' );
我们的第一步可以见到,如果只是对於单一情况的增加是非常容易的,而更深入的开发就是要在每一个user之中,将role的栏位从dropdown list转换成radio button,而我们的使用action主要有三个,编辑新增与显示,我们只需要将三个要显示的action加入我们的template来做替换,就可以做到了。
add_action('show_user_profile', 'go_ranger_multiple_role');
add_action('edit_user_profile', 'go_ranger_multiple_role');
add_action('user_new_form', 'go_ranger_multiple_role');
而在回传的部分,也是将对应的条件回传回去,每一个回传的页面就要有相对应得格式,如同下方:
add_action('personal_options_update', 'go_ranger_multiple_role_save');
add_action('edit_user_profile_update', 'go_ranger_multiple_role_save');
add_action('user_register', 'go_ranger_multiple_role_save');
但是我们三个更新的或是使用者加入的条件,都可以触发到profile_update
,可以把三行整理成同一个action的recall function来做代替,而我们写入一个删除原生role的程序码,而我们选用的本来是init
,不过在没办法确定的生命周期的关系,选择渲染结束後,开始载入js档案的admin_enqueue_scripts
。
add_action('admin_enqueue_scripts','enqueue_script_hide_roles');
function enqueue_script_hide_roles(){
wp_enqueue_script( 'go_ranger_hide_role', plugin_dir_url( __FILE__ ) . 'hide_role.js', array(), '1.0' );
}
window.onload = function(){
var target = document.querySelector('selelct[name="role"] tr');
if(typeof target == 'object') target.remove();
}
在删除之後,我们就可以温柔地将我们的template加入,与我们之前所说依样,我们需要一个table来显示我们的role,而我们第一步就是将我们的role 印出 ,并且制作成简单的table放上,而为了安全性我们也是加上了nonce来确保没有权限提升的问题。
function get_roles_list() {
global $wp_roles;
$all_roles = $wp_roles->roles;
$editable_roles = apply_filters('editable_roles', $all_roles);
return $editable_roles;
}
function go_ranger_multiple_role(){
wp_nonce_field( 'go-ranger-update-multiple-roles', 'go_ranger_multile_roles_nonce' );
$roles = get_roles_list();
include(__DIR__.'template/roles_extension.php');
}
//role_extension.php
<h2>多重roles在这</h2>
<table class="form-table">
<tr>
<th class="form-table-title"> Roles</th>
<td>
<?php
$user_roles = ( isset( $user->roles ) ) ? $user->roles : array();
foreach( $roles as $name => $label ){
$id = uniqid();?>
<label for='<?php echo $label.$id ?>'><?php echo $label; ?></label>
<input id='<?php echo $label.$id ?>' type="checkbox" value="<?php echo $name ?>">
<?php
}?>
</td>
</tr>
</table>
这样我们就可以写出简单的陈列了,而我们得把有选过的程序码加入checked的功能,所以我们在加入片段的程序码。
<?php
$user_roles = ( isset( $user->roles ) ) ? $user->roles : array();
foreach( $roles as $name => $label ){
$id = uniqid();?>
<label for='<?php echo $label.$id ?>'><?php echo $label; ?></label>
<input id='<?php echo $label.$id ?>' nmae="go_ranger_mroles_array[]" type="checkbox" value="<?php echo $name ?>"
<?php
if( !is_empty( $user_roles)){
if(true === in_array( $name, $user_roles ) ) echo 'checked';
}
?>>
<?php
}?>
在完成模板後,就可以看到变成清单了,而最後就是将我们的程序码写入尽我们的DB之中,因为roles本来就是阵列,所以在扩充这个功能上几乎是没有遇到什麽大问题,而这边我们写上了nonce的街口,并且写上了不同的post来取得我们回传的程序码。
function go_ranger_multiple_role_save($user_id){
if(false === isset( $_POST['go_ranger_multile_roles_nonce']) ||false === wp_verfiy_nonce($_POST['go_ranger_multile_roles_nonce'], 'go-ranger-update-multiple-roles' )) return;
if(false === current_user_can('promote_users')) return;
if( is_array( $_POST [ 'go_ranger_mroles_array' ] ) ) {
$new_roles = $_POST['go_ranger_mroles_array'];
$user = new WP_User( $user_id );
$roles = get_roles_list();
foreach( array_keys($roles) as role) {
$user->remove_role($role);
}
foreach( $new_roles as $role ){
$user->add_role($role);
}
return;
}else return;
}
这样我们就能确保我们的编辑是可以有多重的roles,如果搭配我们前面的特价来用,你就可以把可以赊帐又五折的客人,与可以赊帐却多收一成服务费的客人,使用功能性的role来做区别,而明天再将新增的使用者的部分,以及增加role的功能新增上去,来达到完整的多重role使用。
How to Add Custom User Roles on Your WordPress Site
Assign multiple roles to single users
how to Assign Multiple Roles for a user in wordpress?
admin_enqueue_scripts
user role editor
>>: Day 28: Divide and Conquer
ES6 除了新增了上篇的let & const之外,也提供了新的模版字符串(Template...
昨天我们已经将 gotop按钮实做出来 但有时候我们不想要它一直出现 而是使用者滚轮滑到下面 它才会...
今天,我要做个简单的小程序,实作前一天所介绍到的Activity功能。我要做的是关於牛排馆的点餐系统...
注:这篇不打算讲 Core Web Vitals 的介绍、以及如何去解决,因为这资讯很难靠这样一篇写...
在 Web Component 中有些特别的 css styling 可以设定 , ex : 如果我...