wp_back/wp-content/plugins/wordpress-seo/admin/roles/class-abstract-role-manager.php
2024-05-20 15:37:46 +03:00

150 lines
3.4 KiB
PHP

<?php
/**
* WPSEO plugin file.
*
* @package WPSEO\Admin\Roles
*/
/**
* Abstract Role Manager template.
*/
abstract class WPSEO_Abstract_Role_Manager implements WPSEO_Role_Manager {
/**
* Registered roles.
*
* @var array
*/
protected $roles = [];
/**
* Registers a role.
*
* @param string $role Role to register.
* @param string $display_name Display name to use.
* @param string|null $template Optional. Role to base the new role on.
*
* @return void
*/
public function register( $role, $display_name, $template = null ) {
$this->roles[ $role ] = (object) [
'display_name' => $display_name,
'template' => $template,
];
}
/**
* Returns the list of registered roles.
*
* @return string[] List or registered roles.
*/
public function get_roles() {
return array_keys( $this->roles );
}
/**
* Adds the registered roles.
*
* @return void
*/
public function add() {
foreach ( $this->roles as $role => $data ) {
$capabilities = $this->get_capabilities( $data->template );
$capabilities = $this->filter_existing_capabilties( $role, $capabilities );
$this->add_role( $role, $data->display_name, $capabilities );
}
}
/**
* Removes the registered roles.
*
* @return void
*/
public function remove() {
$roles = array_keys( $this->roles );
array_map( [ $this, 'remove_role' ], $roles );
}
/**
* Returns the capabilities for the specified role.
*
* @param string $role Role to fetch capabilities from.
*
* @return array List of capabilities.
*/
protected function get_capabilities( $role ) {
if ( ! is_string( $role ) || empty( $role ) ) {
return [];
}
$wp_role = get_role( $role );
if ( ! $wp_role ) {
return [];
}
return $wp_role->capabilities;
}
/**
* Returns true if the capability exists on the role.
*
* @param WP_Role $role Role to check capability against.
* @param string $capability Capability to check.
*
* @return bool True if the capability is defined for the role.
*/
protected function capability_exists( WP_Role $role, $capability ) {
return ! array_key_exists( $capability, $role->capabilities );
}
/**
* Filters out capabilities that are already set for the role.
*
* This makes sure we don't override configurations that have been previously set.
*
* @param string $role The role to check against.
* @param array $capabilities The capabilities that should be set.
*
* @return array Capabilties that can be safely set.
*/
protected function filter_existing_capabilties( $role, array $capabilities ) {
if ( $capabilities === [] ) {
return $capabilities;
}
$wp_role = get_role( $role );
if ( ! $wp_role ) {
return $capabilities;
}
foreach ( $capabilities as $capability => $grant ) {
if ( $this->capability_exists( $wp_role, $capability ) ) {
unset( $capabilities[ $capability ] );
}
}
return $capabilities;
}
/**
* Adds a role to the system.
*
* @param string $role Role to add.
* @param string $display_name Name to display for the role.
* @param array $capabilities Capabilities to add to the role.
*
* @return void
*/
abstract protected function add_role( $role, $display_name, array $capabilities = [] );
/**
* Removes a role from the system.
*
* @param string $role Role to remove.
*
* @return void
*/
abstract protected function remove_role( $role );
}