{"id":340504,"date":"2026-07-31T04:39:18","date_gmt":"2026-07-31T04:39:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/key-manager\/"},"modified":"2026-07-31T04:39:07","modified_gmt":"2026-07-31T04:39:07","slug":"niic-key-cabinet-manager","status":"publish","type":"plugin","link":"https:\/\/brx.wordpress.org\/plugins\/niic-key-cabinet-manager\/","author":16185554,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.4.0","stable_tag":"2.4.0","tested":"7.0.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"NIIC Key Cabinet Manager","header_author":"","header_description":"Match a physical key's Core Mark to its Key Code (cabinet slot) and room, track quantity on hand, log who a key is checked out to, and import\/export your Keys and Rooms lists as CSV. Add the [niic_key_cabinet] shortcode to any page; Administrators and Editors can use it by default.","assets_banners_color":"","last_updated":"2026-07-31 04:39:07","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":67,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.4.0":{"tag":"2.4.0","author":"jpmcdon","date":"2026-07-31 04:39:07"}},"upgrade_notice":{"2.4.0":"<p>Internal code-quality and security fixes (input sanitization, function naming, prepared SQL). Requires WordPress 6.2 or later now. No visible behavior change and no database changes \u2014 safe to update.<\/p>","2.3.0":"<p>Plugin renamed from &quot;Keysmith&quot; to &quot;NIIC Key Cabinet Manager&quot; (required by WordPress.org \u2014 the prior name conflicted with an existing project). Update the shortcode on any page from [keysmith] to [niic_key_cabinet]. Your data is not affected.<\/p>","2.2.0":"<p>Plugin renamed from &quot;Key Manager&quot; to &quot;Keysmith.&quot; Update the shortcode on any page from [key_manager] to [keysmith]. Your data is not affected.<\/p>","2.1.0":"<p>Access is now restricted to Administrators and Editors by default (previously any logged-in account could use the tool). If staff with other roles were using it, grant them the manage_key_inventory capability after updating \u2014 see the FAQ.<\/p>","2.0.0":"<p>Adds CSV import\/export for Keys and Rooms. Safe to update from any earlier version; no database changes are required.<\/p>","1.1.1":"<p>Fixes a search bug where rooms without an assigned key were invisible to search. Safe to update from any earlier version.<\/p>","1.1.0":"<p>Renames key\/pin fields (Core Mark \/ Key Code) and adds key checkout tracking. Existing data is migrated automatically on activation.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3630309,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3630309,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3630309,"resolution":false,"location":"assets","locale":false}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.4.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Search \u2014 look up a key by room number, Core Mark, or Key Code.","2":"Keys list \u2014 Core Mark, Key Code, quantity on hand, and linked rooms.","3":"Rooms list \u2014 room number, building, floor, linked keys, and notes.","4":"Assignments \u2014 check a key out to a person and see current checkouts at a glance."}},"plugin_section":[],"plugin_tags":[3148,148401,6601,273952,18914],"plugin_category":[45],"plugin_contributors":[273953],"plugin_business_model":[],"class_list":["post-340504","plugin","type-plugin","status-publish","hentry","plugin_tags-checkout","plugin_tags-facilities","plugin_tags-inventory","plugin_tags-key-management","plugin_tags-keys","plugin_category-ecommerce","plugin_contributors-jpmcdon","plugin_committers-jpmcdon"],"banners":[],"icons":{"svg":"https:\/\/ps.w.org\/niic-key-cabinet-manager\/assets\/icon.svg?rev=3630309","icon":"https:\/\/ps.w.org\/niic-key-cabinet-manager\/assets\/icon.svg?rev=3630309","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>NIIC Key Cabinet Manager helps you keep track of a large physical key inventory: which cabinet slot a key lives in, which room(s) it opens, how many copies you have, and who currently has one checked out.<\/p>\n\n<p>It's built for organizations managing dozens to hundreds of physical keys \u2014 front desks, facilities teams, property managers \u2014 who need a simple lookup tool without standing up separate software or accounts.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li><strong>Rooms<\/strong> \u2014 track room number, building, floor, and notes on what the room is used for.<\/li>\n<li><strong>Keys<\/strong> \u2014 each key has a Core Mark (the code stamped on the physical key) and a Key Code (its cabinet slot\/pin), plus a quantity on hand. A key can open multiple rooms, and a room can have multiple keys (e.g. a master key plus an individual key).<\/li>\n<li><strong>Search<\/strong> \u2014 one search box matches room number, Core Mark, or Key Code, and shows the match whether or not a key\/room link has been made yet.<\/li>\n<li><strong>Assignments<\/strong> \u2014 check a key out to a person (name, organization, email, phone), see everything currently checked out at a glance, and check items back in. Assignment history is kept even if the underlying key is later deleted.<\/li>\n<li><strong>CSV import\/export<\/strong> \u2014 export your full Keys or Rooms list to CSV, edit it in a spreadsheet, and re-import it. Existing rows are matched and updated by Core Mark or Room Number; new rows are created. Handy for bulk-loading an inventory or making mass edits.<\/li>\n<li><strong>No separate accounts<\/strong> \u2014 uses your existing WordPress logins, gated by a dedicated capability rather than a separate password system to manage.<\/li>\n<li><strong>No external services<\/strong> \u2014 all data lives in your WordPress database. Nothing is sent to a third party.<\/li>\n<\/ul>\n\n<p><strong>How it works<\/strong><\/p>\n\n<p>Add the <code>[niic_key_cabinet]<\/code> shortcode to any page. Logged-out visitors see a login prompt; <strong>Administrators and Editors<\/strong> see the full tool (Search, Keys, Rooms, Assignments) right on that page by default. Everyone else (Author, Contributor, Subscriber, or any other role) is logged in but told they don't have access.<\/p>\n\n<p><strong>Access control<\/strong><\/p>\n\n<p>The plugin defines its own capability, <code>manage_key_inventory<\/code>, and grants it to the Administrator and Editor roles when it's activated (or updated to this version). This gate applies everywhere \u2014 the page itself, and every underlying save\/delete\/check-out\/import\/export action \u2014 not just the visible menu, so a role without the capability can't reach the data by any route.<\/p>\n\n<p>If you need a different role (or one specific person) to have access, no settings screen is needed \u2014 a developer (or a free role-editor plugin) can grant the capability directly, e.g.:<\/p>\n\n<pre><code>get_role( 'author' )-&gt;add_cap( 'manage_key_inventory' );\n<\/code><\/pre>\n\n<p>This only ever needs to be run once; WordPress remembers role capabilities in the database.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>niic-key-cabinet-manager<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the plugin zip through the WordPress admin <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong> screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Create (or edit) a page and add the <code>[niic_key_cabinet]<\/code> shortcode to its content.<\/li>\n<li>Visit that page while logged in to start adding rooms and keys.<\/li>\n<\/ol>\n\n<p>No configuration screen is needed \u2014 the plugin creates its own database tables on activation.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20to%20create%20new%20logins%20for%20my%20staff%3F\"><h3>Do I need to create new logins for my staff?<\/h3><\/dt>\n<dd><p>No. NIIC Key Cabinet Manager uses your existing WordPress user accounts \u2014 anyone with an Administrator or Editor account (the default access level) can use the tool as soon as it's activated.<\/p><\/dd>\n<dt id=\"can%20i%20limit%20this%20to%20certain%20user%20roles%3F\"><h3>Can I limit this to certain user roles?<\/h3><\/dt>\n<dd><p>It's already scoped to Administrators and Editors by default, not every logged-in account. There's no settings screen for changing that yet \u2014 to grant access to a different role or a single user, add the <code>manage_key_inventory<\/code> capability to it (see \"Access control\" above), or use a free role-editor plugin. To narrow it further (e.g. Administrators only), remove the capability from the Editor role: <code>get_role( 'editor' )-&gt;remove_cap( 'manage_key_inventory' );<\/code><\/p><\/dd>\n<dt id=\"what%20happens%20to%20assignment%20history%20if%20i%20delete%20a%20key%3F\"><h3>What happens to assignment history if I delete a key?<\/h3><\/dt>\n<dd><p>The assignment record is kept for your history\/audit trail; it will just display as \"(deleted key)\" instead of the key's Core Mark.<\/p><\/dd>\n<dt id=\"does%20this%20work%20on%20shared%2Fmanaged%20wordpress%20hosting%3F\"><h3>Does this work on shared\/managed WordPress hosting?<\/h3><\/dt>\n<dd><p>Yes. It's plain PHP and MySQL using WordPress's own <code>$wpdb<\/code> database layer \u2014 no Node, no external services, and no special server configuration required.<\/p><\/dd>\n<dt id=\"can%20one%20key%20open%20more%20than%20one%20room%2C%20or%20one%20room%20have%20more%20than%20one%20key%3F\"><h3>Can one key open more than one room, or one room have more than one key?<\/h3><\/dt>\n<dd><p>Yes, keys and rooms have a many-to-many relationship \u2014 useful for master keys that open several rooms, or rooms that have both an individual key and a master key.<\/p><\/dd>\n<dt id=\"what%20format%20does%20the%20csv%20import%2Fexport%20use%3F\"><h3>What format does the CSV import\/export use?<\/h3><\/dt>\n<dd><p>Keys export as Core Mark, Key Code, Quantity, Rooms, Notes \u2014 multiple linked rooms are separated by semicolons in the Rooms column (e.g. <code>204; 305A<\/code>). Rooms export as Room Number, Building, Floor, Notes. Column order doesn't matter on import, only the column names in the header row. Importing a Core Mark or Room Number that already exists updates that row instead of creating a duplicate; if a key's Rooms column references a room that doesn't exist yet, it's created automatically.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>Security\/code-quality fixes from the WordPress.org Plugins Team's manual review:\n\n<ul>\n<li>Form data that's temporarily stored for error-repopulation is now sanitized field-by-field on the way in, not just escaped on the way out.<\/li>\n<li>All internal function names, constants, transient\/option keys, and hook names were renamed from the \"km\"\/\"KM\" prefix (too short\/generic) to \"niickcm\"\/\"NIICKCM\", to avoid conflicting with other plugins.<\/li>\n<li>Every database query that used a table name inside the SQL string now passes it through <code>$wpdb-&gt;prepare()<\/code> using the <code>%i<\/code> identifier placeholder (WordPress 6.2+), rather than concatenating it directly.<\/li>\n<\/ul><\/li>\n<li>Raised the minimum WordPress version to 6.2 (required for the <code>%i<\/code> placeholder above).<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Renamed the plugin from \"Keysmith\" to \"NIIC Key Cabinet Manager\" at the request of the WordPress.org Plugins Team \u2014 \"Keysmith\" is an existing coined name associated with another project, and standalone coined names aren't accepted without prior ownership. The new name pairs a distinctive, owned prefix (NIIC) with a descriptive name, per their guidance. The shortcode changed from <code>[keysmith]<\/code> to <code>[niic_key_cabinet]<\/code> \u2014 update any page that uses it. No database changes.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Renamed the plugin from \"Key Manager\" to \"Keysmith\" (WordPress.org requires a distinctive name rather than a generic descriptive one). The shortcode changed from <code>[key_manager]<\/code> to <code>[keysmith]<\/code> \u2014 update any page that uses it. No database changes; your rooms, keys, and assignments are unaffected.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Changed: access is now restricted to Administrators and Editors by default, via a new <code>manage_key_inventory<\/code> capability, instead of any logged-in WordPress account. This applies to every action (viewing, saving, deleting, checking keys in\/out, CSV import\/export), not just the visible page. See \"Access control\" above if you need to grant access to another role.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Added CSV import and export for both the Keys list and the Rooms list, with matching by Core Mark \/ Room Number so re-importing updates existing rows instead of duplicating them.<\/li>\n<li>Changed the Key Code field's description from \"(cabinet pin)\" to \"(to replicate key)\" on the Key form.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed: Search only returned a room if it already had a key linked to it; a room with no key assigned yet would never appear, no matter what you searched. Search now finds rooms and keys independently.<\/li>\n<li>Added a Notes column to the Rooms list, showing what each room is used for.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Renamed \"Key Code\" to \"Core Mark\" and \"Cabinet Pin\" to \"Key Code\" throughout, with an automatic database migration that preserves existing data.<\/li>\n<li>Added the Assignments feature: check a key out to a person (name, organization, email, phone), and check it back in.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: Rooms, Keys, many-to-many room\/key linking, quantity tracking, and search, gated behind WordPress login.<\/li>\n<\/ul>","raw_excerpt":"Match physical keys to their cabinet code and room, track quantity on hand, and log who has each key checked out.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/340504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=340504"}],"author":[{"embeddable":true,"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jpmcdon"}],"wp:attachment":[{"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=340504"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=340504"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=340504"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=340504"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=340504"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/brx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=340504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}