{"id":288086,"date":"2026-03-26T20:11:30","date_gmt":"2026-03-26T20:11:30","guid":{"rendered":"https:\/\/en-gb.wordpress.org\/plugins\/kitgenix-document-manager\/"},"modified":"2026-05-07T13:17:53","modified_gmt":"2026-05-07T13:17:53","slug":"kitgenix-document-manager","status":"publish","type":"plugin","link":"https:\/\/ms.wordpress.org\/plugins\/kitgenix-document-manager\/","author":23310025,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.0","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"Kitgenix Document Manager","header_author":"Kitgenix","header_description":"Manage document downloads with stable links, version history, and private file access.","assets_banners_color":"b9aad7","last_updated":"2026-05-07 13:17:53","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/buymeacoffee.com\/kitgenix","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/kitgenix-document-manager\/","header_author_uri":"https:\/\/kitgenix.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":187,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"kitgenix","date":"2026-03-26 20:11:39"},"1.1.0":{"tag":"1.1.0","author":"kitgenix","date":"2026-05-07 13:17:53"}},"upgrade_notice":{"1.1.0":"<p>Adds batch uploads, granular access rules, signed share links, lifecycle scheduling, and document analytics so larger libraries can be distributed and audited more safely.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3492128,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3492128,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3492128,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3492128,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3525572,"resolution":"1","location":"assets","locale":"","width":2698,"height":1462},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3525572,"resolution":"2","location":"assets","locale":"","width":2698,"height":1462},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3525572,"resolution":"3","location":"assets","locale":"","width":2698,"height":1462},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3525572,"resolution":"4","location":"assets","locale":"","width":2696,"height":1462},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3525572,"resolution":"5","location":"assets","locale":"","width":3020,"height":1462}},"screenshots":{"1":"Documents tab with search, stable links, copy actions, and quick edit.","2":"Quick edit modal with file replacement, visibility, and version controls.","3":"Categories and Versions tabs for organisation and cleanup.","4":"Frontend tab with shortcode builder and document-card controls.","5":"Public document card output with preview image, metadata, and button."}},"plugin_section":[],"plugin_tags":[9054,5440,8848,22336,258727],"plugin_category":[],"plugin_contributors":[246171],"plugin_business_model":[],"class_list":["post-288086","plugin","type-plugin","status-publish","hentry","plugin_tags-documents","plugin_tags-downloads","plugin_tags-file-manager","plugin_tags-private-files","plugin_tags-stable-links","plugin_contributors-kitgenix","plugin_committers-kitgenix"],"banners":{"banner":"https:\/\/ps.w.org\/kitgenix-document-manager\/assets\/banner-772x250.png?rev=3492128","banner_2x":"https:\/\/ps.w.org\/kitgenix-document-manager\/assets\/banner-1544x500.png?rev=3492128","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kitgenix-document-manager\/assets\/icon-128x128.png?rev=3492128","icon_2x":"https:\/\/ps.w.org\/kitgenix-document-manager\/assets\/icon-256x256.png?rev=3492128","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kitgenix-document-manager\/assets\/screenshot-1.png?rev=3525572","caption":"Documents tab with search, stable links, copy actions, and quick edit."},{"src":"https:\/\/ps.w.org\/kitgenix-document-manager\/assets\/screenshot-2.png?rev=3525572","caption":"Quick edit modal with file replacement, visibility, and version controls."},{"src":"https:\/\/ps.w.org\/kitgenix-document-manager\/assets\/screenshot-3.png?rev=3525572","caption":"Categories and Versions tabs for organisation and cleanup."},{"src":"https:\/\/ps.w.org\/kitgenix-document-manager\/assets\/screenshot-4.png?rev=3525572","caption":"Frontend tab with shortcode builder and document-card controls."},{"src":"https:\/\/ps.w.org\/kitgenix-document-manager\/assets\/screenshot-5.png?rev=3525572","caption":"Public document card output with preview image, metadata, and button."}],"raw_content":"<!--section=description-->\n<p>Kitgenix Document Manager lets admins upload documents and share a stable link like:<\/p>\n\n<p>\/kitgenix-document-manager\/{slug}\/<\/p>\n\n<p>When you replace the file, the link stays the same and serves the new version.<\/p>\n\n<p>You can protect documents with login-only or restricted access rules, issue expiring signed share links for external recipients, schedule go-live\/archive\/expiry dates, and review view\/download analytics without changing the public URL.<\/p>\n\n<h3>Key Features<\/h3>\n\n<ul>\n<li>Stable links: replace the file without changing the URL<\/li>\n<li>Admin documents table with search, copy link, copy share link, and \u201cOpen link\u201d actions<\/li>\n<li>Bulk document actions: change visibility, assign categories, or move multiple documents to Trash in one step<\/li>\n<li>Copy shortcode quick action so editors can grab the correct embed snippet without opening another screen<\/li>\n<li>Quick edit modal (popup) for editing documents without leaving the table<\/li>\n<li>Document Categories: create categories and assign documents for easier organization<\/li>\n<li>Visibility controls: Public, Private, or Restricted documents<\/li>\n<li>Granular access rules: limit a document by role, capability, or specific WordPress user IDs<\/li>\n<li>Signed share links: expiring URLs for secure external distribution without creating a user account<\/li>\n<li>Lifecycle controls: available-from, archive-at, and expire-at dates enforced across stable links, shortcodes, and REST metadata<\/li>\n<li>Usage analytics: per-document view\/download counts, signed-share activity, last-access timestamps, and 30-day rollups<\/li>\n<li>Private behavior: redirect to login or return 403<\/li>\n<li>Serving mode: Inline (browser) or Download (attachment)<\/li>\n<li>Optional version history per document, including restore\/delete for older versions<\/li>\n<li>Bulk version cleanup: delete all old versions for a document (Versions tab + modal action)<\/li>\n<li>Select from Media Library: optionally pick an existing Media Library file instead of uploading<\/li>\n<li>Batch uploads: drag and drop multiple files to create document entries with shared defaults<\/li>\n<li>Shortcode Builder with AJAX-powered document search for generating single-document or multi-document embeds<\/li>\n<li>Document card shortcode with preview image, file type, file size, optional description, and configurable button styling<\/li>\n<li>REST API endpoint for fetching stable document metadata by slug<\/li>\n<li>Site Health test that checks the plugin upload directory exists and is writable<\/li>\n<li>Safer serving: correct Content-Type where possible, security headers, and conditional caching for public docs<\/li>\n<\/ul>\n\n<h3>Usage<\/h3>\n\n<ol>\n<li>Go to <strong>Kitgenix \u2192 Document Manager<\/strong><\/li>\n<li>Add a document (name + optional slug) and upload the initial file<\/li>\n<li>Copy the stable URL from the table and share it<\/li>\n<li>Configure visibility, role\/capability\/user access, signed share expiry, and optional go-live\/archive\/expiry dates as needed<\/li>\n<li>To update a document later, use <strong>Edit<\/strong> (modal) and upload a replacement file<\/li>\n<li>Copy the signed share link when you need temporary external access without a login<\/li>\n<li>Review per-document analytics to see recent views and downloads<\/li>\n<li>If <strong>Keep version history<\/strong> is enabled for that document, older files will appear in the Versions panel (restore\/delete)<\/li>\n<li>Use <strong>Batch Upload<\/strong> when you need to ingest multiple files at once with shared visibility, category, and versioning defaults<\/li>\n<li>Use bulk actions above the documents table when you need to update visibility, recategorize, or trash several documents together<\/li>\n<li>Use <strong>Copy shortcode<\/strong> or the <strong>Shortcode Builder<\/strong> when you want to embed document links or cards in content<\/li>\n<\/ol>\n\n<p>Categories:<\/p>\n\n<ul>\n<li>Use the <strong>Categories<\/strong> tab to add\/edit\/delete categories<\/li>\n<li>Assign a category when adding\/editing a document<\/li>\n<\/ul>\n\n<p>Note: Inline viewing works best for PDFs and images. Office documents (DOCX\/XLSX\/etc.) typically download because browsers can\u2019t render them natively.<\/p>\n\n<h3>Settings<\/h3>\n\n<p>Settings are available under the <strong>Settings<\/strong> tab:<\/p>\n\n<ul>\n<li>Allowed file extensions<\/li>\n<li>Default visibility (Public\/Private\/Restricted)<\/li>\n<li>Serving mode:\n\n<ul>\n<li>Inline (browser)<\/li>\n<li>Download (attachment)<\/li>\n<\/ul><\/li>\n<li>Versioning defaults (keep history by default, delete old versions when history is disabled)<\/li>\n<li>Private document behavior (login redirect or 403)<\/li>\n<li>Delete all plugin data on uninstall (optional)<\/li>\n<\/ul>\n\n<p>Per-document controls in the <strong>Documents<\/strong> screen and native CPT metabox include:<\/p>\n\n<ul>\n<li>Role, capability, and user ID access rules<\/li>\n<li>Signed share link expiry and generated signed URLs<\/li>\n<li>Available-from, archive-at, and expire-at lifecycle controls<\/li>\n<li>View\/download analytics with recent activity summaries<\/li>\n<\/ul>\n\n<p>Frontend card options are available under the <strong>Frontend<\/strong> tab:<\/p>\n\n<ul>\n<li>Default document card button label<\/li>\n<li>Button style (Outline or Solid)<\/li>\n<li>Preview image size<\/li>\n<li>File type\/file size alignment<\/li>\n<li>Button alignment<\/li>\n<li>Button colors (normal + hover)<\/li>\n<li>Option to open the \u201cView\u201d button in a new tab<\/li>\n<li>Toggle showing file type and file size<\/li>\n<li>Toggle showing document description<\/li>\n<li>Shortcode Builder (generate a shortcode for one or multiple documents)<\/li>\n<\/ul>\n\n<h3>Frontend Embeds<\/h3>\n\n<p>Use the built-in shortcodes when you want documents to appear directly inside posts, pages, or WooCommerce content:<\/p>\n\n<ul>\n<li><code>[kitgenix_document_manager_link slug=\"my-doc\"]<\/code> for a simple stable link<\/li>\n<li><code>[kitgenix_document_manager_document slug=\"my-doc\"]<\/code> for a document card with preview image, metadata, button styling, and optional description<\/li>\n<li><code>[kitgenix_document_manager_document slugs=\"doc-a,doc-b,doc-c\"]<\/code> to render multiple cards inline<\/li>\n<\/ul>\n\n<h3>Security &amp; Caching<\/h3>\n\n<ul>\n<li>Private, restricted, and signed-share document responses are not cached (no-store)<\/li>\n<li>Restricted access can be enforced by login state, role, capability, specific user IDs, or a valid signed share URL<\/li>\n<li>Public documents use conditional caching (ETag\/Last-Modified) so browsers\/CDNs can revalidate efficiently (including 304 Not Modified responses)<\/li>\n<li>Responses include security hardening headers like <code>X-Content-Type-Options: nosniff<\/code><\/li>\n<li>Private documents include <code>X-Robots-Tag: noindex, nofollow<\/code><\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin includes a shared \u201cKitgenix hub\u201d component in wp-admin which may fetch publicly available plugin metadata from WordPress.org using the WordPress core <code>plugins_api()<\/code> function (WordPress.org Plugins API).<\/p>\n\n<ul>\n<li>When it runs: only in wp-admin (Kitgenix plugin admin pages)<\/li>\n<li>Data sent: plugin slug(s) (no personal data)<\/li>\n<li>Data received: publicly available plugin information (e.g. active installs, ratings)<\/li>\n<li>Caching: responses are cached locally using transients for ~1 day:\n\n<ul>\n<li><code>kitgenix_hub_wporg_active_installs_v1<\/code><\/li>\n<li><code>kitgenix_hub_wporg_ratings_v1<\/code><\/li>\n<li><code>kitgenix_hub_wporg_media_v1<\/code><h3>Developer Notes (Internal Reference)<\/h3>\nThis section documents internal identifiers used by the plugin (useful for developers, debugging, and advanced users).<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>Options (Settings)<\/h4>\n\n<ul>\n<li>Option name: <code>kitgenix_document_manager_settings<\/code> (constant: <code>KITGENIX_DOCUMENT_MANAGER_OPTION_NAME<\/code>)<\/li>\n<li>Settings group: <code>kitgenix_document_manager_settings_group<\/code><\/li>\n<li>Keys (defaults):\n\n<ul>\n<li><code>allowed_extensions<\/code>: <code>[\"pdf\",\"doc\",\"docx\",\"xls\",\"xlsx\",\"ppt\",\"pptx\",\"txt\"]<\/code> (stored as an array; comma-separated strings are accepted and normalized)<\/li>\n<li><code>default_visibility<\/code>: <code>public<\/code> (public|private|restricted)<\/li>\n<li><code>serving_mode<\/code>: <code>attachment<\/code> (attachment|inline)<\/li>\n<li><code>keep_version_history<\/code>: <code>true<\/code><\/li>\n<li><code>delete_old_versions<\/code>: <code>false<\/code><\/li>\n<li><code>private_behavior<\/code>: <code>login<\/code> (login|403)<\/li>\n<li><code>delete_data_on_uninstall<\/code>: <code>false<\/code><\/li>\n<li><code>card_button_label<\/code>: <code>\"View\"<\/code><\/li>\n<li><code>card_button_style<\/code>: <code>\"outline\"<\/code> (outline|solid)<\/li>\n<li><code>card_open_new_tab<\/code>: <code>false<\/code><\/li>\n<li><code>card_show_file_type<\/code>: <code>true<\/code><\/li>\n<li><code>card_show_file_size<\/code>: <code>true<\/code><\/li>\n<li><code>card_show_description<\/code>: <code>false<\/code><\/li>\n<li><code>card_image_size<\/code>: <code>96<\/code> (px)<\/li>\n<li><code>card_meta_alignment<\/code>: <code>\"justify\"<\/code> (justify|left|center|right)<\/li>\n<li><code>card_button_alignment<\/code>: <code>\"center\"<\/code> (justify|left|center|right)<\/li>\n<li><code>card_button_text_color<\/code>: <code>\"\"<\/code> (hex or blank)<\/li>\n<li><code>card_button_bg_color<\/code>: <code>\"\"<\/code> (hex or blank)<\/li>\n<li><code>card_button_border_color<\/code>: <code>\"\"<\/code> (hex or blank)<\/li>\n<li><code>card_button_hover_text_color<\/code>: <code>\"\"<\/code> (hex or blank)<\/li>\n<li><code>card_button_hover_bg_color<\/code>: <code>\"\"<\/code> (hex or blank)<\/li>\n<li><code>card_button_hover_border_color<\/code>: <code>\"\"<\/code> (hex or blank)<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>Data Model<\/h4>\n\n<ul>\n<li>Custom Post Type: <code>kitgenix_dm_doc<\/code><\/li>\n<li>Taxonomy (categories): <code>kitgenix_dm_cat<\/code><\/li>\n<li>Capability: <code>manage_kitgenix_document_manager_documents<\/code> (assigned to Administrators and Shop Managers on activation)<\/li>\n<\/ul>\n\n<h4>Post Meta<\/h4>\n\n<ul>\n<li><code>_kitgenix_document_manager_current_attachment_id<\/code> (current attachment ID)<\/li>\n<li><code>_kitgenix_document_manager_description<\/code> (optional document description shown on cards)<\/li>\n<li><code>_kitgenix_document_manager_visibility<\/code> (<code>public<\/code>|<code>private<\/code>|<code>restricted<\/code>)<\/li>\n<li><code>_kitgenix_document_manager_access_roles<\/code> (array of allowed WordPress roles)<\/li>\n<li><code>_kitgenix_document_manager_access_capability<\/code> (optional required WordPress capability)<\/li>\n<li><code>_kitgenix_document_manager_access_user_ids<\/code> (array of allowed user IDs)<\/li>\n<li><code>_kitgenix_document_manager_share_expires_gmt<\/code> (signed share expiry in GMT)<\/li>\n<li><code>_kitgenix_document_manager_share_secret<\/code> (per-document signing secret)<\/li>\n<li><code>_kitgenix_document_manager_available_from_gmt<\/code> (go-live time in GMT)<\/li>\n<li><code>_kitgenix_document_manager_archive_at_gmt<\/code> (archive time in GMT)<\/li>\n<li><code>_kitgenix_document_manager_expires_at_gmt<\/code> (expiry time in GMT)<\/li>\n<li><code>_kitgenix_document_manager_versioning_enabled<\/code> (0|1)<\/li>\n<li><code>_kitgenix_document_manager_versions<\/code> (array of attachment IDs)<\/li>\n<li><code>_kitgenix_document_manager_analytics<\/code> (view\/download counters, signed-share counters, and daily buckets)<\/li>\n<\/ul>\n\n<h4>Stable Link Endpoint<\/h4>\n\n<ul>\n<li>Base path: <code>\/kitgenix-document-manager\/{slug}\/<\/code><\/li>\n<li>Query var: <code>kitgenix_document_manager_slug<\/code><\/li>\n<li>Signed-share query args: <code>kitgenix_dm_share<\/code>, <code>kitgenix_dm_expires<\/code>, <code>kitgenix_dm_sig<\/code><\/li>\n<\/ul>\n\n<h4>REST API<\/h4>\n\n<ul>\n<li><code>GET \/wp-json\/kitgenix-document-manager\/v1\/doc\/{slug}<\/code>\n\n<ul>\n<li>Returns: <code>slug<\/code>, <code>title<\/code>, <code>updated<\/code> (ISO 8601), <code>visibility<\/code>, <code>schedule_status<\/code>, <code>stable_url<\/code><\/li>\n<li>Protected, scheduled, archived, or expired documents return the same access state the stable link endpoint enforces<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>Shortcode<\/h4>\n\n<ul>\n<li><p><code>[kitgenix_document_manager_link slug=\"my-doc\" label=\"Download\"]<\/code><\/p>\n\n<ul>\n<li>If <code>label<\/code> is omitted, the document title is used.<\/li>\n<li>Protected, scheduled, archived, or expired documents render nothing when the current visitor cannot access them.<\/li>\n<\/ul><\/li>\n<li><p><code>[kitgenix_document_manager_document slug=\"my-doc\" button_label=\"View\"]<\/code><\/p>\n\n<ul>\n<li>Renders a small preview (thumbnail\/icon), the document title, file type, file size, and a \u201cView\u201d button.<\/li>\n<li>Protected, scheduled, archived, or expired documents render nothing when the current visitor cannot access them.<\/li>\n<li>Optional attributes: <code>button_style=\"outline\"|\"solid\"<\/code>, <code>image_size=\"96\"<\/code>, <code>meta_align=\"justify\"|\"left\"|\"center\"|\"right\"<\/code>, <code>button_align=\"justify\"|\"left\"|\"center\"|\"right\"<\/code>, <code>show_description=\"0\"|\"1\"<\/code>, <code>new_tab=\"0\"|\"1\"<\/code>, <code>show_type=\"0\"|\"1\"<\/code>, <code>show_size=\"0\"|\"1\"<\/code>.<\/li>\n<li>To render multiple documents inline, use <code>slugs<\/code> instead of <code>slug<\/code>, e.g. <code>[kitgenix_document_manager_document slugs=\"doc-a,doc-b,doc-c\"]<\/code>.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>Filters<\/h4>\n\n<ul>\n<li><code>kitgenix_document_manager_user_has_document_access<\/code>\n\n<ul>\n<li>Allows custom access systems to grant or deny a logged-in user after the built-in role\/capability\/user-ID checks run.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>Admin Actions (admin-post.php)<\/h4>\n\n<p>The Document Manager screen uses admin-post actions, including:<\/p>\n\n<ul>\n<li><code>kitgenix_document_manager_document_save<\/code>\n\n<ul>\n<li>Nonce field: <code>kitgenix_document_manager_document_nonce<\/code><\/li>\n<li>Nonce action: <code>kitgenix_document_manager_document_save<\/code><\/li>\n<\/ul><\/li>\n<li><code>kitgenix_document_manager_document_delete<\/code> (nonce query parameter <code>nonce<\/code>)<\/li>\n<li><code>kitgenix_document_manager_documents_bulk_action<\/code>\n\n<ul>\n<li>Nonce field: <code>kitgenix_document_manager_bulk_action_nonce<\/code><\/li>\n<li>Nonce action: <code>kitgenix_document_manager_documents_bulk_action<\/code><\/li>\n<\/ul><\/li>\n<li><code>kitgenix_document_manager_documents_bulk_upload<\/code>\n\n<ul>\n<li>Nonce field: <code>kitgenix_document_manager_bulk_upload_nonce<\/code><\/li>\n<li>Nonce action: <code>kitgenix_document_manager_documents_bulk_upload<\/code><\/li>\n<\/ul><\/li>\n<li><code>kitgenix_document_manager_version_restore<\/code> (nonce query parameter <code>nonce<\/code>)<\/li>\n<li><code>kitgenix_document_manager_version_delete<\/code> (nonce query parameter <code>nonce<\/code>)<\/li>\n<li><code>kitgenix_document_manager_versions_delete_all<\/code> (nonce query parameter <code>nonce<\/code>)<\/li>\n<li><code>kitgenix_document_manager_category_save<\/code>\n\n<ul>\n<li>Nonce field: <code>kitgenix_document_manager_category_nonce<\/code><\/li>\n<li>Nonce action: <code>kitgenix_document_manager_category_save<\/code><\/li>\n<\/ul><\/li>\n<li><code>kitgenix_document_manager_category_delete<\/code> (nonce query parameter <code>nonce<\/code>)<\/li>\n<\/ul>\n\n<p>WordPress action hook names for the above screen actions:<\/p>\n\n<ul>\n<li><code>admin_post_kitgenix_document_manager_document_save<\/code><\/li>\n<li><code>admin_post_kitgenix_document_manager_document_delete<\/code><\/li>\n<li><code>admin_post_kitgenix_document_manager_documents_bulk_action<\/code><\/li>\n<li><code>admin_post_kitgenix_document_manager_documents_bulk_upload<\/code><\/li>\n<li><code>admin_post_kitgenix_document_manager_version_restore<\/code><\/li>\n<li><code>admin_post_kitgenix_document_manager_version_delete<\/code><\/li>\n<li><code>admin_post_kitgenix_document_manager_versions_delete_all<\/code><\/li>\n<li><code>admin_post_kitgenix_document_manager_category_save<\/code><\/li>\n<li><code>admin_post_kitgenix_document_manager_category_delete<\/code><\/li>\n<\/ul>\n\n<p>Admin AJAX:<\/p>\n\n<ul>\n<li><code>wp_ajax_kitgenix_dm_search_docs<\/code> (used by the Shortcode Builder autocomplete)<\/li>\n<\/ul>\n\n<p>The (hidden) CPT edit screen metabox uses:<\/p>\n\n<ul>\n<li><code>kitgenix_document_manager_upload_initial<\/code> (nonce field <code>kitgenix_document_manager_file_nonce<\/code>)<\/li>\n<li><code>kitgenix_document_manager_replace_file<\/code> (nonce field <code>kitgenix_document_manager_file_nonce<\/code>)<\/li>\n<li>Visibility\/versioning meta save nonce:\n\n<ul>\n<li>Nonce field: <code>kitgenix_document_manager_meta_nonce<\/code><\/li>\n<li>Nonce action: <code>kitgenix_document_manager_save_meta<\/code><\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>Hooks, Filters &amp; Assets (Internal)<\/h4>\n\n<p>This list is intended as a comprehensive map of WordPress integration points used by the plugin.<\/p>\n\n<ul>\n<li><code>plugins_loaded<\/code> (bootstrap init)<\/li>\n<li><code>init<\/code> (register CPT\/taxonomy; add rewrite rules)<\/li>\n<li>Filter: <code>query_vars<\/code> (adds query var <code>kitgenix_document_manager_slug<\/code>)<\/li>\n<li><code>template_redirect<\/code> (serves stable link responses)<\/li>\n<li><code>rest_api_init<\/code> (registers REST route)<\/li>\n<li><code>admin_menu<\/code> (registers Kitgenix menu + Document Manager submenu)<\/li>\n<li><code>admin_head<\/code> (outputs Kitgenix admin menu icon CSS)<\/li>\n<li><code>admin_init<\/code> (registers Settings API option)<\/li>\n<li><code>admin_enqueue_scripts<\/code> (enqueues Kitgenix hub CSS; enqueues Document Manager admin assets)<\/li>\n<li><code>add_meta_boxes<\/code> (adds the CPT file\/visibility metaboxes)<\/li>\n<li><code>save_post<\/code> (saves visibility, versioning, access, signed-share, and scheduling meta)<\/li>\n<li><code>admin_post_kitgenix_document_manager_upload_initial<\/code> (metabox upload)<\/li>\n<li><code>admin_post_kitgenix_document_manager_replace_file<\/code> (metabox replace)<\/li>\n<li><code>admin_notices<\/code> (metabox success\/error notices via <code>kitgenix_dm_notice<\/code>)<\/li>\n<li>Filter: <code>manage_kitgenix_dm_doc_posts_columns<\/code> (adds list table columns)<\/li>\n<li><code>manage_kitgenix_dm_doc_posts_custom_column<\/code> (renders list table columns)<\/li>\n<li>Filter: <code>post_row_actions<\/code> (adds \u201cReplace File\u201d row action)<\/li>\n<li>Filter: <code>site_status_tests<\/code> (registers Site Health test)<\/li>\n<li>Shortcode: <code>kitgenix_document_manager_link<\/code><\/li>\n<\/ul>\n\n<p>Other admin UI identifiers:\n- Admin list-table column key: <code>kitgenix_dm_actions<\/code>\n- Version restore notice query arg: <code>kitgenix_version_restored=1<\/code><\/p>\n\n<p>Admin asset handles (wp-admin):<\/p>\n\n<ul>\n<li>Styles:\n\n<ul>\n<li><code>kitgenix-hub<\/code> (Kitgenix hub page)<\/li>\n<li><code>kitgenix-admin-ui<\/code> (shared Kitgenix admin UI)<\/li>\n<li><code>kitgenix-document-manager-admin<\/code> (Document Manager settings screen)<\/li>\n<\/ul><\/li>\n<li>Scripts:\n\n<ul>\n<li><code>kitgenix-admin-tabs<\/code> (shared Kitgenix tabs UI)<\/li>\n<li><code>kitgenix-document-manager-admin<\/code> (Document Manager admin JS)<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>Site Health (Internal)<\/h4>\n\n<ul>\n<li>Registers Site Health test ID: <code>kitgenix_document_manager_uploads<\/code> (checks uploads directory exists and is writable)<\/li>\n<\/ul>\n\n<h4>Notes (Internal)<\/h4>\n\n<ul>\n<li>Uninstall deletes a legacy transient <code>kitgenix_document_manager_site_health<\/code> for backwards compatibility, even though v1 does not set it.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to \/wp-content\/plugins\/<\/li>\n<li>Activate the plugin through the 'Plugins' menu.<\/li>\n<li>Go to Kitgenix -&gt; Document Manager.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20files%20stored%3F\"><h3>Where are files stored?<\/h3><\/dt>\n<dd><p>When you upload a document inside Document Manager, files are stored in:<\/p>\n\n<p>wp-content\/uploads\/kitgenix-document-manager\/<\/p>\n\n<p>If you select an existing file from the Media Library, the plugin uses that attachment\u2019s existing location inside your normal WordPress uploads directory.<\/p><\/dd>\n<dt id=\"why%20does%20my%20file%20download%20even%20in%20%E2%80%9Cinline%20%28browser%29%E2%80%9D%20mode%3F\"><h3>Why does my file download even in \u201cInline (browser)\u201d mode?<\/h3><\/dt>\n<dd><p>Browsers can only display some file types inline (PDFs, images, and many text types). For formats that the browser can\u2019t render (e.g. DOCX\/XLSX), the file will download.<\/p><\/dd>\n<dt id=\"my%20stable%20link%20returns%20404.%20what%20should%20i%20do%3F\"><h3>My stable link returns 404. What should I do?<\/h3><\/dt>\n<dd><p>Go to <strong>Settings \u2192 Permalinks<\/strong> and click <strong>Save Changes<\/strong> to flush rewrite rules.<\/p><\/dd>\n<dt id=\"can%20i%20restore%20an%20older%20file%3F\"><h3>Can I restore an older file?<\/h3><\/dt>\n<dd><p>Yes. Enable <strong>Keep version history<\/strong> for that document, then use <strong>Edit<\/strong> to open the modal and restore\/delete older versions from the Versions panel.<\/p><\/dd>\n<dt id=\"can%20i%20upload%20or%20update%20documents%20in%20bulk%3F\"><h3>Can I upload or update documents in bulk?<\/h3><\/dt>\n<dd><p>Yes. The Documents tab now includes a <strong>Batch Upload<\/strong> panel for drag-and-drop multi-file ingest plus bulk actions above the table for category changes, visibility updates, and moving several documents to Trash at once.<\/p><\/dd>\n<dt id=\"can%20i%20embed%20document%20cards%20or%20multiple%20documents%20on%20a%20page%3F\"><h3>Can I embed document cards or multiple documents on a page?<\/h3><\/dt>\n<dd><p>Yes. Use <code>[kitgenix_document_manager_document]<\/code> for a styled card and the <code>slugs<\/code> attribute when you want to render multiple documents in one block.<\/p><\/dd>\n<dt id=\"is%20there%20a%20rest%20api%20endpoint%20for%20documents%3F\"><h3>Is there a REST API endpoint for documents?<\/h3><\/dt>\n<dd><p>Yes. The plugin registers <code>GET \/wp-json\/kitgenix-document-manager\/v1\/doc\/{slug}<\/code> and respects private-document access rules.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0 (6 May 2026)<\/h4>\n\n<ul>\n<li>New: Added bulk document actions for moving multiple documents to Trash, changing visibility, and assigning or clearing categories from the Documents tab.<\/li>\n<li>New: Added drag-and-drop batch uploads that create one document per file with shared category, visibility, and version-history defaults.<\/li>\n<li>New: Added batch upload status notices so editors can see how many files were created and whether any files were skipped.<\/li>\n<li>New: Added restricted document access with per-document role, capability, and user-ID grants plus expiring signed share links.<\/li>\n<li>New: Added go-live, archive, and expiry controls that hide unavailable documents from stable links, shortcodes, and the REST metadata endpoint.<\/li>\n<li>New: Added document analytics for views, downloads, signed-share activity, and last-access timestamps, including 30-day rollups in the admin UI.<\/li>\n<li>Improvement: Extended the Documents tab, quick edit modal, native metabox, and admin columns to manage restricted access, lifecycle rules, and signed-share URLs in one place.<\/li>\n<\/ul>\n\n<h4>1.0.0 (18 March 2026)<\/h4>\n\n<ul>\n<li>New: Initial release.<\/li>\n<li>New: Added a document card shortcode for embedding a document preview with file type\/size and a \u201cView\u201d button (includes button label\/new tab\/field toggles and outline\/solid button style).<\/li>\n<li>New: Added a stable link endpoint: \/kitgenix-document-manager\/{slug}\/ (file can be replaced without changing the URL).<\/li>\n<li>New: Added a Document Manager admin area under the Kitgenix menu with tabs for Documents, Categories, Versions, Settings and Support.<\/li>\n<li>New: Added an admin documents table with search plus quick actions (copy link, open link, edit, replace file).<\/li>\n<li>New: Added a quick edit modal for editing documents without leaving the documents table.<\/li>\n<li>New: Added Document Categories (create\/manage categories and assign them to documents).<\/li>\n<li>New: Added per-document visibility (Public\/Private) plus private behavior options (redirect to login or return 403).<\/li>\n<li>New: Added file serving modes (inline vs download\/attachment) with safer inline handling.<\/li>\n<li>New: Added optional per-document version history, including restore and delete for older versions.<\/li>\n<li>New: Added bulk version cleanup tools (delete all old versions for a document via the Versions tab and modal actions).<\/li>\n<li>New: Added Media Library selection support (choose an existing Media Library file instead of uploading).<\/li>\n<li>New: Added settings for allowed file extensions plus sensible defaults for visibility, serving mode and versioning.<\/li>\n<li>Security: Added safer file serving with traversal checks, security headers, and conditional caching for public documents (ETag\/Last-Modified) while private documents are not cached (no-store).<\/li>\n<li>New: Added a Site Health test for the Kitgenix Document Manager uploads directory.<\/li>\n<li>Cleanup: Added uninstall behavior that removes plugin settings, with an option to delete all Document Manager data (documents and related attachments\/versions).<\/li>\n<li>UI: Improved the Kitgenix admin header layout and social icon links (compact icon buttons) across settings and the Kitgenix hub.<\/li>\n<li>Fix: Admin notices now display above the Kitgenix header using the WordPress standard notice area.<\/li>\n<li>Fix: Added defensive notice normalization to prevent notices being relocated into the header by other scripts.<\/li>\n<li>UI: Admin tables inside Kitgenix pages now use Kitgenix styling for a more consistent branded look.<\/li>\n<li>Fix: Added spacing between adjacent action links\/buttons (e.g., Edit\/Delete).<\/li>\n<li>Security: Normalised metabox and admin-post request handling so POST values are read only after nonce verification, and upload arrays are sanitized before use.<\/li>\n<li>Fix: Stream documents with validated file paths and safe response headers instead of reading file contents into memory for output.<\/li>\n<li>Fix: Escaped shared Kitgenix hub card media output for WordPress coding standards compliance.<\/li>\n<li>Maintenance: Updated the plugin Author URI to the public Kitgenix WordPress.org profile and replaced the old custom admin-menu icon CSS with the native Dashicons icon.<\/li>\n<\/ul>","raw_excerpt":"Manage document downloads with stable links, granular access, lifecycle scheduling, and usage analytics.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/288086","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=288086"}],"author":[{"embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kitgenix"}],"wp:attachment":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=288086"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=288086"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=288086"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=288086"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=288086"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=288086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}