{"id":337478,"date":"2026-07-12T19:07:47","date_gmt":"2026-07-12T19:07:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dms3-qr-manager\/"},"modified":"2026-07-12T19:30:22","modified_gmt":"2026-07-12T19:30:22","slug":"dms3-qr-manager","status":"publish","type":"plugin","link":"https:\/\/scn.wordpress.org\/plugins\/dms3-qr-manager\/","author":7798268,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"20260712.2127","stable_tag":"20260712.2127","tested":"7.0.1","requires":"6.2","requires_php":"8.2","requires_plugins":null,"header_name":"DMS3 QR Manager","header_author":"marcqueralt, DeMomentSomTres","header_description":"Gesti\u00f3 de codis QR amb redirecci\u00f3, estad\u00edstiques i desc\u00e0rrega SVG.","assets_banners_color":"d0c7ca","last_updated":"2026-07-12 19:30:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.demomentsomtres.com\/en\/plugins-wordpress-woocommerce\/","header_author_uri":"https:\/\/www.demomentsomtres.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":48,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"20260710.1000":{"tag":"20260710.1000","author":"marcqueralt","date":"2026-07-12 19:07:22"},"20260712.2112":{"tag":"20260712.2112","author":"marcqueralt","date":"2026-07-12 19:26:40"},"20260712.2127":{"tag":"20260712.2127","author":"marcqueralt","date":"2026-07-12 19:30:22"}},"upgrade_notice":{"20260712.2127":"<p>Includes complete Catalan and Spanish language packs for the admin interface.<\/p>","20260712.2112":"<p>Adds Catalan and Spanish translations. Admin UI now uses English as the default source language.<\/p>","20260710.1000":"<p>WordPress.org review fixes: class prefix updates, chillerlan 6.0.1, PHP 8.2 required.<\/p>","20260707.1200":"<p>Plugin Check and WordPress 7.0 compatibility updates.<\/p>","20260707.1100":"<p>Privacy and uninstall improvements. Referrer data is no longer stored for new scans.<\/p>","20260607.1730":"<p>Initial public release. Publish QR codes before sharing public URLs.<\/p>"},"ratings":[],"assets_icons":{"icon.svg":{"filename":"icon.svg","revision":3605106,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3605106,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["20260710.1000","20260712.2112","20260712.2127"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"QR list with thumbnail, public URL, and visit counts","2":"QR edit screen with bridge preview and SVG download","3":"Statistics page with date range filter","4":"Global UTM and redirect settings"}},"plugin_section":[],"plugin_tags":[232,1373,727,2904,24188],"plugin_category":[36],"plugin_contributors":[248504,82505],"plugin_business_model":[],"class_list":["post-337478","plugin","type-plugin","status-publish","hentry","plugin_tags-analytics","plugin_tags-qr-code","plugin_tags-redirect","plugin_tags-svg","plugin_tags-utm","plugin_category-analytics","plugin_contributors-demomentsomtres","plugin_contributors-marcqueralt","plugin_committers-marcqueralt"],"banners":{"banner":"https:\/\/ps.w.org\/dms3-qr-manager\/assets\/banner-772x250.png?rev=3605106","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/dms3-qr-manager\/assets\/icon.svg?rev=3605106","icon":"https:\/\/ps.w.org\/dms3-qr-manager\/assets\/icon.svg?rev=3605106","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>DMS3 QR Manager lets you create and manage QR codes in WordPress. Each QR points to a URL on your own site (<code>\/qr\/{slug}<\/code>) that records visits and redirects visitors to a final destination. Printed QR codes stay valid when you change the destination in the admin.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Custom post type <code>qr-code<\/code> with slug, destination URL, and optional UTM campaign per QR<\/li>\n<li>Public redirect URLs: <code>{home_url}\/qr\/{slug}?utm_...<\/code><\/li>\n<li>Bridge page before redirect (default 1 second) so Google Analytics can load via <code>wp_head()<\/code><\/li>\n<li>Manual fallback link: \u201cSkip to \u2026\u201d if automatic redirect fails<\/li>\n<li>Internal visit tracking with date-range statistics (anonymous scan timestamps only)<\/li>\n<li>Global UTM defaults (<code>utm_source<\/code>, <code>utm_medium<\/code>, default campaign)<\/li>\n<li><code>utm_content<\/code> is always set automatically to the QR slug<\/li>\n<li>SVG QR preview and download from the list screen and single QR edit screen<\/li>\n<li>Bulk SVG download as a ZIP file (<code>{slug}.svg<\/code> per code)<\/li>\n<li>WPML: <code>qr-code<\/code> is excluded from translation<\/li>\n<\/ul>\n\n<p><strong>How redirects work<\/strong><\/p>\n\n<p>Scanned URL example:<\/p>\n\n<pre><code>https:\/\/example.com\/qr\/wikipedia?utm_source=qr&amp;utm_medium=offline&amp;utm_campaign=port_vendrell&amp;utm_content=wikipedia\n<\/code><\/pre>\n\n<ol>\n<li>Visitor hits <code>\/qr\/wikipedia<\/code><\/li>\n<li>A lightweight bridge page loads (HTTP 200) with analytics scripts<\/li>\n<li>After the configured delay, the browser redirects to the destination URL<\/li>\n<li>The visit is logged in the plugin database<\/li>\n<\/ol>\n\n<p>Temporary client-side redirects are used instead of HTTP 301 so every scan hits your server and destination URLs can be updated without reprinting QR codes.<\/p>\n\n<p><strong>Privacy<\/strong><\/p>\n\n<p>When someone scans a published QR code, the plugin stores only the internal QR identifier and the scan timestamp. It does not store IP addresses, HTTP referrers, or plugin-specific cookies. Visit data is used for admin statistics only.<\/p>\n\n<p><strong>Third-party libraries<\/strong><\/p>\n\n<p>QR images are generated with bundled PHP libraries (MIT licensed):<\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/chillerlan\/php-qrcode\">chillerlan\/php-qrcode<\/a> (MIT)<\/li>\n<li><a href=\"https:\/\/github.com\/chillerlan\/php-settings-container\">chillerlan\/php-settings-container<\/a> (MIT)<\/li>\n<\/ul>\n\n<p>The <code>vendor\/<\/code> directory is included in the plugin package.<\/p>\n\n<p><strong>Uninstall<\/strong><\/p>\n\n<p>When the plugin is deleted (not merely deactivated), the visit statistics table and plugin options are removed. QR code posts (<code>qr-code<\/code>) are kept as regular WordPress content.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>dms3-qr-manager<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress<\/li>\n<li>Go to <strong>QR Manager \u2192 Settings<\/strong> and configure global UTM parameters and redirect delay<\/li>\n<li>Create QR codes under <strong>QR Manager \u2192 All QR<\/strong><\/li>\n<li><strong>Publish<\/strong> each QR \u2014 draft codes return 404 on the public URL<\/li>\n<li>If <code>\/qr\/{slug}<\/code> URLs do not work, visit <strong>Settings \u2192 Permalinks<\/strong> and click <strong>Save Changes<\/strong> to flush rewrite rules<\/li>\n<\/ol>\n\n<p><strong>Composer dependency<\/strong><\/p>\n\n<p>If you build from source, run <code>composer install --no-dev<\/code> inside the plugin folder to populate <code>vendor\/<\/code>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20is%20my%20qr%20url%20returning%20404%3F\"><h3>Why is my QR URL returning 404?<\/h3><\/dt>\n<dd><p>The QR must be <strong>Published<\/strong> (not draft). The slug in the admin must match the URL path. Flush permalinks under <strong>Settings \u2192 Permalinks<\/strong>.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20destination%20without%20reprinting%20the%20qr%3F\"><h3>Can I change the destination without reprinting the QR?<\/h3><\/dt>\n<dd><p>Yes. Update the destination URL in the admin. The public <code>\/qr\/{slug}<\/code> URL stays the same.<\/p><\/dd>\n<dt id=\"does%20google%20analytics%20track%20qr%20scans%3F\"><h3>Does Google Analytics track QR scans?<\/h3><\/dt>\n<dd><p>The bridge page loads your theme\/plugin analytics scripts before redirecting. For same-site destinations with \u201cForward UTM\u201d enabled, UTM parameters are also appended to the final URL. Internal statistics are always recorded by the plugin regardless of GA.<\/p><\/dd>\n<dt id=\"what%20data%20does%20the%20plugin%20collect%3F\"><h3>What data does the plugin collect?<\/h3><\/dt>\n<dd><p>Each scan logs the QR post ID and timestamp. No IP address or HTTP referrer is stored. See <strong>Settings \u2192 Privacy<\/strong> in WordPress for the full policy text added by this plugin.<\/p><\/dd>\n<dt id=\"is%20the%20qr%20post%20type%20translatable%20with%20wpml%3F\"><h3>Is the QR post type translatable with WPML?<\/h3><\/dt>\n<dd><p>No. QR codes are language-independent by design.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%20the%20plugin%3F\"><h3>What happens when I uninstall the plugin?<\/h3><\/dt>\n<dd><p>The statistics table and plugin settings are deleted. Your <code>qr-code<\/code> posts remain in WordPress unless you delete them manually.<\/p><\/dd>\n<dt id=\"what%20php%20extensions%20are%20required%3F\"><h3>What PHP extensions are required?<\/h3><\/dt>\n<dd><p>PHP 8.2+ and ZipArchive for bulk SVG download.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>20260712.2127<\/h4>\n\n<ul>\n<li>Bundled Catalan (ca_ES) and Spanish (es_ES) translation files in the plugin package<\/li>\n<\/ul>\n\n<h4>20260712.2112<\/h4>\n\n<ul>\n<li>Internationalization: English source strings with bundled Catalan (ca_ES) and Spanish (es_ES) translations<\/li>\n<li>Added load_plugin_textdomain() for admin and frontend strings<\/li>\n<\/ul>\n\n<h4>20260710.1000<\/h4>\n\n<ul>\n<li>WordPress.org review: unified class prefixes under Dms3_Qr_Manager_*<\/li>\n<li>Updated chillerlan\/php-qrcode to 6.0.1; minimum PHP is now 8.2<\/li>\n<li>Removed non-essential vendor files from distribution package<\/li>\n<\/ul>\n\n<h4>20260707.1200<\/h4>\n\n<ul>\n<li>Plugin Check compliance: literal i18n text domain, SVG escaping, WP_Filesystem for ZIP downloads<\/li>\n<li>Tested up to WordPress 7.0<\/li>\n<\/ul>\n\n<h4>20260707.1100<\/h4>\n\n<ul>\n<li>WordPress.org compliance: GPL license file, ABSPATH guards, privacy policy integration<\/li>\n<li>Removed HTTP referrer from visit logging<\/li>\n<li>Clean uninstall (database table and options)<\/li>\n<li>Bridge page assets enqueued via WordPress APIs<\/li>\n<\/ul>\n\n<h4>20260607.1730<\/h4>\n\n<ul>\n<li>Bridge redirect page with configurable delay (default 1 second)<\/li>\n<li>\u201cSkip to \u2026\u201d manual fallback button<\/li>\n<li>Google Analytics support via <code>wp_head()<\/code> on bridge page<\/li>\n<li>Per-QR UTM campaign with global fallback; <code>utm_content<\/code> auto-set to slug<\/li>\n<li>SVG preview and download on list and edit screens<\/li>\n<li>Bulk SVG download as ZIP<\/li>\n<li>Visit statistics with date range filter<\/li>\n<li>WPML exclusion for <code>qr-code<\/code> post type<\/li>\n<\/ul>","raw_excerpt":"Manage QR codes as a custom post type with trackable redirects, visit statistics, and SVG download.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/337478","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=337478"}],"author":[{"embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/marcqueralt"}],"wp:attachment":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=337478"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=337478"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=337478"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=337478"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=337478"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=337478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}