{"id":310942,"date":"2026-05-15T13:48:21","date_gmt":"2026-05-15T13:48:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pivot-qr\/"},"modified":"2026-05-15T13:59:24","modified_gmt":"2026-05-15T13:59:24","slug":"pivot-qr","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/pivot-qr\/","author":23462700,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.4","stable_tag":"0.3.4","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Pivot QR","header_author":"foryou, inc.","header_description":"Create short URLs and matching QR codes whose destination you can change anytime. Keep the printed QR, pivot where it points.","assets_banners_color":"6ea866","last_updated":"2026-05-15 13:59:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/uuuu.to\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":40,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.2":{"tag":"0.3.2","author":"kanedashinya","date":"2026-05-15 13:47:56"},"0.3.3":{"tag":"0.3.3","author":"kanedashinya","date":"2026-05-15 13:56:57"},"0.3.4":{"tag":"0.3.4","author":"kanedashinya","date":"2026-05-15 13:59:24"}},"upgrade_notice":{"0.3.2":"<p>Sanitizes all superglobal reads in the redirect path. Security hardening.<\/p>","0.3.1":"<p>Compliance fixes for the WordPress.org plugin directory: removes inline styles, updates Chart.js, and switches the description to English.<\/p>","0.3.0":"<p>Bundles all assets locally and improves access-analytics reliability on shared hosting. Database migration is automatic.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3533064,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3533064,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3533064,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3533064,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.3.2","0.3.3","0.3.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3533064,"resolution":"1","location":"assets","locale":"","width":2590,"height":2378},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3533064,"resolution":"2","location":"assets","locale":"","width":2590,"height":2378},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3533064,"resolution":"3","location":"assets","locale":"","width":2590,"height":2378},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3533064,"resolution":"4","location":"assets","locale":"","width":2590,"height":2378}},"screenshots":{"1":"Link list \u2014 short URL, redirect target, schedule period, description, and total access count for each link.","2":"Link detail \u2014 QR code preview, PNG \/ JPG \/ SVG download, copyable embed code, editable short URL, and schedule list.","3":"Access analytics \u2014 daily breakdown of QR scans vs. direct short-URL clicks.","4":"New link creation \u2014 set the redirect URL, slug length, and QR error correction level in one dialog."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[62159,17938,1373,727,137],"plugin_category":[],"plugin_contributors":[257684],"plugin_business_model":[],"class_list":["post-310942","plugin","type-plugin","status-publish","hentry","plugin_tags-dynamic-qr","plugin_tags-link-management","plugin_tags-qr-code","plugin_tags-redirect","plugin_tags-short-url","plugin_contributors-kanedashinya","plugin_committers-kanedashinya"],"banners":{"banner":"https:\/\/ps.w.org\/pivot-qr\/assets\/banner-772x250.png?rev=3533064","banner_2x":"https:\/\/ps.w.org\/pivot-qr\/assets\/banner-1544x500.png?rev=3533064","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/pivot-qr\/assets\/icon-128x128.png?rev=3533064","icon_2x":"https:\/\/ps.w.org\/pivot-qr\/assets\/icon-256x256.png?rev=3533064","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/pivot-qr\/assets\/screenshot-1.png?rev=3533064","caption":"Link list \u2014 short URL, redirect target, schedule period, description, and total access count for each link."},{"src":"https:\/\/ps.w.org\/pivot-qr\/assets\/screenshot-2.png?rev=3533064","caption":"Link detail \u2014 QR code preview, PNG \/ JPG \/ SVG download, copyable embed code, editable short URL, and schedule list."},{"src":"https:\/\/ps.w.org\/pivot-qr\/assets\/screenshot-3.png?rev=3533064","caption":"Access analytics \u2014 daily breakdown of QR scans vs. direct short-URL clicks."},{"src":"https:\/\/ps.w.org\/pivot-qr\/assets\/screenshot-4.png?rev=3533064","caption":"New link creation \u2014 set the redirect URL, slug length, and QR error correction level in one dialog."}],"raw_content":"<!--section=description-->\n<p><strong>Pivot QR<\/strong> turns your WordPress site's domain into a redirect service. Generate short URLs like <code>example.com\/ab<\/code> together with matching QR codes, then change where they redirect to at any time \u2014 without ever reprinting the QR.<\/p>\n\n<p>This is especially useful for printed flyers, packaging, business cards, signage, and seasonal campaigns where the printed QR cannot be reissued but the destination URL needs to change.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Short URLs at your domain root<\/strong> \u2014 e.g. <code>example.com\/ab<\/code>.<\/li>\n<li><strong>Adjustable slug length<\/strong> \u2014 2 to 8 characters. Shorter slugs produce sparser QR codes; longer slugs give a larger address space.<\/li>\n<li><strong>Edit slugs after creation<\/strong> \u2014 rename any short URL after it has been issued.<\/li>\n<li><strong>QR downloads<\/strong> \u2014 PNG, JPG, and SVG output at any size from 100 to 1000 px.<\/li>\n<li><strong>Embed code<\/strong> \u2014 copy-ready <code>&lt;img&gt;<\/code> and <code>&lt;svg&gt;<\/code> HTML snippets for posts and product pages.<\/li>\n<li><strong>Scheduled destinations<\/strong> \u2014 optional start\/end dates and multiple schedules per link, with automatic switchover.<\/li>\n<li><strong>Per-device redirects<\/strong> \u2014 send iPhone, Android, and PC visitors to different URLs (perfect for App Store \/ Google Play routing).<\/li>\n<li><strong>Built-in analytics<\/strong> \u2014 daily breakdown of QR scans vs. direct short-URL clicks, rendered as a chart.<\/li>\n<li><strong>Reserved paths<\/strong> \u2014 protect existing pages from being accidentally captured.<\/li>\n<li><strong>Total click counter<\/strong> \u2014 see at a glance how many times each link has been hit.<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>Pivot QR stores data only in your own WordPress database. It does not phone home, it does not call third-party services, and it does not embed any tracking. Visitor IP addresses, user agents, and referrers from redirect hits are stored locally for analytics; uninstalling the plugin removes everything.<\/p>\n\n<h4>Bundled libraries<\/h4>\n\n<p>To work on shared hosting (no Composer or PHP image library required), Pivot QR bundles the following permissively licensed libraries inside the plugin folder. Nothing is loaded from external CDNs.<\/p>\n\n<ul>\n<li>Chart.js (MIT)<\/li>\n<li>qrcode-generator (MIT) \u2014 by Kazuhiko Arase<\/li>\n<li>Font Awesome Free (CC BY 4.0 icons, MIT CSS, SIL OFL fonts)<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install via the WordPress plugin directory, or upload the <code>pivot-qr<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate <strong>Pivot QR<\/strong> through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Visit <strong>Pivot QR \u2192 Settings<\/strong> to configure slug length, QR error correction level, and reserved paths.<\/li>\n<li>Open <strong>Pivot QR \u2192 Links<\/strong> to create your first short URL.<\/li>\n<\/ol>\n\n<p>QR generation runs entirely in the browser. No Composer, no PHP image library, no external services required.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20short%20urls%20collide%20with%20my%20existing%20pages%3F\"><h3>Will short URLs collide with my existing pages?<\/h3><\/dt>\n<dd><p>No. Pivot QR only intercepts paths matching the configured slug pattern (default: 2-character alphanumeric). Everything else passes through to WordPress as normal. Common paths like <code>\/wp-admin<\/code>, <code>\/feed<\/code>, and <code>\/robots.txt<\/code> are reserved by default, and you can add more in settings.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20redirect%20destination%20after%20creating%20the%20qr%3F\"><h3>Can I change the redirect destination after creating the QR?<\/h3><\/dt>\n<dd><p>Yes \u2014 that is the whole point. The QR encodes the short URL only. Editing a schedule (or adding a new one) immediately updates every existing QR's destination, with no need to reissue the QR.<\/p><\/dd>\n<dt id=\"does%20this%20work%20on%20shared%20hosting%3F\"><h3>Does this work on shared hosting?<\/h3><\/dt>\n<dd><p>Yes. The plugin uses only standard PHP and the WordPress database. QR generation runs client-side in the admin, so no GD, Imagick, or Composer is required on the server.<\/p><\/dd>\n<dt id=\"how%20do%20per-device%20redirects%20work%3F\"><h3>How do per-device redirects work?<\/h3><\/dt>\n<dd><p>Each schedule has optional iPhone, Android, and PC URLs. When a visitor hits the short URL, the User-Agent is examined and the appropriate URL is used. If a device-specific URL is empty, the default URL is used.<\/p><\/dd>\n<dt id=\"where%20is%20the%20data%20stored%3F\"><h3>Where is the data stored?<\/h3><\/dt>\n<dd><p>In four custom tables in your WordPress database (prefix <code>wp_pvqr_<\/code>). Uninstalling the plugin removes all of them along with plugin settings.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.4<\/h4>\n\n<ul>\n<li>Fixed primary button text being invisible when the button is an <code>&lt;a&gt;<\/code> element on the Plugins admin page (WordPress admin <code>.wrap a<\/code> color was overriding the button text color).<\/li>\n<\/ul>\n\n<h4>0.3.3<\/h4>\n\n<ul>\n<li>Bundled Japanese (ja) translations so the plugin description, menu labels, and admin strings display in Japanese on Japanese WordPress sites.<\/li>\n<\/ul>\n\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>Sanitized all <code>$_SERVER<\/code> and <code>$_GET<\/code> superglobal reads in the redirect path (REQUEST_URI, HTTP_USER_AGENT, HTTP_REFERER, REMOTE_ADDR, etc.) using wp_unslash() plus the appropriate WordPress sanitizer.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Switched the redirect error pages to wp_die() so no inline <code>&lt;style&gt;<\/code> blocks are emitted by the plugin.<\/li>\n<li>Removed the legacy load_plugin_textdomain() call (WordPress 4.6+ loads translations automatically for plugins hosted on WordPress.org).<\/li>\n<li>Updated bundled Chart.js from 4.4.4 to 4.5.1.<\/li>\n<li>Switched plugin description and readme to English.<\/li>\n<li>Updated <code>Contributors<\/code> to match the WordPress.org account.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Bundled all third-party assets locally (no CDN dependencies) for WordPress.org compliance.<\/li>\n<li>Added per-link slug editing.<\/li>\n<li>Added per-link QR error correction level (overrides global default).<\/li>\n<li>Redesigned the create-link modal with a sticky footer.<\/li>\n<li>Show description and scheduled period on the link list when set.<\/li>\n<li>Fixed access-analytics aggregation on hosts without MySQL timezone tables.<\/li>\n<li>Removed pagination, search, and category UI for a focused workflow.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>QR generation moved to client-side.<\/li>\n<li>Per-device redirect targets per schedule.<\/li>\n<li>Delete button on the link list and detail page.<\/li>\n<li>Total access counter on the link list.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Create short URLs and matching QR codes whose destination you can change anytime. Keep the printed QR, pivot where it points.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/310942","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=310942"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kanedashinya"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=310942"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=310942"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=310942"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=310942"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=310942"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=310942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}