{"id":346896,"date":"2026-08-05T17:35:14","date_gmt":"2026-08-05T17:35:14","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/qr-master-pro\/"},"modified":"2026-08-05T17:46:45","modified_gmt":"2026-08-05T17:46:45","slug":"labqi-qr-manager","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/labqi-qr-manager\/","author":23538380,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.0.2","requires":"6.4","requires_php":"8.2","requires_plugins":null,"header_name":"Labqi QR Manager","header_author":"Rinku Web Hopers","header_description":"Professional QR Code management with redirect tracking, bulk import, and analytics.","assets_banners_color":"","last_updated":"2026-08-05 17:46:45","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":34,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.1":{"tag":"1.2.1","author":"rinkurana11","date":"2026-08-05 17:46:45"}},"upgrade_notice":{"1.2.1":"<p>Addresses WordPress.org review feedback on nonce\/permission checks and input sanitization. No functional changes for end users. Safe to update.<\/p>","1.2.0":"<p>Plugin renamed to Labqi QR Manager (was ProductQRScan Pro) per WordPress.org review, plus a fix for admin styling that could fail to load on the Add\/Import\/Settings pages. Safe to update.<\/p>","1.1.2":"<p>Fixes the &quot;NaN&quot; entries\/pagination bug on the QR list page and a leftover old page title. Safe to update.<\/p>","1.1.1":"<p>Completes the WordPress.org-requested library updates (endroid\/qr-code and DataTables) that were missed in 1.1.0. Safe to update.<\/p>","1.1.0":"<p>Plugin renamed to Labqi QR Manager. If you had a Logo set, please re-select it via Settings after updating.<\/p>","1.0.3":"<p>Major size reduction, no functionality changes \u2014 safe to update.<\/p>","1.0.2":"<p>Code quality and WordPress.org compliance fixes \u2014 no action needed, safe to update.<\/p>","1.0.1":"<p>Storage location change for QR images \u2014 files are migrated automatically on activation, no action needed.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[262246],"plugin_tags":[125072,1373,18660,274562,242225],"plugin_category":[],"plugin_contributors":[274563],"plugin_business_model":[],"class_list":["post-346896","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-bulk-import","plugin_tags-qr-code","plugin_tags-qr-generator","plugin_tags-qr-redirect","plugin_tags-qr-tracking","plugin_contributors-rinkurana11","plugin_committers-rinkurana11"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/labqi-qr-manager.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Labqi QR Manager is a complete QR code management solution for WordPress.<\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Generate QR codes (PNG, 500\u00d7500) using endroid\/qr-code v6<\/li>\n<li>Link-type QR codes \u2014 redirect to any URL on scan<\/li>\n<li>Attachment-type QR codes \u2014 serve PDF, DOCX, XLSX, PNG, JPG, WEBP securely<\/li>\n<li>Custom rewrite endpoint: <code>yoursite.com\/qr\/{code}<\/code><\/li>\n<li>Scan tracking \u2014 count + last-scan timestamp per QR<\/li>\n<li>Bulk CSV import with per-row error reporting<\/li>\n<li>Export to CSV, Excel (XLSX), or ZIP (images + manifest)<\/li>\n<li>Bootstrap 5 admin UI with DataTables, SweetAlert2<\/li>\n<li>Analytics dashboard widget<\/li>\n<li>Settings: QR size, margin, logo overlay, default status<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>labqi-qr-manager<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin in WordPress \u203a Plugins<\/li>\n<li>Go to Settings \u203a Permalinks and click Save (to flush rewrite rules)<\/li>\n<li>Visit Labqi QR Manager in the admin sidebar<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20qr%20images%20stored%3F\"><h3>Where are QR images stored?<\/h3><\/dt>\n<dd><p>Inside <code>wp-content\/uploads\/labqi-qr-manager\/qr-codes\/<\/code>, so files survive plugin updates and reinstalls.<\/p><\/dd>\n<dt id=\"are%20attachment%20files%20publicly%20accessible%3F\"><h3>Are attachment files publicly accessible?<\/h3><\/dt>\n<dd><p>No. A <code>.htaccess<\/code> blocks direct access. Files are served through PHP only.<\/p><\/dd>\n<dt id=\"how%20do%20i%20change%20qr%20size%20or%20add%20a%20logo%3F\"><h3>How do I change QR size or add a logo?<\/h3><\/dt>\n<dd><p>Go to Labqi QR Manager \u203a Settings.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fixed nonce checks that WordPress.org's Plugin Check scanner couldn't verify: several AJAX handlers and the Add\/Edit form handler called a custom security wrapper method instead of WordPress core's check_ajax_referer()\/check_admin_referer() directly. The wrapper genuinely did call wp_verify_nonce() and current_user_can() correctly, but automated scanners can't trace into custom methods \u2014 all handlers now call the core functions directly.<\/li>\n<li>Moved the nonce check in the Add\/Edit form handler earlier, before the submitted action type is read (previously it was only verified deeper inside the add\/update logic)<\/li>\n<li>Sanitized $_FILES data field-by-field at the point of use (name, type) instead of passing the raw array through, and explicitly sanitized the \"default_status\" setting instead of relying only on a whitelist check<\/li>\n<li>Added sanitize_text_field()\/sanitize_key() before re-displaying submitted form values on validation errors (previously only wp_unslash() + esc_attr(), which escapes safely for output but skips the sanitize step)<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Renamed the plugin again from \"ProductQRScan Pro\" to \"Labqi QR Manager\" (slug: labqi-qr-manager) \u2014 WordPress.org's reviewer AI flagged \"Product QR Scan\" as too purely descriptive of the plugin's functionality to be a distinctive name, even with \"Pro\" appended<\/li>\n<li>Fixed several leftover references to the previous plugin name that the automated rename missed the first time (a page heading, the admin sidebar menu label, and internal page-slug\/query-var prefixes)<\/li>\n<li>Fixed an admin-page asset loading bug introduced by the rename: WordPress' submenu page hook suffix must exactly match the parent menu slug's hyphens (e.g. \"labqi-qr_page_labqi-qr-add\"); an earlier pass had generated an underscore in that position, which silently prevented Bootstrap\/DataTables\/custom JS\/CSS from loading on the Add, Import, and Settings pages<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Fixed: the \"All QR Codes\" page list showed \"NaN\" for total entries\/pages. <code>wp_send_json_success()<\/code> nests the AJAX response inside a <code>data<\/code> envelope, but DataTables reads <code>recordsTotal<\/code>\/<code>recordsFiltered<\/code> from the top level of the response \u2014 the frontend now hoists those fields correctly before DataTables reads them<\/li>\n<li>Fixed: a leftover page heading still read \"QR Code Master\" instead of the current plugin name<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Completed the library update from 1.1.0: endroid\/qr-code was still on 5.1.0 (unchanged) and DataTables had only received a patch bump \u2014 both are now updated to their current stable releases (endroid\/qr-code 6.0.9, DataTables 3.0.0)<\/li>\n<li>Fixed a stray FAQ answer that pointed to the wrong QR image storage path<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Renamed the plugin from \"QR Master Pro\" to \"Labqi QR Manager\" (slug: labqi-qr-manager) to resolve a trademark\/naming conflict flagged during WordPress.org review<\/li>\n<li>Removed load_plugin_textdomain() call (unnecessary on WordPress.org since WP 4.6, translations are loaded automatically)<\/li>\n<li>Fixed: uploaded PDF\/attachment files now live in a plugin-slug-namespaced uploads folder (wp-content\/uploads\/labqi-qr-manager\/qr-pdfs\/) instead of a bare top-level uploads\/qr-pdfs\/ folder; existing files are migrated automatically<\/li>\n<li>Fixed: the Logo setting no longer asks for a typed absolute server file path \u2014 it now uses the WordPress Media Library picker and stores a portable attachment ID<\/li>\n<li>Fixed: moved an inline  block on the QR error page into a properly enqueued stylesheet<\/li>\n<li>Updated bundled libraries to current stable releases: Bootstrap 5.3.3 \u2192 5.3.8, DataTables 1.13.8 \u2192 3.0.0, endroid\/qr-code 5.1.0 \u2192 6.0.9 (PHP requirement stays at 8.2 \u2014 a newer 6.1.x line of endroid\/qr-code requires PHP 8.4 and was intentionally not used)<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Massive package size reduction (26MB \u2192 ~3MB installed) to fit WordPress.org's 10MB upload limit:\n\n<ul>\n<li>Removed an unused 16MB bundled font (only needed for a QR \"label\" feature this plugin never uses)<\/li>\n<li>Replaced the phpoffice\/phpspreadsheet library with a small built-in XLSX writer (no functionality change \u2014 XLSX export still has the same styled header, frozen header row, and auto-sized columns)<\/li>\n<\/ul><\/li>\n<li>No user-facing behavior changes in this release<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fixed: removed bundled hidden file (.htaccess) and obsolete legacy uploads folder from the package<\/li>\n<li>Fixed: missing direct-access protection in templates\/error.php<\/li>\n<li>Fixed: Domain Path header now points to an existing languages\/ folder<\/li>\n<li>Fixed: replaced move_uploaded_file() with a WP_Filesystem-based secure upload handler<\/li>\n<li>Fixed: replaced parse_url() with wp_parse_url(), unlink() with wp_delete_file()<\/li>\n<li>Improved: all database queries now use $wpdb-&gt;prepare() with %i identifier placeholders for table\/column names<\/li>\n<li>Improved: added missing translator comments for all strings with placeholders<\/li>\n<li>Improved: internal redirects now use wp_safe_redirect(); external QR-destination redirects remain wp_redirect() by design (admin-configured destinations, not public input)<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>QR code images now stored under wp-content\/uploads\/ instead of inside the plugin folder (data now survives plugin updates\/reinstalls; existing images are migrated automatically)<\/li>\n<li>Uninstall now fully removes all generated QR images and attachments<\/li>\n<li>Removed unused legacy code files<\/li>\n<li>Minor readme and translation string fixes<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Professional QR Code management \u2014 generate, track, bulk import, and export QR codes with a full redirect system.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/346896","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=346896"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/rinkurana11"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=346896"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=346896"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=346896"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=346896"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=346896"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=346896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}