298 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			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' );
 | |
| 		}
 | |
| 	}
 | |
| }
 |