array( 'edit_post' => 'edit_fedistream_artist', 'read_post' => 'read_fedistream_artist', 'delete_post' => 'delete_fedistream_artist', 'edit_posts' => 'edit_fedistream_artists', 'edit_others_posts' => 'edit_others_fedistream_artists', 'publish_posts' => 'publish_fedistream_artists', 'read_private_posts' => 'read_private_fedistream_artists', ), 'fedistream_album' => array( 'edit_post' => 'edit_fedistream_album', 'read_post' => 'read_fedistream_album', 'delete_post' => 'delete_fedistream_album', 'edit_posts' => 'edit_fedistream_albums', 'edit_others_posts' => 'edit_others_fedistream_albums', 'publish_posts' => 'publish_fedistream_albums', 'read_private_posts' => 'read_private_fedistream_albums', ), 'fedistream_track' => array( 'edit_post' => 'edit_fedistream_track', 'read_post' => 'read_fedistream_track', 'delete_post' => 'delete_fedistream_track', 'edit_posts' => 'edit_fedistream_tracks', 'edit_others_posts' => 'edit_others_fedistream_tracks', 'publish_posts' => 'publish_fedistream_tracks', 'read_private_posts' => 'read_private_fedistream_tracks', ), 'fedistream_playlist' => array( 'edit_post' => 'edit_fedistream_playlist', 'read_post' => 'read_fedistream_playlist', 'delete_post' => 'delete_fedistream_playlist', 'edit_posts' => 'edit_fedistream_playlists', 'edit_others_posts' => 'edit_others_fedistream_playlists', 'publish_posts' => 'publish_fedistream_playlists', 'read_private_posts' => 'read_private_fedistream_playlists', ), ); /** * Taxonomy capabilities. * * @var array */ private const TAXONOMY_CAPS = array( 'manage_fedistream_genres', 'manage_fedistream_moods', 'manage_fedistream_licenses', ); /** * Custom capabilities. * * @var array */ private const CUSTOM_CAPS = array( 'view_fedistream_stats', 'manage_fedistream_settings', ); /** * Get all custom capabilities. * * @return array Array of all custom capabilities. */ public static function get_all_capabilities(): array { $caps = array(); // Post type capabilities. foreach ( self::POST_TYPE_CAPS as $post_type_caps ) { $caps = array_merge( $caps, array_values( $post_type_caps ) ); } // Delete capabilities. $caps[] = 'delete_fedistream_artists'; $caps[] = 'delete_others_fedistream_artists'; $caps[] = 'delete_published_fedistream_artists'; $caps[] = 'delete_private_fedistream_artists'; $caps[] = 'delete_fedistream_albums'; $caps[] = 'delete_others_fedistream_albums'; $caps[] = 'delete_published_fedistream_albums'; $caps[] = 'delete_private_fedistream_albums'; $caps[] = 'delete_fedistream_tracks'; $caps[] = 'delete_others_fedistream_tracks'; $caps[] = 'delete_published_fedistream_tracks'; $caps[] = 'delete_private_fedistream_tracks'; $caps[] = 'delete_fedistream_playlists'; $caps[] = 'delete_others_fedistream_playlists'; $caps[] = 'delete_published_fedistream_playlists'; $caps[] = 'delete_private_fedistream_playlists'; // Taxonomy capabilities. $caps = array_merge( $caps, self::TAXONOMY_CAPS ); // Custom capabilities. $caps = array_merge( $caps, self::CUSTOM_CAPS ); return array_unique( $caps ); } /** * Get Artist role capabilities. * * @return array Array of capabilities for the Artist role. */ public static function get_artist_capabilities(): array { return array( // Core WordPress. 'read' => true, 'upload_files' => true, // Own artists. 'edit_fedistream_artists' => true, 'edit_published_fedistream_artists' => true, 'publish_fedistream_artists' => true, 'delete_fedistream_artists' => true, 'delete_published_fedistream_artists' => true, // Own albums. 'edit_fedistream_albums' => true, 'edit_published_fedistream_albums' => true, 'publish_fedistream_albums' => true, 'delete_fedistream_albums' => true, 'delete_published_fedistream_albums' => true, // Own tracks. 'edit_fedistream_tracks' => true, 'edit_published_fedistream_tracks' => true, 'publish_fedistream_tracks' => true, 'delete_fedistream_tracks' => true, 'delete_published_fedistream_tracks' => true, // Own playlists. 'edit_fedistream_playlists' => true, 'edit_published_fedistream_playlists' => true, 'publish_fedistream_playlists' => true, 'delete_fedistream_playlists' => true, 'delete_published_fedistream_playlists' => true, // View stats. 'view_fedistream_stats' => true, ); } /** * Get Label role capabilities. * * @return array Array of capabilities for the Label role. */ public static function get_label_capabilities(): array { $caps = self::get_artist_capabilities(); // Add label-specific capabilities. $label_caps = array( // Manage others' content. 'edit_others_fedistream_artists' => true, 'edit_others_fedistream_albums' => true, 'edit_others_fedistream_tracks' => true, 'edit_others_fedistream_playlists' => true, 'delete_others_fedistream_artists' => true, 'delete_others_fedistream_albums' => true, 'delete_others_fedistream_tracks' => true, 'delete_others_fedistream_playlists' => true, 'read_private_fedistream_artists' => true, 'read_private_fedistream_albums' => true, 'read_private_fedistream_tracks' => true, 'read_private_fedistream_playlists' => true, 'delete_private_fedistream_artists' => true, 'delete_private_fedistream_albums' => true, 'delete_private_fedistream_tracks' => true, 'delete_private_fedistream_playlists' => true, // Manage taxonomies. 'manage_fedistream_genres' => true, 'manage_fedistream_moods' => true, 'manage_fedistream_licenses' => true, // View stats. 'view_fedistream_stats' => true, ); return array_merge( $caps, $label_caps ); } /** * Add custom roles. * * @return void */ public static function add_roles(): void { // Remove existing roles first to ensure clean slate. remove_role( 'fedistream_artist' ); remove_role( 'fedistream_label' ); // Add Artist role. add_role( 'fedistream_artist', __( 'FediStream Artist', 'wp-fedistream' ), self::get_artist_capabilities() ); // Add Label role. add_role( 'fedistream_label', __( 'FediStream Label', 'wp-fedistream' ), self::get_label_capabilities() ); } /** * Remove custom roles. * * @return void */ public static function remove_roles(): void { remove_role( 'fedistream_artist' ); remove_role( 'fedistream_label' ); } /** * Add capabilities to administrator role. * * @return void */ public static function add_admin_capabilities(): void { $admin = get_role( 'administrator' ); if ( ! $admin ) { return; } // Add all custom capabilities. $all_caps = self::get_all_capabilities(); foreach ( $all_caps as $cap ) { $admin->add_cap( $cap ); } // Add management capability. $admin->add_cap( 'manage_fedistream_settings' ); } /** * Remove capabilities from administrator role. * * @return void */ public static function remove_admin_capabilities(): void { $admin = get_role( 'administrator' ); if ( ! $admin ) { return; } // Remove all custom capabilities. $all_caps = self::get_all_capabilities(); foreach ( $all_caps as $cap ) { $admin->remove_cap( $cap ); } $admin->remove_cap( 'manage_fedistream_settings' ); } /** * Install roles and capabilities. * * @return void */ public static function install(): void { self::add_roles(); self::add_admin_capabilities(); } /** * Uninstall roles and capabilities. * * @return void */ public static function uninstall(): void { self::remove_roles(); self::remove_admin_capabilities(); } }