{"id":327156,"date":"2026-06-18T22:13:49","date_gmt":"2026-06-18T22:13:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kodlo-media-manager\/"},"modified":"2026-06-19T08:36:33","modified_gmt":"2026-06-19T08:36:33","slug":"kodlo-media-manager","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/kodlo-media-manager\/","author":23517482,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.7.4.1","stable_tag":"1.7.4.1","tested":"7.0","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"Kodlo Media Manager","header_author":"Kodlo","header_description":"Enforce custom format, size, and naming rules for uploads to keep your WordPress media library clean, organized, and optimized.","assets_banners_color":"","last_updated":"2026-06-19 08:36:33","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/kodlo.dev\/","header_plugin_uri":"","header_author_uri":"https:\/\/kodlo.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":74,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.7.4":{"tag":"1.7.4","author":"kodlo","date":"2026-06-19 08:26:16"},"1.7.4.1":{"tag":"1.7.4.1","author":"kodlo","date":"2026-06-19 08:36:33"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.7.4","1.7.4.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The settings interface integrated directly into the standard Media Settings screen.","2":"Client-side validation blocking invalid formats and duplicate filenames in the Media Uploader modal."}},"plugin_section":[],"plugin_tags":[29161,233,600,2904,15376],"plugin_category":[50,54],"plugin_contributors":[267796,267795],"plugin_business_model":[],"class_list":["post-327156","plugin","type-plugin","status-publish","hentry","plugin_tags-image-optimization","plugin_tags-media-library","plugin_tags-security","plugin_tags-svg","plugin_tags-webp","plugin_category-media","plugin_category-security-and-spam-protection","plugin_contributors-imaginary222","plugin_contributors-kodlo","plugin_committers-kodlo"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/kodlo-media-manager.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Keep Your WordPress Media Library Clean, Safe, and Supercharged!<\/strong><\/p>\n\n<p>Kodlo Media Manager is a lightweight, professional-grade media optimization, sanitation, and security plugin. Unlike other bloated plugins, it is built to run natively and seamlessly within the WordPress core ecosystem. It embeds directly into the standard Media Settings screen with a clean, modern dashboard that matches native WordPress aesthetics.<\/p>\n\n<p><strong>Need help?<\/strong> For questions, support, or feedback, contact us at <a href=\"mailto:hello@kodlo.dev\">hello@kodlo.dev<\/a> or visit our website at <a href=\"https:\/\/kodlo.dev\">kodlo.dev<\/a>.<\/p>\n\n<h3>Key Problems Solved by the Plugin<\/h3>\n\n<p>By default, WordPress allows users to upload unoptimized, oversized files with messy names and duplicates, potentially introducing security vulnerabilities like SVG-based XSS attacks. Kodlo Media Manager solves these issues with advanced server-side validation and sanitization:<\/p>\n\n<ol>\n<li><p><strong>Stop Duplicate Image Bloat:<\/strong>\nUploading the same image repeatedly wastes storage space and clutters the database. Our Duplicate Filename Guard checks the database before upload, warning users and blocking duplicate files, encouraging them to reuse existing assets.<\/p><\/li>\n<li><p><strong>Enforce Next-Gen Formats (WebP &amp; AVIF):<\/strong>\nLegacy formats like JPG, JPEG, and PNG slow down page load times. Globally block legacy formats and force users to upload optimized modern formats like <strong>WebP<\/strong> or <strong>AVIF<\/strong> for maximum speed and SEO performance.<\/p><\/li>\n<li><p><strong>Advanced Filename Sanitization &amp; Transliteration:<\/strong>\nFilenames with Cyrillic characters, accents, spaces, or special symbols cause broken links and database encoding bugs on many hosting setups. The plugin automatically transliterates non-Latin characters, removes accents, replaces spaces with clean separators, and sanitizes filenames using a custom regular expression pattern.<\/p><\/li>\n<li><p><strong>Custom File Size Limits per Format:<\/strong>\nPrevent users from uploading heavy PDF documents, video loops, or archives. You can specify precise maximum file size limits (in KB) for every file extension individually.<\/p><\/li>\n<li><p><strong>Control Image Resolutions &amp; Dimensions:<\/strong>\nOversized high-resolution images can crash servers during processing. Define custom maximum width and height limits for images. The plugin also overrides the WordPress big image threshold (2560px default) dynamically based on your custom rules to prevent scaling conflicts.<\/p><\/li>\n<li><p><strong>XML-Based SVG Security Sanitizer:<\/strong>\nSVG files are XML documents, making them vulnerable to JavaScript injection (Cross-Site Scripting - XSS) and XML External Entity (XXE) attacks. The plugin includes a robust XML parser-based sanitizer that strips malicious scripts, handlers (<code>on*<\/code>), and external links, making SVG uploads safe.<\/p><\/li>\n<li><p><strong>Smart Autocomplete &amp; Native UX:<\/strong>\nFeatures autocomplete suggestion lists for popular extensions and MIME types, auto-populates fields, dynamically hides inputs based on selected policies, and provides a fully responsive layout for seamless use on mobile devices.<\/p><\/li>\n<\/ol>\n\n<h3>Key Features<\/h3>\n\n<ul>\n<li><strong>Dynamic Upload Policies:<\/strong> Set formats to Allowed (Media Library Only), Allowed (Globally), or Blocked (Globally).<\/li>\n<li>Duplicate Filename Guard: Client and server-side duplicate check (can be disabled in settings).<\/li>\n<li><strong>Regex Filename Validator:<\/strong> Custom regular expression input to enforce strict naming conventions.<\/li>\n<li><strong>Auto-Sanitize Filenames:<\/strong> Automatic transliteration and formatting option that adjusts dynamically.<\/li>\n<li><strong>Format-Specific File Size Limits:<\/strong> Prevent server space exhaustion by setting individual limits.<\/li>\n<li><strong>Image Dimension Controls:<\/strong> Constrain image width\/height and adapt the WordPress big image threshold dynamically.<\/li>\n<li><strong>Bulletproof SVG Sanitizer:<\/strong> Strip XSS scripts and block XXE attacks automatically.<\/li>\n<li><strong>Clean UI, No Ads:<\/strong> Integrated into the standard WordPress Settings -&gt; Media screen. No premium ads, no banners.<\/li>\n<li><strong>Mobile Responsive:<\/strong> Layout switches to interactive cards on mobile screens for easy management.<\/li>\n<\/ul>\n\n<p><em>No hidden subscriptions, no annoying advertisements, and no premium version gates. Kodlo Media Manager is 100% free and open-source.<\/em><\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>kodlo-media-manager<\/code> directory to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Configure your custom rules by navigating to Settings -&gt; Media.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20are%20default%20settings%20applied%20automatically%20upon%20installation%3F\"><h3>Why are default settings applied automatically upon installation?<\/h3><\/dt>\n<dd><p>To protect your website's performance and security from the moment you activate the plugin, we apply pre-configured, battle-tested default rules. These settings are strictly based on web performance and SEO best practices recommended by <strong>Google PageSpeed Insights<\/strong>, <strong>web.dev<\/strong>, and <strong>WordPress VIP guidelines<\/strong>:\n*   <strong>Next-Gen Formats:<\/strong> We block legacy formats (JPG\/PNG) by default to enforce next-gen formats (WebP\/AVIF), complying with Lighthouse's <em>\"Serve images in next-gen formats\"<\/em> audit.\n*   <strong>Optimal File Sizes:<\/strong> We limit WebP\/AVIF images to <strong>250 KB<\/strong> (matching web.dev's recommendation to keep hero banners under 250\u2013300 KB and standard content images under 100 KB) and limit web fonts (WOFF2) to <strong>150 KB<\/strong>.\n*   <strong>Resolution Caps:<\/strong> Image dimensions are capped at <strong>2560px<\/strong> (2K resolution) to prevent oversized uploads from exhausting server memory during resizing.\n*   <strong>Security Safeguards:<\/strong> SVG uploads are limited to <strong>50 KB<\/strong> and sanitized to block malicious scripts.\nThese defaults ensure your website passes Core Web Vitals audits out-of-the-box, but you can customize or override them at any time in <strong>Settings -&gt; Media<\/strong>.<\/p><\/dd>\n<dt id=\"can%20i%20allow%20jpg%2Fpng%20uploads%20again%3F\"><h3>Can I allow JPG\/PNG uploads again?<\/h3><\/dt>\n<dd><p>Yes! Navigating to <strong>Settings -&gt; Media<\/strong>, find the rule for <code>jpg<\/code> or <code>png<\/code> and change the policy from \"Blocked (Globally)\" to \"Allowed (Globally)\" or \"Allowed (Media Library Only)\".<\/p><\/dd>\n<dt id=\"how%20does%20the%20svg%20sanitizer%20work%3F\"><h3>How does the SVG Sanitizer work?<\/h3><\/dt>\n<dd><p>When you upload an <code>.svg<\/code> file, the plugin parses it on the server using <code>DOMDocument<\/code>. It inspects all elements, attributes, and styles, stripping dangerous scripts (XSS) and blocking external entities (XXE) before saving the file to your server.<\/p><\/dd>\n<dt id=\"what%20does%20a%20max%20size%20of%20zero%20mean%3F\"><h3>What does a max size of zero mean?<\/h3><\/dt>\n<dd><p>Setting the maximum size of a format to 0 (or leaving it blank) disables the size limit verification for that specific file format.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20filename%20validation%20pattern%3F\"><h3>Can I customize the filename validation pattern?<\/h3><\/dt>\n<dd><p>Absolutely. The plugin lets you enter any standard regular expression to enforce naming conventions (e.g., lowercase letters, hyphens, and numbers only). If a filename doesn't match, it can be automatically sanitized or blocked.<\/p><\/dd>\n<dt id=\"how%20does%20the%20duplicate%20filename%20guard%20work%3F\"><h3>How does the Duplicate Filename Guard work?<\/h3><\/dt>\n<dd><p>It queries the WordPress database (<code>_wp_attached_file<\/code> post metadata) before a file is uploaded. If a match is found, it alerts the user and blocks the upload. This prevents media library clutter and saves hosting storage. You can enable or disable this feature anytime in the Settings.<\/p><\/dd>\n<dt id=\"how%20does%20the%20plugin%20handle%20wordpress%27s%20default%20image%20scaling%3F\"><h3>How does the plugin handle WordPress's default image scaling?<\/h3><\/dt>\n<dd><p>WordPress automatically scales down very large images (exceeding 2560px). Kodlo Media Manager dynamically overrides this threshold according to the custom resolution limits you set for that image format, preventing scaling conflicts and ensuring uploads process seamlessly.<\/p><\/dd>\n<dt id=\"how%20does%20the%20auto-sanitize%20filenames%20option%20work%3F\"><h3>How does the Auto-Sanitize Filenames option work?<\/h3><\/dt>\n<dd><p>When enabled, if a user uploads a file with Cyrillic characters, accents, or spaces, the plugin automatically transliterates non-Latin characters, removes accents, replaces spaces with hyphens\/underscores, and formats the filename to match your regex pattern without rejecting the upload.<\/p><\/dd>\n<dt id=\"why%20are%20some%20formats%20blocked%20from%20being%20added%3F\"><h3>Why are some formats blocked from being added?<\/h3><\/dt>\n<dd><p>For security reasons, dangerous file extensions (such as <code>.php<\/code>, <code>.html<\/code>, <code>.js<\/code>, <code>.exe<\/code>, <code>.htaccess<\/code>) are blacklisted. Even if you try to add them to the rules table, the settings sanitizer will automatically reject them to keep your site safe from execution vulnerabilities.<\/p><\/dd>\n<dt id=\"will%20this%20plugin%20affect%20my%20website%27s%20loading%20speed%3F\"><h3>Will this plugin affect my website's loading speed?<\/h3><\/dt>\n<dd><p>No. Kodlo Media Manager is extremely lightweight. It uses native WordPress hooks and Settings APIs without adding bloat, external stylesheets, or advertisements. All validation checks run on the server side only during media uploads, meaning there is zero impact on your front-end performance.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20the%20upload%20policies%3F\"><h3>What is the difference between the upload policies?<\/h3><\/dt>\n<dd><ul>\n<li><strong>Allowed (Media Library Only):<\/strong> The file format is allowed when users upload files directly to the Media Library, but is blocked in other parts of WordPress (e.g., plugins uploading temp files or theme assets).<\/li>\n<li><strong>Allowed (Globally):<\/strong> The format is permitted for all uploads across the entire WordPress installation.<\/li>\n<li><strong>Blocked (Globally):<\/strong> The format is completely restricted from being uploaded anywhere on your site.<\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.7.4.1<\/h4>\n\n<ul>\n<li>Minor updates to plugin description, labels, and translations.<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>Initial version after the release on WordPress.org, minor bug fixes, and updates to the plugin description.<\/li>\n<\/ul>\n\n<h4>1.7.3.1<\/h4>\n\n<ul>\n<li>Added client-side visual validation warnings in the Settings UI rules builder when configuring blocked\/insecure formats.<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>Resolved all WordPress.org review issues.<\/li>\n<li>Extracted inline footer and welcome notice scripts to enqueued JavaScript assets.<\/li>\n<li>Renamed all KMM_ constants, handles, and global parameters to KODLO_MEDIA_MANAGER_ prefix to avoid naming collisions.<\/li>\n<li>Set contributors to kodlo (owner account).<\/li>\n<li>Deprecated libxml_disable_entity_loader calls.<\/li>\n<li>Added regex syntax validation to register_setting options callback.<\/li>\n<li>Blocked whitelisting of dangerous formats (e.g. php, html, js) in settings and uploads.<\/li>\n<li>Restricted filename sanitization hooks to run only during user Media Library uploads.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Updated the plugin description to focus on custom media upload rules, format validation, and naming constraints to keep the Media Library clean and optimized.<\/li>\n<li>Audited the codebase to optimize scripts and assets.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Widened the rules table Extension column relative to the MIME Type column for better visibility of longer extension names.<\/li>\n<li>Prevented creation of duplicate rules in the settings manager rules builder.<\/li>\n<li>Integrated real-time client-side HTML5 form validation warning notifications and input focus\/blur suggestions filtering to exclude already added extensions.<\/li>\n<li>Added backward compatibility\/reverse mapping from MIME type to Extension suggestions and auto-population.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Added HTML5 suggestions autocomplete lists for extension and MIME type input fields (loaded from a separate suggestions.json file containing popular formats).<\/li>\n<li>Added real-time extension-to-MIME-type auto-population to automatically fill in the corresponding MIME type when an extension is typed or selected.<\/li>\n<\/ul>\n\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Made the \"Auto-Sanitize Filenames\" option dynamically toggle. It now only appears in the settings dashboard if the \"Filename Regex Pattern\" has been customized (is different from standard default or empty). If the regex is default, the auto-sanitize option is automatically hidden, disabled, and evaluated as inactive.<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Added dynamic override for WordPress's default big image threshold filter. The plugin now dynamically overrides the scaling threshold based on the configured custom image dimensions (or falls back to the 2560px standard default if no limits are specified), avoiding scaling conflicts.<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Re-balanced admin rules table columns layout to offer more space for Width\/Height fields (allowing 4+ characters) and MIME Type \/ Upload Policy, while reducing the Max Size column width to accommodate 6 characters.<\/li>\n<li>Bumped max-width of the rules settings configuration table to 1100px.<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Added automatic enforcement of the WordPress big image size threshold (defaults to 2560px) to prevent oversized image uploads from bypassing the plugin's validation constraints.<\/li>\n<li>Refined mobile card top padding (20px) and set the rule deletion cross icon size to 24px.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Refined mobile card top padding (20px) and set the rule deletion cross icon size to 24px.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Redesigned mobile rules cards layout to position the delete cross at the top right, stack labels above fields, and expand inputs\/dropdowns to full-width.<\/li>\n<li>Added dynamic cell visibility to hide the \"Max Dim (px)\" block on mobile if empty or if the format is not a raster image.<\/li>\n<li>Added dynamic disable controls for the size and dimension inputs when a file format's policy is set to Blocked (Globally).<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added mobile responsive layout for the settings rules table (card styling below 782px).<\/li>\n<li>Added dynamic hiding of the entire \"Max Dim (px)\" column when no raster images are configured in the table.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added WebM video format support with 10 MB optimized size limits.<\/li>\n<li>Changed default limits for WebP\/AVIF images to 2K resolution (2560px) and 250 KB max size.<\/li>\n<li>Tuned default size limits for other common formats (SVG, PDF, DOCX, ZIP, MP4) for optimal web performance.<\/li>\n<li>Added a persistent, dismissible welcome admin notification after first plugin installation.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Integrated dynamic settings rules JS inline inside class-settings.php to resolve assets load dependencies.<\/li>\n<li>Removed unused external settings.js file.<\/li>\n<li>Conducted full plugin security audit and performance optimization checks.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Removed left-padding override styling on the first column of the settings rules table.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Disabled filename duplication checks by default, making them an opt-in feature.<\/li>\n<li>Defaulted filename regex pattern to match standard WordPress allowed character configurations.<\/li>\n<li>Added fallback to default regex rules if custom pattern is left empty.<\/li>\n<li>Added a direct \"Settings\" action link on the Plugins dashboard list page.<\/li>\n<li>Cleaned up and polished delete button Dashicon action aesthetics.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Enforce custom format, size, and naming rules for uploads to keep your WordPress media library clean, organized, and optimized.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/327156","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=327156"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kodlo"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=327156"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=327156"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=327156"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=327156"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=327156"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=327156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}