class-activation.php
4 months ago
class-admin-menu-organizer.php
4 months ago
class-admin-menu-svg-icon-mask.php
4 months ago
class-auto-publish-posts-with-missed-schedule.php
4 months ago
class-avif-upload.php
4 months ago
class-captcha-protection.php
4 months ago
class-change-login-url.php
4 months ago
class-cleanup-admin-bar.php
4 months ago
class-common-methods.php
4 months ago
class-content-duplication.php
4 months ago
class-content-order.php
4 months ago
class-custom-admin-footer-text.php
4 months ago
class-custom-body-class.php
4 months ago
class-custom-css.php
4 months ago
class-custom-nav-menu-items-in-new-tab.php
4 months ago
class-deactivation.php
4 months ago
class-disable-author-archives.php
4 months ago
class-disable-comments.php
4 months ago
class-disable-dashboard-widgets.php
4 months ago
class-disable-embeds.php
4 months ago
class-disable-feeds.php
4 months ago
class-disable-gutenberg.php
4 months ago
class-disable-rest-api.php
4 months ago
class-disable-smaller-components.php
4 months ago
class-disable-updates.php
4 months ago
class-disable-xml-rpc.php
4 months ago
class-display-system-summary.php
4 months ago
class-email-address-obfuscator.php
4 months ago
class-email-delivery.php
4 months ago
class-enhance-list-tables.php
4 months ago
class-external-permalinks.php
4 months ago
class-heartbeat-control.php
4 months ago
class-hide-admin-bar.php
4 months ago
class-hide-admin-notices.php
4 months ago
class-image-sizes-panel.php
4 months ago
class-image-upload-control.php
4 months ago
class-insert-head-body-footer-code.php
4 months ago
class-last-login-column.php
4 months ago
class-limit-login-attempts.php
4 months ago
class-login-id-type.php
4 months ago
class-login-logout-menu.php
4 months ago
class-maintenance-mode.php
4 months ago
class-manage-ads-appads-txt.php
4 months ago
class-manage-robots-txt.php
4 months ago
class-media-files-visibility-control.php
4 months ago
class-media-replacement.php
4 months ago
class-multiple-user-roles.php
4 months ago
class-obfuscate-author-slugs.php
4 months ago
class-open-external-links-in-new-tab.php
4 months ago
class-password-protection.php
4 months ago
class-redirect-after-login.php
4 months ago
class-redirect-after-logout.php
4 months ago
class-redirect-fourofour.php
4 months ago
class-registration-date-column.php
4 months ago
class-revisions-control.php
4 months ago
class-search-engines-visibility.php
4 months ago
class-settings-fields-render.php
4 months ago
class-settings-sanitization.php
4 months ago
class-settings-sections-fields.php
4 months ago
class-show-custom-taxonomy-filters.php
4 months ago
class-site-identity-on-login-page.php
4 months ago
class-svg-upload.php
4 months ago
class-various-admin-ui-enhancements.php
4 months ago
class-view-admin-as-role.php
4 months ago
class-wider-admin-menu.php
4 months ago
class-wp-config-transformer.php
4 months ago
class-media-files-visibility-control.php
97 lines
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * Media Library Access Control module. |
| 5 | * |
| 6 | * @package ASENHA |
| 7 | * @since 8.2.4 |
| 8 | */ |
| 9 | namespace ASENHA\Classes; |
| 10 | |
| 11 | // Exit if accessed directly. |
| 12 | if ( !defined( 'ABSPATH' ) ) { |
| 13 | exit; |
| 14 | } |
| 15 | /** |
| 16 | * Restrict Media Library/media modal attachment listings to the current user's uploads. |
| 17 | * |
| 18 | * Notes: |
| 19 | * - Restricts only attachment *listing* queries in wp-admin (Media Library list view and media modal/grid queries). |
| 20 | * - Does not affect frontend rendering, and does not block direct access to attachment URLs. |
| 21 | */ |
| 22 | class Media_Files_Visibility_Control { |
| 23 | /** |
| 24 | * Filter attachment query args for media modal / media grid. |
| 25 | * |
| 26 | * @param array $query_args WP_Query args for attachments. |
| 27 | * @return array |
| 28 | */ |
| 29 | public function filter_attachments_grid( $query_args ) { |
| 30 | if ( !is_admin() ) { |
| 31 | return $query_args; |
| 32 | } |
| 33 | if ( !$this->should_restrict_current_user() ) { |
| 34 | return $query_args; |
| 35 | } |
| 36 | $query_args['author'] = get_current_user_id(); |
| 37 | return $query_args; |
| 38 | } |
| 39 | |
| 40 | /** |
| 41 | * Restrict attachment list view in Media Library (`upload.php` list mode). |
| 42 | * |
| 43 | * @param \WP_Query $query Query instance. |
| 44 | * @return void |
| 45 | */ |
| 46 | public function filter_attachments_list( $query ) { |
| 47 | if ( !is_admin() ) { |
| 48 | return; |
| 49 | } |
| 50 | if ( !$query instanceof \WP_Query ) { |
| 51 | return; |
| 52 | } |
| 53 | if ( !$query->is_main_query() ) { |
| 54 | return; |
| 55 | } |
| 56 | // Only affect Media Library list screen. |
| 57 | global $pagenow; |
| 58 | if ( 'upload.php' !== $pagenow ) { |
| 59 | return; |
| 60 | } |
| 61 | $post_type = $query->get( 'post_type' ); |
| 62 | if ( 'attachment' !== $post_type && (!is_array( $post_type ) || !in_array( 'attachment', $post_type, true )) ) { |
| 63 | return; |
| 64 | } |
| 65 | if ( !$this->should_restrict_current_user() ) { |
| 66 | return; |
| 67 | } |
| 68 | $query->set( 'author', get_current_user_id() ); |
| 69 | } |
| 70 | |
| 71 | /** |
| 72 | * Determine whether the current user should be restricted to seeing only their own uploads. |
| 73 | * |
| 74 | * @return bool |
| 75 | */ |
| 76 | private function should_restrict_current_user() { |
| 77 | if ( !is_user_logged_in() ) { |
| 78 | return false; |
| 79 | } |
| 80 | // Administrators (and multisite super admins) can always see all media. |
| 81 | if ( current_user_can( 'manage_options' ) ) { |
| 82 | return false; |
| 83 | } |
| 84 | if ( is_multisite() && is_super_admin() ) { |
| 85 | return false; |
| 86 | } |
| 87 | // Only apply when the user can upload files (i.e., they are a relevant role for media). |
| 88 | if ( !current_user_can( 'upload_files' ) ) { |
| 89 | return false; |
| 90 | } |
| 91 | // Free behavior: restrict all non-admin upload-capable users. |
| 92 | $should_restrict = true; |
| 93 | return (bool) $should_restrict; |
| 94 | } |
| 95 | |
| 96 | } |
| 97 |