PageRenderTime 63ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/components/Roles/Roles.php

https://github.com/ElmsPark/pods
PHP | 485 lines | 323 code | 106 blank | 56 comment | 53 complexity | 6ab236ab16e5dfd87ab3cbe115fbd3f6 MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. * Name: Roles and Capabilities
  4. *
  5. * Menu Name: Roles &amp; Capabilities
  6. *
  7. * Description: Create and Manage WordPress User Roles and Capabilities; Uses the 'Members' plugin filters for additional plugin integrations; Portions of code based on the 'Members' plugin by Justin Tadlock
  8. *
  9. * Version: 1.0
  10. *
  11. * Category: Tools
  12. *
  13. * @package Pods\Components
  14. * @subpackage Roles
  15. */
  16. class Pods_Roles extends PodsComponent {
  17. /**
  18. * Do things like register/enqueue scripts and stylesheets
  19. *
  20. * @since 2.0.0
  21. */
  22. public function __construct () {
  23. add_filter( 'pods_roles_get_capabilities', array( $this, 'remove_deprecated_capabilities' ) );
  24. }
  25. /**
  26. * Enqueue styles
  27. *
  28. * @since 2.0.0
  29. */
  30. public function admin_assets () {
  31. wp_enqueue_style( 'pods-wizard' );
  32. }
  33. /**
  34. * Build admin area
  35. *
  36. * @param $options
  37. * @param $component
  38. *
  39. * @return void
  40. * @since 2.0.0
  41. */
  42. public function admin ( $options, $component ) {
  43. global $wp_roles;
  44. $default_role = get_option( 'default_role' );
  45. $roles = array();
  46. foreach ( $wp_roles->role_objects as $key => $role ) {
  47. $count = $this->count_users( $key );
  48. $roles[ $key ] = array(
  49. 'id' => $key,
  50. 'label' => $wp_roles->role_names[ $key ],
  51. 'name' => $key,
  52. 'capabilities' => count( (array) $role->capabilities ),
  53. 'users' => sprintf( _n( '%s User', '%s Users', $count, 'pods' ), $count )
  54. );
  55. if ( $default_role == $key )
  56. $roles[ $key ][ 'label' ] .= ' (site default)';
  57. if ( 0 < $count && ( is_super_admin() || current_user_can( 'delete_users' ) || current_user_can( 'list_users' ) ) ) {
  58. $roles[ $key ][ 'users' ] .= '<br /><a href="'
  59. . admin_url( esc_url( 'users.php?role=' . $key ) ) . '">'
  60. . __( 'View Users', 'pods' ) . '</a>';
  61. }
  62. }
  63. $ui = array(
  64. 'component' => $component,
  65. 'data' => $roles,
  66. 'total' => count( $roles ),
  67. 'total_found' => count( $roles ),
  68. 'icon' => PODS_URL . 'ui/images/icon32.png',
  69. 'items' => 'Roles',
  70. 'item' => 'Role',
  71. 'fields' => array(
  72. 'manage' => array(
  73. 'label' => array( 'label' => __( 'Label', 'pods' ) ),
  74. 'name' => array( 'label' => __( 'Name', 'pods' ) ),
  75. 'capabilities' => array( 'label' => __( 'Capabilities', 'pods' ) ),
  76. 'users' => array(
  77. 'label' => __( 'Users', 'pods' ),
  78. 'type' => 'text',
  79. 'options' => array(
  80. 'text_allow_html' => 1,
  81. 'text_allowed_html_tags' => ''
  82. )
  83. )
  84. )
  85. ),
  86. 'actions_disabled' => array( 'duplicate', 'view', 'export' ),
  87. 'actions_custom' => array(
  88. 'add' => array( $this, 'admin_add' ),
  89. 'edit' => array( $this, 'admin_edit' ),
  90. 'delete' => array( $this, 'admin_delete' )
  91. ),
  92. 'search' => false,
  93. 'searchable' => false,
  94. 'sortable' => false,
  95. 'pagination' => false
  96. );
  97. if ( isset( $roles[ pods_var( 'id', 'get', -1 ) ] ) )
  98. $ui[ 'row' ] = $roles[ pods_var( 'id', 'get', -1 ) ];
  99. if ( !is_super_admin() && !current_user_can( 'delete_users' ) && !current_user_can( 'pods_roles_add' ) )
  100. $ui[ 'actions_disabled' ][] = 'add';
  101. if ( !is_super_admin() && !current_user_can( 'delete_users' ) && !current_user_can( 'pods_roles_edit' ) )
  102. $ui[ 'actions_disabled' ][] = 'edit';
  103. if ( count( $roles ) < 2 || ( !is_super_admin() && !current_user_can( 'delete_users' ) && !current_user_can( 'pods_roles_delete' ) ) )
  104. $ui[ 'actions_disabled' ][] = 'delete';
  105. pods_ui( $ui );
  106. }
  107. function admin_add ( $obj ) {
  108. global $wp_roles;
  109. $capabilities = $this->get_capabilities();
  110. $defaults = $this->get_default_capabilities();
  111. $component = $obj->x[ 'component' ];
  112. $method = 'add'; // ajax_add
  113. pods_view( PODS_DIR . 'components/Roles/ui/add.php', compact( array_keys( get_defined_vars() ) ) );
  114. }
  115. function admin_edit ( $duplicate, $obj ) {
  116. global $wp_roles;
  117. $id = $obj->id;
  118. $capabilities = $this->get_capabilities();
  119. $role_name = $role_label = $role_capabilities = null;
  120. foreach ( $wp_roles->role_objects as $key => $role ) {
  121. if ( $key != $id )
  122. continue;
  123. $role_name = $key;
  124. $role_label = $wp_roles->role_names[ $key ];
  125. $role_capabilities = $role->capabilities;
  126. }
  127. if ( empty( $role ) )
  128. return $obj->error( __( 'Role not found, cannot edit it.', 'pods' ) );
  129. $component = $obj->x[ 'component' ];
  130. $method = 'edit'; // ajax_edit
  131. pods_view( PODS_DIR . 'components/Roles/ui/edit.php', compact( array_keys( get_defined_vars() ) ) );
  132. }
  133. function admin_delete ( $id, &$obj ) {
  134. global $wp_roles;
  135. $id = $obj->id;
  136. if ( !isset( $obj->data[ $id ] ) )
  137. return $obj->error( __( 'Role not found, it cannot be deleted.', 'pods' ) );
  138. $default_role = get_option( 'default_role' );
  139. if ( $id == $default_role ) {
  140. return $obj->error( sprintf( __( 'You cannot remove the <strong>%s</strong> role, you must set a new default role for the site first.', 'pods' ), $obj->data[ $id ][ 'name' ] ) );
  141. }
  142. $wp_user_search = new WP_User_Search( '', '', $id );
  143. $users = $wp_user_search->get_results();
  144. if ( !empty( $users ) && is_array( $users ) ) {
  145. foreach ( $users as $user ) {
  146. $user_object = new WP_User( $user );
  147. if ( $user_object->has_cap( $id ) ) {
  148. $user_object->remove_role( $id );
  149. $user_object->set_role( $default_role );
  150. }
  151. }
  152. }
  153. remove_role( $id );
  154. $roles = array();
  155. foreach ( $wp_roles->role_objects as $key => $role ) {
  156. $count = $this->count_users( $key );
  157. $roles[ $key ] = array(
  158. 'id' => $key,
  159. 'label' => $wp_roles->role_names[ $key ],
  160. 'name' => $key,
  161. 'capabilities' => count( (array) $role->capabilities ),
  162. 'users' => sprintf( _n( '%s User', '%s Users', $count, 'pods' ), $count )
  163. );
  164. if ( $default_role == $key )
  165. $roles[ $key ][ 'label' ] .= ' (site default)';
  166. if ( 0 < $count && ( is_super_admin() || current_user_can( 'delete_users' ) || current_user_can( 'list_users' ) ) ) {
  167. $roles[ $key ][ 'users' ] .= '<br /><a href="'
  168. . admin_url( esc_url( 'users.php?role=' . $key ) ) . '">'
  169. . __( 'View Users', 'pods' ) . '</a>';
  170. }
  171. }
  172. $name = $obj->data[ $id ][ 'label' ] . ' (' . $obj->data[ $id ][ 'name' ] . ')';
  173. $obj->data = $roles;
  174. $obj->total = count( $roles );
  175. $obj->total_found = count( $roles );
  176. $obj->message( '<strong>' . $name . '</strong> ' . __( 'role removed from site.', 'pods' ) );
  177. }
  178. /**
  179. * Handle the Add Role AJAX
  180. *
  181. * @param $params
  182. * @return mixed|void
  183. */
  184. public function ajax_add ( $params ) {
  185. global $wp_roles;
  186. $role_name = pods_var_raw( 'role_name', $params );
  187. $role_label = pods_var_raw( 'role_label', $params );
  188. $params->capabilities = (array) pods_var_raw( 'capabilities', $params, array() );
  189. $params->custom_capabilities = (array) pods_var_raw( 'custom_capabilities', $params, array() );
  190. $params->custom_capabilities = array_filter( array_unique( $params->custom_capabilities ) );
  191. $capabilities = array();
  192. foreach ( $params->capabilities as $capability => $x ) {
  193. if ( empty( $capability ) || true !== (boolean) $x )
  194. continue;
  195. $capabilities[ esc_attr( $capability ) ] = true;
  196. }
  197. foreach ( $params->custom_capabilities as $x => $capability ) {
  198. if ( empty( $capability ) || '--1' == $x )
  199. continue;
  200. $capabilities[ esc_attr( $capability ) ] = true;
  201. }
  202. if ( empty( $role_name ) )
  203. return pods_error( __( 'Role name is required', 'pods' ) );
  204. if ( empty( $role_label ) )
  205. return pods_error( __( 'Role label is required', 'pods' ) );
  206. if ( !isset( $wp_roles ) )
  207. $wp_roles = new WP_Roles();
  208. return $wp_roles->add_role( $role_name, $role_label, $capabilities );
  209. }
  210. /**
  211. * Handle the Edit Role AJAX
  212. *
  213. * @todo allow rename role_label
  214. *
  215. * @param $params
  216. * @return bool|mixed|void
  217. */
  218. public function ajax_edit ( $params ) {
  219. global $wp_roles;
  220. $capabilities = $this->get_capabilities();
  221. $params->capabilities = (array) pods_var_raw( 'capabilities', $params, array() );
  222. $params->custom_capabilities = (array) pods_var_raw( 'custom_capabilities', $params, array() );
  223. $params->custom_capabilities = array_filter( array_unique( $params->custom_capabilities ) );
  224. if ( !isset( $params->id ) || empty( $params->id ) || !isset( $wp_roles->role_objects[ $params->id ] ) )
  225. return pods_error( __( 'Role not found, cannot edit it.', 'pods' ) );
  226. $role = $wp_roles->role_objects[ $params->id ];
  227. $role_name = $params->id;
  228. $role_label = $wp_roles->role_names[ $params->id ];
  229. $role_capabilities = $role->capabilities;
  230. $new_capabilities = array();
  231. foreach ( $params->capabilities as $capability => $x ) {
  232. if ( empty( $capability ) || true !== (boolean) $x )
  233. continue;
  234. $new_capabilities[] = esc_attr( $capability );
  235. if ( !$role->has_cap( $capability ) )
  236. $role->add_cap( $capability );
  237. }
  238. foreach ( $params->custom_capabilities as $x => $capability ) {
  239. if ( empty( $capability ) )
  240. continue;
  241. if ( in_array( $capability, $new_capabilities ) )
  242. continue;
  243. $new_capabilities[] = esc_attr( $capability );
  244. if ( !$role->has_cap( $capability ) )
  245. $role->add_cap( $capability );
  246. }
  247. foreach ( $role_capabilities as $capability => $x ) {
  248. if ( !in_array( $capability, $new_capabilities ) )
  249. $role->remove_cap( $capability );
  250. }
  251. return true;
  252. }
  253. /**
  254. * Basic logic from Members plugin, it counts users of a specific role
  255. *
  256. * @param $role
  257. *
  258. * @return array
  259. */
  260. function count_users ( $role ) {
  261. $count_users = count_users();
  262. $avail_roles = array();
  263. foreach ( $count_users[ 'avail_roles' ] as $count_role => $count ) {
  264. $avail_roles[ $count_role ] = $count;
  265. }
  266. if ( empty( $role ) )
  267. return $avail_roles;
  268. if ( !isset( $avail_roles[ $role ] ) )
  269. $avail_roles[ $role ] = 0;
  270. return $avail_roles[ $role ];
  271. }
  272. function get_capabilities () {
  273. global $wp_roles;
  274. $default_caps = $this->get_wp_capabilities();
  275. $role_caps = array();
  276. foreach ( $wp_roles->role_objects as $key => $role ) {
  277. if ( is_array( $role->capabilities ) ) {
  278. foreach ( $role->capabilities as $cap => $grant ) {
  279. $role_caps[ $cap ] = $cap;
  280. }
  281. }
  282. }
  283. $role_caps = array_unique( $role_caps );
  284. $plugin_caps = array(
  285. 'pods_roles_list',
  286. 'pods_roles_add',
  287. 'pods_roles_delete',
  288. 'pods_roles_edit',
  289. 'restrict_content'
  290. );
  291. $capabilities = array_merge( $default_caps, $role_caps, $plugin_caps );
  292. // To support Members filters
  293. $capabilities = apply_filters( 'members_get_capabilities', $capabilities );
  294. $capabilities = apply_filters( 'pods_roles_get_capabilities', $capabilities );
  295. sort( $capabilities );
  296. $capabilities = array_unique( $capabilities );
  297. return $capabilities;
  298. }
  299. function get_wp_capabilities () {
  300. $defaults = array(
  301. 'activate_plugins',
  302. 'add_users',
  303. 'create_users',
  304. 'delete_others_pages',
  305. 'delete_others_posts',
  306. 'delete_pages',
  307. 'delete_plugins',
  308. 'delete_posts',
  309. 'delete_private_pages',
  310. 'delete_private_posts',
  311. 'delete_published_pages',
  312. 'delete_published_posts',
  313. 'delete_users',
  314. 'edit_dashboard',
  315. 'edit_files',
  316. 'edit_others_pages',
  317. 'edit_others_posts',
  318. 'edit_pages',
  319. 'edit_plugins',
  320. 'edit_posts',
  321. 'edit_private_pages',
  322. 'edit_private_posts',
  323. 'edit_published_pages',
  324. 'edit_published_posts',
  325. 'edit_theme_options',
  326. 'edit_themes',
  327. 'edit_users',
  328. 'import',
  329. 'install_plugins',
  330. 'install_themes',
  331. 'list_users',
  332. 'manage_categories',
  333. 'manage_links',
  334. 'manage_options',
  335. 'moderate_comments',
  336. 'promote_users',
  337. 'publish_pages',
  338. 'publish_posts',
  339. 'read',
  340. 'read_private_pages',
  341. 'read_private_posts',
  342. 'remove_users',
  343. 'switch_themes',
  344. 'unfiltered_html',
  345. 'unfiltered_upload',
  346. 'update_core',
  347. 'update_plugins',
  348. 'update_themes',
  349. 'upload_files'
  350. );
  351. return $defaults;
  352. }
  353. function get_default_capabilities () {
  354. $capabilities = array(
  355. 'read'
  356. );
  357. // To support Members filters
  358. $capabilities = apply_filters( 'members_new_role_default_capabilities', $capabilities );
  359. $capabilities = apply_filters( 'pods_roles_default_capabilities', $capabilities );
  360. return $capabilities;
  361. }
  362. function remove_deprecated_capabilities ( $capabilities ) {
  363. $deprecated_capabilities = array(
  364. 'level_0',
  365. 'level_1',
  366. 'level_2',
  367. 'level_3',
  368. 'level_4',
  369. 'level_5',
  370. 'level_6',
  371. 'level_7',
  372. 'level_8',
  373. 'level_9',
  374. 'level_10'
  375. );
  376. $capabilities = array_diff( $capabilities, $deprecated_capabilities );
  377. return $capabilities;
  378. }
  379. }