post_status ) { return true; } if ( 'inherit' !== $post->post_status ) { return false; } // Zonder ouder is er niets om van over te nemen: los geüpload bestand. if ( ! $post->post_parent ) { return true; } $ouder = get_post( (int) $post->post_parent ); if ( ! $ouder ) { return true; } $status = get_post_status_object( $ouder->post_status ); return null !== $status && ! empty( $status->public ); } /** * Mag de gebruiker focusdata van deze attachment wijzigen? * * `edit_post` op de attachment-ID — niet `upload_files`, want dat mapt * alleen `create_posts` en zegt niets over een bestaand bestand. * * @param WP_REST_Request $request Het request. * @return true|WP_Error */ public static function can_edit( WP_REST_Request $request ) { $id = (int) $request['id']; if ( ! get_post( $id ) ) { return self::forbid( __( 'This media file does not exist.', 'yinga-focus' ), 404 ); } if ( current_user_can( 'edit_post', $id ) ) { return true; } return self::forbid( __( 'You are not allowed to edit this media file.', 'yinga-focus' ) ); } /** * Mag de gebruiker überhaupt met de mediabibliotheek werken? * * Poortwachter voor de bulk- en pending-routes. Per item wordt daarna * alsnog `edit_post` gecontroleerd — deze check zegt alleen dat het zinvol * is om de gebruiker binnen te laten. * * @return true|WP_Error */ public static function can_upload() { if ( current_user_can( 'upload_files' ) ) { return true; } return self::forbid( __( 'You have no access to the media library.', 'yinga-focus' ) ); } /** * Bouwt een geweigerd-antwoord met de juiste statuscode. * * 401 voor "log eerst in", 403 voor "jij mag dit niet" — het verschil * bepaalt of een client een inlogprompt toont of een foutmelding. * * @param string $message De melding. * @param int $status Statuscode; 0 = automatisch bepalen. * @return WP_Error */ private static function forbid( string $message, int $status = 0 ): WP_Error { if ( 0 === $status ) { $status = is_user_logged_in() ? 403 : 401; } return new WP_Error( 'yinga_focus_forbidden', $message, array( 'status' => $status ) ); } }