laipower/wp-content/plugins/easy-digital-downloads/includes/class-edd-roles.php

298 lines
8.8 KiB
PHP

<?php
/**
* Roles and Capabilities
*
* @package EDD
* @subpackage Roles
* @copyright Copyright (c) 2018, Easy Digital Downloads, LLC
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
* @since 1.4.4
*/
// Exit if accessed directly
defined( 'ABSPATH' ) || exit;
/**
* EDD_Roles Class
*
* This class handles the role creation and assignment of capabilities for those
* roles.
*
* These roles let us have Shop Accountants, Shop Workers, etc, each of whom
* can do certain things within the EDD store.
*
* @since 1.4.4
*/
class EDD_Roles {
/**
* Constructor.
*
* @since 1.4.4
*/
public function __construct() {
add_filter( 'map_meta_cap', array( $this, 'meta_caps' ), 10, 4 );
}
/**
* Add new shop roles with default WordPress capabilities.
*
* @since 1.4.4
*/
public function add_roles() {
add_role( 'shop_manager', __( 'Shop Manager', 'easy-digital-downloads' ), array(
'read' => true,
'edit_posts' => true,
'delete_posts' => true,
'unfiltered_html' => true,
'upload_files' => true,
'export' => true,
'import' => true,
'delete_others_pages' => true,
'delete_others_posts' => true,
'delete_pages' => true,
'delete_private_pages' => true,
'delete_private_posts' => true,
'delete_published_pages' => true,
'delete_published_posts' => true,
'edit_others_pages' => true,
'edit_others_posts' => true,
'edit_pages' => true,
'edit_private_pages' => true,
'edit_private_posts' => true,
'edit_published_pages' => true,
'edit_published_posts' => true,
'manage_categories' => true,
'manage_links' => true,
'moderate_comments' => true,
'publish_pages' => true,
'publish_posts' => true,
'read_private_pages' => true,
'read_private_posts' => true,
) );
add_role( 'shop_accountant', __( 'Shop Accountant', 'easy-digital-downloads' ), array(
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
) );
add_role( 'shop_worker', __( 'Shop Worker', 'easy-digital-downloads' ), array(
'read' => true,
'edit_posts' => false,
'upload_files' => true,
'delete_posts' => false,
) );
add_role( 'shop_vendor', __( 'Shop Vendor', 'easy-digital-downloads' ), array(
'read' => true,
'edit_posts' => false,
'upload_files' => true,
'delete_posts' => false,
) );
}
/**
* Add new shop-specific capabilities.
*
* @since 1.4.4
*/
public function add_caps() {
global $wp_roles;
if ( class_exists( 'WP_Roles' ) ) {
if ( ! isset( $wp_roles ) ) {
$wp_roles = new WP_Roles(); // WPCS: override ok.
}
}
if ( is_object( $wp_roles ) ) {
$wp_roles->add_cap( 'shop_manager', 'view_shop_reports' );
$wp_roles->add_cap( 'shop_manager', 'view_shop_sensitive_data' );
$wp_roles->add_cap( 'shop_manager', 'export_shop_reports' );
$wp_roles->add_cap( 'shop_manager', 'manage_shop_settings' );
$wp_roles->add_cap( 'shop_manager', 'manage_shop_discounts' );
$wp_roles->add_cap( 'administrator', 'view_shop_reports' );
$wp_roles->add_cap( 'administrator', 'view_shop_sensitive_data' );
$wp_roles->add_cap( 'administrator', 'export_shop_reports' );
$wp_roles->add_cap( 'administrator', 'manage_shop_discounts' );
$wp_roles->add_cap( 'administrator', 'manage_shop_settings' );
// Add the main post type capabilities.
$capabilities = $this->get_core_caps();
foreach ( $capabilities as $cap_group ) {
foreach ( $cap_group as $cap ) {
$wp_roles->add_cap( 'shop_manager', $cap );
$wp_roles->add_cap( 'administrator', $cap );
$wp_roles->add_cap( 'shop_worker', $cap );
}
}
$wp_roles->add_cap( 'shop_accountant', 'edit_products' );
$wp_roles->add_cap( 'shop_accountant', 'read_private_products' );
$wp_roles->add_cap( 'shop_accountant', 'view_shop_reports' );
$wp_roles->add_cap( 'shop_accountant', 'export_shop_reports' );
$wp_roles->add_cap( 'shop_accountant', 'edit_shop_payments' );
$wp_roles->add_cap( 'shop_vendor', 'edit_product' );
$wp_roles->add_cap( 'shop_vendor', 'edit_products' );
$wp_roles->add_cap( 'shop_vendor', 'delete_product' );
$wp_roles->add_cap( 'shop_vendor', 'delete_products' );
$wp_roles->add_cap( 'shop_vendor', 'publish_products' );
$wp_roles->add_cap( 'shop_vendor', 'edit_published_products' );
$wp_roles->add_cap( 'shop_vendor', 'upload_files' );
$wp_roles->add_cap( 'shop_vendor', 'assign_product_terms' );
}
}
/**
* Gets the core post type capabilities.
*
* @since 1.4.4
*
* @return array $capabilities Core post type capabilities.
*/
public function get_core_caps() {
$capabilities = array();
$capability_types = array( 'product', 'shop_payment', 'shop_discount' );
foreach ( $capability_types as $capability_type ) {
$capabilities[ $capability_type ] = array(
// Post type
"edit_{$capability_type}",
"read_{$capability_type}",
"delete_{$capability_type}",
"edit_{$capability_type}s",
"edit_others_{$capability_type}s",
"publish_{$capability_type}s",
"read_private_{$capability_type}s",
"delete_{$capability_type}s",
"delete_private_{$capability_type}s",
"delete_published_{$capability_type}s",
"delete_others_{$capability_type}s",
"edit_private_{$capability_type}s",
"edit_published_{$capability_type}s",
// Terms
"manage_{$capability_type}_terms",
"edit_{$capability_type}_terms",
"delete_{$capability_type}_terms",
"assign_{$capability_type}_terms",
// Custom
"view_{$capability_type}_stats",
"import_{$capability_type}s",
);
}
return $capabilities;
}
/**
* Map meta caps to primitive caps.
*
* @since 2.0
*
* @param array $caps Capabilities for meta capability.
* @param string $cap Capability name.
* @param int $user_id User ID.
* @param mixed $args Arguments.
*
* @return array $caps
*/
public function meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
// Ensure user ID is a valid integer.
$user_id = absint( $user_id );
switch ( $cap ) {
case 'view_product_stats':
if ( empty( $args[0] ) ) {
break;
}
$download = get_post( $args[0] );
// Bail if download was not found.
if ( empty( $download ) ) {
break;
}
// No stats for auto-drafts.
if ( 'auto-draft' === $download->post_status ) {
$caps = array( 'do_not_allow' );
break;
}
if ( user_can( $user_id, 'view_shop_reports' ) || absint( $download->post_author ) === $user_id ) {
$caps = array();
}
break;
}
return $caps;
}
/**
* Remove core post type capabilities (called on uninstall).
*
* @since 1.5.2
*/
public function remove_caps() {
global $wp_roles;
if ( class_exists( 'WP_Roles' ) ) {
if ( ! isset( $wp_roles ) ) {
$wp_roles = new WP_Roles(); // WPCS: override ok.
}
}
if ( is_object( $wp_roles ) ) {
/** Shop Manager Capabilities */
$wp_roles->remove_cap( 'shop_manager', 'view_shop_reports' );
$wp_roles->remove_cap( 'shop_manager', 'view_shop_sensitive_data' );
$wp_roles->remove_cap( 'shop_manager', 'export_shop_reports' );
$wp_roles->remove_cap( 'shop_manager', 'manage_shop_discounts' );
$wp_roles->remove_cap( 'shop_manager', 'manage_shop_settings' );
/** Site Administrator Capabilities */
$wp_roles->remove_cap( 'administrator', 'view_shop_reports' );
$wp_roles->remove_cap( 'administrator', 'view_shop_sensitive_data' );
$wp_roles->remove_cap( 'administrator', 'export_shop_reports' );
$wp_roles->remove_cap( 'administrator', 'manage_shop_discounts' );
$wp_roles->remove_cap( 'administrator', 'manage_shop_settings' );
/** Remove the Main Post Type Capabilities */
$capabilities = $this->get_core_caps();
foreach ( $capabilities as $cap_group ) {
foreach ( $cap_group as $cap ) {
$wp_roles->remove_cap( 'shop_manager', $cap );
$wp_roles->remove_cap( 'administrator', $cap );
$wp_roles->remove_cap( 'shop_worker', $cap );
}
}
/** Shop Accountant Capabilities */
$wp_roles->remove_cap( 'shop_accountant', 'edit_products' );
$wp_roles->remove_cap( 'shop_accountant', 'read_private_products' );
$wp_roles->remove_cap( 'shop_accountant', 'view_shop_reports' );
$wp_roles->remove_cap( 'shop_accountant', 'export_shop_reports' );
/** Shop Vendor Capabilities */
$wp_roles->remove_cap( 'shop_vendor', 'edit_product' );
$wp_roles->remove_cap( 'shop_vendor', 'edit_products' );
$wp_roles->remove_cap( 'shop_vendor', 'delete_product' );
$wp_roles->remove_cap( 'shop_vendor', 'delete_products' );
$wp_roles->remove_cap( 'shop_vendor', 'publish_products' );
$wp_roles->remove_cap( 'shop_vendor', 'edit_published_products' );
$wp_roles->remove_cap( 'shop_vendor', 'upload_files' );
}
}
}