Labqi QR Manager

Description

Labqi QR Manager is a complete QR code management solution for WordPress.

Features:

  • Generate QR codes (PNG, 500×500) using endroid/qr-code v6
  • Link-type QR codes — redirect to any URL on scan
  • Attachment-type QR codes — serve PDF, DOCX, XLSX, PNG, JPG, WEBP securely
  • Custom rewrite endpoint: yoursite.com/qr/{code}
  • Scan tracking — count + last-scan timestamp per QR
  • Bulk CSV import with per-row error reporting
  • Export to CSV, Excel (XLSX), or ZIP (images + manifest)
  • Bootstrap 5 admin UI with DataTables, SweetAlert2
  • Analytics dashboard widget
  • Settings: QR size, margin, logo overlay, default status

Installation

  1. Upload the labqi-qr-manager folder to /wp-content/plugins/
  2. Activate the plugin in WordPress › Plugins
  3. Go to Settings › Permalinks and click Save (to flush rewrite rules)
  4. Visit Labqi QR Manager in the admin sidebar

FAQ

Where are QR images stored?

Inside wp-content/uploads/labqi-qr-manager/qr-codes/, so files survive plugin updates and reinstalls.

Are attachment files publicly accessible?

No. A .htaccess blocks direct access. Files are served through PHP only.

How do I change QR size or add a logo?

Go to Labqi QR Manager › Settings.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Labqi QR Manager” is open source software. The following people have contributed to this plugin.

Contributors

Translate “Labqi QR Manager” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

1.2.1

  • 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 — all handlers now call the core functions directly.
  • 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)
  • 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
  • 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)

1.2.0

  • Renamed the plugin again from “ProductQRScan Pro” to “Labqi QR Manager” (slug: labqi-qr-manager) — 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
  • 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)
  • 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

1.1.2

  • Fixed: the “All QR Codes” page list showed “NaN” for total entries/pages. wp_send_json_success() nests the AJAX response inside a data envelope, but DataTables reads recordsTotal/recordsFiltered from the top level of the response — the frontend now hoists those fields correctly before DataTables reads them
  • Fixed: a leftover page heading still read “QR Code Master” instead of the current plugin name

1.1.1

  • 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 — both are now updated to their current stable releases (endroid/qr-code 6.0.9, DataTables 3.0.0)
  • Fixed a stray FAQ answer that pointed to the wrong QR image storage path

1.1.0

  • 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
  • Removed load_plugin_textdomain() call (unnecessary on WordPress.org since WP 4.6, translations are loaded automatically)
  • 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
  • Fixed: the Logo setting no longer asks for a typed absolute server file path — it now uses the WordPress Media Library picker and stores a portable attachment ID
  • Fixed: moved an inline block on the QR error page into a properly enqueued stylesheet
  • Updated bundled libraries to current stable releases: Bootstrap 5.3.3 5.3.8, DataTables 1.13.8 3.0.0, endroid/qr-code 5.1.0 6.0.9 (PHP requirement stays at 8.2 — a newer 6.1.x line of endroid/qr-code requires PHP 8.4 and was intentionally not used)

1.0.3

  • Massive package size reduction (26MB ~3MB installed) to fit WordPress.org’s 10MB upload limit:
    • Removed an unused 16MB bundled font (only needed for a QR “label” feature this plugin never uses)
    • Replaced the phpoffice/phpspreadsheet library with a small built-in XLSX writer (no functionality change — XLSX export still has the same styled header, frozen header row, and auto-sized columns)
  • No user-facing behavior changes in this release

1.0.2

  • Fixed: removed bundled hidden file (.htaccess) and obsolete legacy uploads folder from the package
  • Fixed: missing direct-access protection in templates/error.php
  • Fixed: Domain Path header now points to an existing languages/ folder
  • Fixed: replaced move_uploaded_file() with a WP_Filesystem-based secure upload handler
  • Fixed: replaced parse_url() with wp_parse_url(), unlink() with wp_delete_file()
  • Improved: all database queries now use $wpdb->prepare() with %i identifier placeholders for table/column names
  • Improved: added missing translator comments for all strings with placeholders
  • Improved: internal redirects now use wp_safe_redirect(); external QR-destination redirects remain wp_redirect() by design (admin-configured destinations, not public input)

1.0.1

  • 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)
  • Uninstall now fully removes all generated QR images and attachments
  • Removed unused legacy code files
  • Minor readme and translation string fixes

1.0.0

  • Initial release