「Wordpress 外挂开发」制作多重role的外挂,让你的商业逻辑的可能性具现化

基础的调动WP_USER

今日要制作的功能,就是将多重的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来取得我们回传的程序码。

roles checklist

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使用。

reference

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


<<:  Day26 LINE BOT & NBA 战况查询

>>:  Day 28: Divide and Conquer

[Day04] JavaScript - ES6 模板字符串 (Template Literal)

ES6 除了新增了上篇的let & const之外,也提供了新的模版字符串(Template...

JS AJAX基础实作(4) DAY29

昨天我们已经将 gotop按钮实做出来 但有时候我们不想要它一直出现 而是使用者滚轮滑到下面 它才会...

DAY11:应用程序元件Activity之实作

今天,我要做个简单的小程序,实作前一天所介绍到的Activity功能。我要做的是关於牛排馆的点餐系统...

从 IT 技术面细说 Search Console 的 27 组数字 KPI (12) :网页体验 - Core Web Vitals

注:这篇不打算讲 Core Web Vitals 的介绍、以及如何去解决,因为这资讯很难靠这样一篇写...

[Day10] - Tab页签切换效果 - Web Component 的样式设定

在 Web Component 中有些特别的 css styling 可以设定 , ex : 如果我...