You've already forked wp-fedistream
feat: Initial release v0.1.0
WP FediStream - Stream music over ActivityPub Features: - Custom post types: Artist, Album, Track, Playlist - Custom taxonomies: Genre, Mood, License - User roles: Artist, Label - Admin dashboard with statistics - Frontend templates and shortcodes - Audio player with queue management - ActivityPub integration with actor support - WooCommerce product types for albums/tracks - User library with favorites and history - Notification system (in-app and email) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
308
includes/Roles/Capabilities.php
Normal file
308
includes/Roles/Capabilities.php
Normal file
@@ -0,0 +1,308 @@
|
||||
<?php
|
||||
/**
|
||||
* User roles and capabilities.
|
||||
*
|
||||
* @package WP_FediStream
|
||||
*/
|
||||
|
||||
namespace WP_FediStream\Roles;
|
||||
|
||||
// Prevent direct file access.
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Capabilities class.
|
||||
*
|
||||
* Handles custom user roles and capabilities.
|
||||
*/
|
||||
class Capabilities {
|
||||
|
||||
/**
|
||||
* Post type capabilities.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private const POST_TYPE_CAPS = array(
|
||||
'fedistream_artist' => 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user