{"id":324881,"date":"2026-06-18T17:07:18","date_gmt":"2026-06-18T17:07:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/simple-file-portal\/"},"modified":"2026-06-18T21:07:06","modified_gmt":"2026-06-18T21:07:06","slug":"kistenstein-club-document-portal","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/kistenstein-club-document-portal\/","author":23514309,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.0","stable_tag":"1.5.0","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Kistenstein Club Document Portal","header_author":"Stefan B\u00fchler","header_description":"A Nextcloud-style document portal for associations and sports clubs. Upload, organise, preview and manage files with role-based access, drag-and-drop move, soft-delete trash, audit log, ZIP download and bulk selection.","assets_banners_color":"2b6b48","last_updated":"2026-06-18 21:07:06","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/kistenstein-club-document-portal\/","header_author_uri":"https:\/\/www.linkedin.com\/in\/stefan-b%C3%BChler-780b97384\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":46,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.4.0":{"tag":"1.4.0","author":"kistenstein","date":"2026-06-18 17:06:50"},"1.5.0":{"tag":"1.5.0","author":"kistenstein","date":"2026-06-18 21:07:06"}},"upgrade_notice":{"1.5.0":"<p>Adds a block-editor block and optional data cleanup on uninstall. Recommended for all users.<\/p>","1.4.0":"<p>Important security update: protected files are now blocked from direct download and role areas are checked on view. Please update.<\/p>","1.3.2":"<p>Adds rich file metadata in the details panel (EXIF, PDF and Word document properties).<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3577600,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3577600,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3577600,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3577600,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"kcdp\/explorer":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"kcdp\/explorer","version":"1.5.0","title":"Document Portal","category":"widgets","icon":"portfolio","description":"Embed the document portal file explorer for one of your areas.","keywords":["file","document","folder","portal","download","members"],"textdomain":"kistenstein-club-document-portal","supports":{"html":false,"align":["wide","full"]},"attributes":{"folder":{"type":"string","default":"documents"},"managePassword":{"type":"boolean","default":false}},"editorScript":"kcdp-explorer-editor"}},"tagged_versions":["1.4.0","1.5.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3577853,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3577853,"resolution":"2","location":"assets","locale":"","width":1280,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3578077,"resolution":"3","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"The member file explorer \u2014 folders, drag-and-drop upload, search and per-file actions","2":"The setup wizard \u2014 choose your areas and how each one is protected (role\/group or shared password)","3":"The trash view \u2014 restore deleted items or remove them permanently, with configurable retention"}},"plugin_section":[],"plugin_tags":[24392,12813,8848,62997,22336],"plugin_category":[50],"plugin_contributors":[267762],"plugin_business_model":[],"class_list":["post-324881","plugin","type-plugin","status-publish","hentry","plugin_tags-document-library","plugin_tags-document-management","plugin_tags-file-manager","plugin_tags-member-area","plugin_tags-private-files","plugin_category-media","plugin_contributors-kistenstein","plugin_committers-kistenstein"],"banners":{"banner":"https:\/\/ps.w.org\/kistenstein-club-document-portal\/assets\/banner-772x250.png?rev=3577600","banner_2x":"https:\/\/ps.w.org\/kistenstein-club-document-portal\/assets\/banner-1544x500.png?rev=3577600","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kistenstein-club-document-portal\/assets\/icon-128x128.png?rev=3577600","icon_2x":"https:\/\/ps.w.org\/kistenstein-club-document-portal\/assets\/icon-256x256.png?rev=3577600","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kistenstein-club-document-portal\/assets\/screenshot-1.png?rev=3577853","caption":"The member file explorer \u2014 folders, drag-and-drop upload, search and per-file actions"},{"src":"https:\/\/ps.w.org\/kistenstein-club-document-portal\/assets\/screenshot-2.png?rev=3577853","caption":"The setup wizard \u2014 choose your areas and how each one is protected (role\/group or shared password)"},{"src":"https:\/\/ps.w.org\/kistenstein-club-document-portal\/assets\/screenshot-3.png?rev=3578077","caption":"The trash view \u2014 restore deleted items or remove them permanently, with configurable retention"}],"raw_content":"<!--section=description-->\n<p><strong>Kistenstein Club Document Portal<\/strong> turns any WordPress page into a private document library and member area \u2014 a Nextcloud-style file manager perfect for associations, clubs, sports teams and small organisations that need to share documents with their members.<\/p>\n\n<p>Members open a familiar file explorer with folders, drag-and-drop upload, PDF preview and search. Every area is protected \u2014 either by WordPress role\/group or by a single shared password \u2014 and files are delivered securely through WordPress so they can never be downloaded by guessing a URL.<\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong>Nextcloud-style file explorer<\/strong> \u2014 folder navigation with breadcrumb trail<\/li>\n<li><strong>Upload<\/strong> \u2014 button and drag-and-drop from desktop<\/li>\n<li><strong>PDF preview<\/strong> \u2014 inline browser preview via modal iframe, no download required<\/li>\n<li><strong>Drag-and-drop move<\/strong> \u2014 drag files or folders onto other folders or breadcrumb items to move them<\/li>\n<li><strong>Folder management<\/strong> \u2014 create, rename and delete folders<\/li>\n<li><strong>File management<\/strong> \u2014 rename and delete (soft-delete) files<\/li>\n<li><strong>Soft-delete trash<\/strong> \u2014 deleted items are kept for a configurable retention period (default 180 days)<\/li>\n<li><strong>Admin trash view<\/strong> \u2014 restore or permanently delete items; configurable retention directly in the trash panel<\/li>\n<li><strong>Two protection modes per area<\/strong> \u2014 choose for every area whether it is restricted to a WordPress role\/group, or unlocked with a single shared password<\/li>\n<li><strong>Upload permissions by role<\/strong> \u2014 define which WordPress role may upload, rename and delete files<\/li>\n<li><strong>Secure file delivery<\/strong> \u2014 all files are streamed through WordPress, and the upload folder is blocked from direct HTTP access, so protected files cannot be downloaded by guessing their URL<\/li>\n<li><strong>Page password manager<\/strong> \u2014 editors can view and update the shared password of a password-protected page directly inside the portal (optional)<\/li>\n<li><strong>Fully translatable<\/strong> \u2014 every string uses the <code>kistenstein-club-document-portal<\/code> text domain; the interface follows each user\u2019s WordPress language<\/li>\n<\/ul>\n\n<h4>How access protection works<\/h4>\n\n<p>When you set up an area in the wizard you pick one of two modes:<\/p>\n\n<ul>\n<li><strong>Only a specific role \/ group<\/strong> \u2014 only logged-in users who hold the chosen WordPress role can open the area. Each member needs their own WordPress account. Best when you want individual accounts (e.g. a board with named members).<\/li>\n<li><strong>Shared password<\/strong> \u2014 the area\u2019s page is protected with WordPress\u2019 built-in page password. Everyone uses the same password \u2014 no individual accounts needed. Best for a members\u2019 area where you simply hand out one password.<\/li>\n<\/ul>\n\n<p>In both cases files are delivered through WordPress and the storage folder is protected from direct access, so the chosen rule is always enforced \u2014 not just hidden in the listing.<\/p>\n\n<h4>Block editor<\/h4>\n\n<p>Prefer the block editor? Add the <strong>Document Portal<\/strong> block to any page and pick the folder in the sidebar \u2014 no shortcode required. The classic shortcodes below work exactly the same.<\/p>\n\n<h4>Shortcodes<\/h4>\n\n<pre><code>[kcdp_explorer folder=\"documents\"]\n<\/code><\/pre>\n\n<p>Renders a file explorer for the named sub-folder. The area\u2019s protection mode is configured in the setup wizard.<\/p>\n\n<pre><code>[kcdp_explorer folder=\"members\" manage_password=\"1\"]\n<\/code><\/pre>\n\n<p>Adds a shared-password manager panel for editors (requires the <strong>Password-Protected Page<\/strong> ID to be set under <strong>File Portal \u2192 Advanced<\/strong>).<\/p>\n\n<pre><code>[kcdp_trash]\n<\/code><\/pre>\n\n<p>Trash view with restore and permanent-delete actions. Visible to administrators only.<\/p>\n\n<pre><code>[kcdp_audit]\n<\/code><\/pre>\n\n<p>Audit log of all file actions (upload, download, delete, restore \u2026). Visible to administrators only.<\/p>\n\n<h4>Configuration<\/h4>\n\n<ol>\n<li>After activation you are taken to <strong>File Portal \u2192 Set Up<\/strong>.<\/li>\n<li>Tick the areas your association needs, name each page, and choose how each area is protected (role\/group or shared password).<\/li>\n<li>Pick which role may upload and manage files.<\/li>\n<li>Save \u2014 the pages are created automatically. Add <code>[kcdp_trash]<\/code> to a restricted admin page to manage deleted files.<\/li>\n<\/ol>\n\n<h4>Server requirements for protected areas<\/h4>\n\n<p>Protected files are blocked from direct download with an <code>.htaccess<\/code> file written into the upload folder. This is honoured by <strong>Apache<\/strong> and <strong>LiteSpeed<\/strong>. If you run <strong>nginx<\/strong>, add an equivalent rule that denies direct access to the portal\u2019s upload folder (e.g. <code>location ^~ \/wp-content\/uploads\/file-portal\/ { deny all; }<\/code>), so that protected files are only reachable through the plugin.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>When a file is deleted, the following metadata is stored in a trash index file on the server: the original file path, the WordPress user ID and display name of the user who deleted it, and the timestamps for deletion and scheduled expiry. The audit log additionally records, per action, the acting user, a timestamp and the request IP address. This data is stored only on your server and is never transmitted off-site.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In your dashboard go to <strong>Plugins \u2192 Add New<\/strong>, search for \"Kistenstein Club Document Portal\", and click <strong>Install Now<\/strong> (or upload the ZIP under <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>).<\/li>\n<li>Activate the plugin \u2014 you are taken straight to the <strong>File Portal \u2192 Set Up<\/strong> wizard.<\/li>\n<li>Choose your areas and how each is protected, then save. The pages are created for you.<\/li>\n<li>Or add the <strong>Document Portal<\/strong> block \/ <code>[kcdp_explorer folder=\"documents\"]<\/code> shortcode to any page yourself.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20the%20files%20stored%3F\"><h3>Where are the files stored?<\/h3><\/dt>\n<dd><p>All files are stored in your WordPress uploads directory, inside the sub-folder you configure (default: <code>wp-content\/uploads\/file-portal\/<\/code>). The trash folder (<code>.trash\/<\/code>) is protected with an <code>.htaccess<\/code> file to prevent direct HTTP access.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20deleted%20files%3F\"><h3>What happens to deleted files?<\/h3><\/dt>\n<dd><p>Deleted files are moved to a hidden trash folder rather than immediately destroyed. An administrator can restore them or delete them permanently from the <code>[kcdp_trash]<\/code> view. Items older than the configured retention period (default 180 days) are automatically purged on the next trash-list request.<\/p><\/dd>\n<dt id=\"can%20i%20have%20multiple%20explorers%20on%20the%20same%20page%3F\"><h3>Can I have multiple explorers on the same page?<\/h3><\/dt>\n<dd><p>Yes. Each <code>[kcdp_explorer folder=\"...\"]<\/code> instance is independent. Use a different <code>folder<\/code> value for each one.<\/p><\/dd>\n<dt id=\"which%20file%20types%20are%20allowed%20for%20upload%3F\"><h3>Which file types are allowed for upload?<\/h3><\/dt>\n<dd><p>By default: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, JPG, JPEG, PNG, ZIP. You can customise the list in <strong>Settings \u2192 File Portal<\/strong>.<\/p><\/dd>\n<dt id=\"how%20is%20this%20different%20from%20a%20normal%20media%20library%3F\"><h3>How is this different from a normal media library?<\/h3><\/dt>\n<dd><p>The WordPress media library is built for editors working inside wp-admin. This plugin gives your <em>members<\/em> a front-end file explorer on a normal page \u2014 with their own folders, drag-and-drop upload, search and access control \u2014 without giving them access to the dashboard.<\/p><\/dd>\n<dt id=\"can%20members%20access%20files%20without%20a%20wordpress%20account%3F\"><h3>Can members access files without a WordPress account?<\/h3><\/dt>\n<dd><p>Yes. Use the <strong>shared password<\/strong> mode: the area is protected by a single page password that you hand out to your members \u2014 no individual accounts required. For named, per-person access use the <strong>role\/group<\/strong> mode instead.<\/p><\/dd>\n<dt id=\"is%20it%20safe%3F%20can%20people%20download%20protected%20files%20directly%3F\"><h3>Is it safe? Can people download protected files directly?<\/h3><\/dt>\n<dd><p>No. Every file is streamed through WordPress after the access check, and the upload folder is blocked from direct HTTP access via <code>.htaccess<\/code>. Protected files cannot be reached by guessing their URL. (On nginx, add the deny rule shown above.)<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20with%20the%20block%20editor%3F\"><h3>Can I use it with the block editor?<\/h3><\/dt>\n<dd><p>Yes. Add the <strong>Document Portal<\/strong> block to any page and choose the folder in the block sidebar. The <code>[kcdp_explorer]<\/code> shortcode remains fully supported.<\/p><\/dd>\n<dt id=\"what%20is%20the%20maximum%20upload%20size%3F\"><h3>What is the maximum upload size?<\/h3><\/dt>\n<dd><p>Uploads use WordPress' standard handling, so the limit is whatever your server's <code>upload_max_filesize<\/code> \/ <code>post_max_size<\/code> allow. Ask your host to raise these if you need larger files.<\/p><\/dd>\n<dt id=\"can%20i%20translate%20the%20plugin%3F\"><h3>Can I translate the plugin?<\/h3><\/dt>\n<dd><p>Yes. The text domain is <code>kistenstein-club-document-portal<\/code> and the interface follows each user\u2019s WordPress language. German (de_DE and de_CH) is bundled; create additional <code>.po<\/code>\/<code>.mo<\/code> files in the <code>languages\/<\/code> folder, or use Loco Translate.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>New: <strong>Document Portal block<\/strong> for the block editor \u2014 insert the explorer without a shortcode and pick the folder in the sidebar<\/li>\n<li>New: <code>uninstall.php<\/code> \u2014 optionally remove all plugin data (options and audit table) when you delete the plugin; off by default so nothing is lost by accident<\/li>\n<li>Docs: rewritten readme \u2014 corrected the access-mode description (role\/group or shared password), fixed the menu paths, expanded the FAQ<\/li>\n<li>Housekeeping: minor polish and refreshed plugin assets<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: choose a protection mode per area in the setup wizard \u2014 public, restricted to a WordPress role\/group, or unlocked with a shared password<\/li>\n<li>New: the setup wizard now lets you set the shared password for an area directly, and explains each protection mode<\/li>\n<li>Security: the upload folder is now blocked from direct HTTP access; all files are streamed through WordPress so protected files can no longer be downloaded by guessing their URL (automatic migration on update)<\/li>\n<li>Security: role-protected areas now check the role for viewing, not only for editing<\/li>\n<li>Security: fixed possible stored XSS in the trash view (deleted-by name, file name, path are now escaped)<\/li>\n<li>i18n: the whole interface, including file-metadata labels, is now translatable and follows each user\u2019s WordPress language<\/li>\n<li>Improved error messages throughout the front-end (no more generic \u201c?\u201d)<\/li>\n<li>Add <code>[kcdp_audit]<\/code> audit-log shortcode documentation<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Add file metadata panel (Details): EXIF for images, Author\/Title for PDFs and Word documents (OLE2 + OOXML)<\/li>\n<li>Add image preview thumbnail in the details panel<\/li>\n<li>Fix: JS deployment path corrected, resolves 404 on sfp-frontend.js<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Add bulk ZIP download for selected files<\/li>\n<li>Add download count badge per file<\/li>\n<li>Add audit log with action filter and pagination<\/li>\n<li>Add drag-and-drop move between folders<\/li>\n<li>Add configurable trash retention directly in the trash panel<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Add soft-delete trash with restore and permanent-delete<\/li>\n<li>Add inline PDF preview modal<\/li>\n<li>Add private-folder support (login required)<\/li>\n<li>Add page-password manager for editors<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>File explorer with folder navigation, upload (button + drag-and-drop), PDF preview<\/li>\n<li>Folder create \/ rename \/ delete<\/li>\n<li>File rename \/ delete<\/li>\n<li>Settings page (Settings \u2192 File Portal)<\/li>\n<li>Role-based access control (configurable editor role)<\/li>\n<li>Fully translatable (text domain: kistenstein-club-document-portal)<\/li>\n<\/ul>","raw_excerpt":"A document library and member area for clubs and associations: upload, organise and share files with role or shared-password protection and a recycle  &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/324881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=324881"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kistenstein"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=324881"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=324881"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=324881"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=324881"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=324881"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=324881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}