{"id":372912,"date":"2026-09-25T12:02:49","date_gmt":"2026-09-25T12:02:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/my-shopping-list\/"},"modified":"2026-09-25T12:02:39","modified_gmt":"2026-09-25T12:02:39","slug":"vinceweb-shopping-lists","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/vinceweb-shopping-lists\/","author":23561663,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.2","stable_tag":"2.0.2","tested":"7.1.2","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Vinceweb Shopping Lists","header_author":"Darrel Vince","header_description":"Private multi-person shopping lists with shop pricing, sales, shopping history, insights and shopping mode.","assets_banners_color":"2d3743","last_updated":"2026-09-25 12:02:39","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":53,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.2":{"tag":"2.0.2","author":"vincewebdesign","date":"2026-09-25 12:02:39","revision":3712998}},"upgrade_notice":{"1.7.1":"<p>Recommended WordPress.org submission candidate. Resolves Plugin Check errors and warnings reported against 1.7.0.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3713516,"resolution":"128x128","location":"assets","locale":"","width":128,"height":119},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3713516,"resolution":"256x256","location":"assets","locale":"","width":246,"height":226}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3713516,"resolution":"1544x500","location":"assets","locale":"","width":2134,"height":376},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3713516,"resolution":"772x250","location":"assets","locale":"","width":836,"height":280}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3713516,"resolution":"1","location":"assets","locale":"","width":720,"height":1398},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3713516,"resolution":"2","location":"assets","locale":"","width":720,"height":1398},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3713516,"resolution":"3","location":"assets","locale":"","width":720,"height":1398},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3713516,"resolution":"4","location":"assets","locale":"","width":720,"height":1398}},"screenshots":[]},"plugin_section":[],"plugin_tags":[13042,2902,30478,889,30481],"plugin_category":[45],"plugin_contributors":[280231],"plugin_business_model":[],"class_list":["post-372912","plugin","type-plugin","status-publish","hentry","plugin_tags-checklist","plugin_tags-family","plugin_tags-grocery-list","plugin_tags-shopping","plugin_tags-shopping-list","plugin_category-ecommerce","plugin_contributors-vincewebdesign","plugin_committers-vincewebdesign"],"banners":{"banner":"https:\/\/ps.w.org\/vinceweb-shopping-lists\/assets\/banner-772x250.png?rev=3713516","banner_2x":"https:\/\/ps.w.org\/vinceweb-shopping-lists\/assets\/banner-1544x500.png?rev=3713516","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/vinceweb-shopping-lists\/assets\/icon-128x128.png?rev=3713516","icon_2x":"https:\/\/ps.w.org\/vinceweb-shopping-lists\/assets\/icon-256x256.png?rev=3713516","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vinceweb-shopping-lists\/assets\/screenshot-1.jpg?rev=3713516","caption":""},{"src":"https:\/\/ps.w.org\/vinceweb-shopping-lists\/assets\/screenshot-2.jpg?rev=3713516","caption":""},{"src":"https:\/\/ps.w.org\/vinceweb-shopping-lists\/assets\/screenshot-3.jpg?rev=3713516","caption":""},{"src":"https:\/\/ps.w.org\/vinceweb-shopping-lists\/assets\/screenshot-4.jpg?rev=3713516","caption":""}],"raw_content":"<!--section=description-->\n<p>Vinceweb Shopping Lists provides simple shared-device shopping lists without requiring every person to have a WordPress account.<\/p>\n\n<p>Create separate lists for different people, protect each list with an optional PIN, and let shoppers plan and complete a trip from a phone, tablet, or desktop.<\/p>\n\n<p>Features include:<\/p>\n\n<ul>\n<li>Multiple separate shopping-list profiles.<\/li>\n<li>Optional PIN access without a WordPress login.<\/li>\n<li>Persistent products that remain available for future trips.<\/li>\n<li>Saved price and quantity for estimating the next shop.<\/li>\n<li>Editable store-location buttons such as Fruit &amp; Veg, Grocery, Bakery, Chilled, and Frozen.<\/li>\n<li>Custom ordering of store locations to match the route through a shop.<\/li>\n<li>Shopping mode with an \"In basket\" action.<\/li>\n<li>Per-shop basket, remaining, and estimated totals.<\/li>\n<li>Product and price editing while shopping.<\/li>\n<li>Catalogue-first product picker while shopping, with duplicate protection.<\/li>\n<li>Shop-specific normal and sale prices with persistent sale information.<\/li>\n<li>Shopping history, 12-month insights, and CSV export.<\/li>\n<li>Print only the items currently selected.<\/li>\n<li>Administrator-only profile and store-location management.<\/li>\n<li>Products are not deleted when an item is placed in the basket.<\/li>\n<li>No external services, tracking, advertising, or remote APIs.<\/li>\n<\/ul>\n\n<p>Use the shortcode:<\/p>\n\n<pre><code>[vinceweb_shopping_list]\n<\/code><\/pre>\n\n<p>For existing installations, the previous <code>[my_shopping_list]<\/code> and <code>[mothers_shopping_list]<\/code> shortcodes remain supported as compatibility aliases.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>The plugin stores shopping-list profile names, hashed PINs, product names, quantities, prices, store locations, selection state, and shopping state in the local WordPress database.<\/p>\n\n<p>When a profile is opened, the plugin sets HTTP-only cookies that remember the profile for up to 180 days. The cookies contain a profile identifier and a site-specific authentication token. PINs are stored as WordPress password hashes and are not stored in plain text.<\/p>\n\n<p>To reduce repeated PIN guessing, failed PIN attempts are temporarily rate-limited using a short-lived transient keyed from a one-way hash of the connecting IP address.<\/p>\n\n<p>No shopping-list information is transmitted to external services by this plugin.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>vinceweb-shopping-lists<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP through <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong>.<\/li>\n<li>Activate <strong>Vinceweb Shopping Lists<\/strong>.<\/li>\n<li>Add <code>[vinceweb_shopping_list]<\/code> to a WordPress page.<\/li>\n<li>Go to <strong>Shopping List &gt; Shopping Locations<\/strong>.<\/li>\n<li>Create or rename the people who need their own shopping lists and optionally assign PINs.<\/li>\n<li>Configure the store-location buttons in the order you normally walk through the shop.<\/li>\n<li>Share the shopping-list page with the people who need it.<\/li>\n<\/ol>\n\n<p>When upgrading from an earlier release, existing shopping products are assigned to the default <strong>Mum<\/strong> profile.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20someone%20need%20a%20wordpress%20account%20to%20use%20a%20list%3F\"><h3>Does someone need a WordPress account to use a list?<\/h3><\/dt>\n<dd><p>No. A visitor can choose a shopping-list profile and enter its PIN. The plugin remembers the selected profile on that device using secure HTTP-only cookies.<\/p><\/dd>\n<dt id=\"is%20a%20pin%20required%3F\"><h3>Is a PIN required?<\/h3><\/dt>\n<dd><p>No. Administrators can leave a profile PIN blank. A PIN is recommended when the shopping-list page is reachable by people who should not be able to edit the list.<\/p><\/dd>\n<dt id=\"can%20each%20person%20have%20a%20separate%20list%3F\"><h3>Can each person have a separate list?<\/h3><\/dt>\n<dd><p>Yes. Products, prices, quantities, selections, and shopping state are separated by profile.<\/p><\/dd>\n<dt id=\"can%20the%20store%20sections%20be%20changed%3F\"><h3>Can the store sections be changed?<\/h3><\/dt>\n<dd><p>Yes. Administrators can edit and reorder the shared store-location buttons under <strong>Shopping List &gt; Shopping Locations<\/strong>.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20tap%20%22in%20basket%22%3F\"><h3>What happens when I tap \"In basket\"?<\/h3><\/dt>\n<dd><p>The item disappears from the active shopping screen but the product, price, quantity, and location remain stored for future trips.<\/p><\/dd>\n<dt id=\"does%20uninstalling%20delete%20my%20shopping%20data%3F\"><h3>Does uninstalling delete my shopping data?<\/h3><\/dt>\n<dd><p>No. Shopping data and settings are intentionally preserved to reduce the risk of accidental data loss. The plugin role and administrator capability are removed on uninstall.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20data%20anywhere%3F\"><h3>Does the plugin send data anywhere?<\/h3><\/dt>\n<dd><p>No. The plugin does not use external APIs, analytics, advertising, or third-party services.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Renamed the public plugin to Vinceweb Shopping Lists and prepared the vinceweb-shopping-lists slug.<\/li>\n<li>Added the [vinceweb_shopping_list] shortcode while retaining previous shortcodes as compatibility aliases.<\/li>\n<li>Prefixed custom post type identifiers and added migration for existing installations.<\/li>\n<li>Moved print CSS into an enqueued static stylesheet.<\/li>\n<li>Clarified shortcode and installation documentation for WordPress.org review.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Added the required translator comment for the per-shop totals string.<\/li>\n<li>Documented the intentional php:\/\/output stream close for WordPress Coding Standards.<\/li>\n<li>Retained the existing meta-query implementation; Plugin Check reports it as a performance warning rather than an error.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Rebranded the public plugin name to My Shopping List.<\/li>\n<li>Added the [my_shopping_list] shortcode while retaining the original shortcode for compatibility.<\/li>\n<li>Added shop-specific normal and sale pricing with persistent sale information.<\/li>\n<li>Replaced combined trip totals with individual shop totals.<\/li>\n<li>Added catalogue-first product entry and duplicate protection.<\/li>\n<li>Added brand, size\/unit, notes, and favourite\/regular product fields.<\/li>\n<li>Added immutable completed-shop history for price and spend tracking.<\/li>\n<li>Added a 12-month Insights dashboard with shop spend, sale savings, and product price ranges.<\/li>\n<li>Added CSV shopping-history export.<\/li>\n<li>Preserved existing profiles, products, shops, locations, prices, cookies, and internal identifiers during upgrade.<\/li>\n<\/ul>\n\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Restored the Shopping List submenus under one top-level Shopping List menu.<\/li>\n<li>Lists &amp; People, Shops, Shopping Locations and Shopping Items are all grouped under Shopping List.<\/li>\n<li>Shopping Items no longer appears as a separate top-level menu.<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>Moved the Shopping Items custom post type under the main Shopping List admin menu.<\/li>\n<li>Shopping Items no longer appears as a separate top-level WordPress admin menu.<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>Consolidated all Shopping List administration into the single top-level Shopping List page.<\/li>\n<li>Removed the Lists &amp; People, Shops and Shopping Locations submenu entries.<\/li>\n<li>Shop and location saves now return to the main Shopping List admin page.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Added configurable shops above locations and aisles.<\/li>\n<li>Products can be assigned to a shop with tap-friendly buttons.<\/li>\n<li>Shopping and print lists are grouped by shop, then location\/aisle.<\/li>\n<li>Added Shopping List &gt; Shops in wp-admin.<\/li>\n<li>Existing products appear under Any shop until assigned.<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>Fixed a fatal AJAX error in the Not in stock action caused by a call to a non-existent profile-validation method.<\/li>\n<li>Not in stock now uses the same validated item lookup as the other shopping actions.<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>Fixed Not in stock so it correctly removes the item from the active shopping trip.<\/li>\n<li>The saved product, price, quantity, aisle and location remain available for future trips.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Added a Not in stock button in shopping mode.<\/li>\n<li>Not in stock removes the item from the current trip while preserving its saved product details for future trips.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Resolved WordPress Plugin Check internationalization, input sanitization, nonce-analysis, translation loading, uninstall naming, and readme warnings.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Added translator comments for all translatable strings containing placeholders, resolving WordPress Plugin Check i18n errors.<\/li>\n<\/ul>\n\n<h4>1.6.9<\/h4>\n\n<ul>\n<li>Added WordPress.org contributor username <code>vincewebdesign<\/code>.<\/li>\n<li>Prepared release metadata for WordPress.org submission testing.<\/li>\n<li>No functional changes from 1.6.8.<\/li>\n<\/ul>\n\n<h4>1.6.8<\/h4>\n\n<ul>\n<li>Made named locations and aisle numbers fully independent.<\/li>\n<li>Products can now use only an aisle number, only a named location, both, or neither.<\/li>\n<li>Named locations are grouped first, standalone aisles follow numerically, and unassigned items appear last.<\/li>\n<\/ul>\n\n<h4>1.6.7<\/h4>\n\n<ul>\n<li>Restored optional aisle numbers alongside named shopping locations.<\/li>\n<li>Products can have both a named location and an aisle number.<\/li>\n<li>Items are sorted by aisle number within each named location.<\/li>\n<li>Aisle numbers appear in planning, shopping mode, and print output.<\/li>\n<\/ul>\n\n<h4>1.6.6<\/h4>\n\n<ul>\n<li>Fixed profile switching on sites using page caching or host-level caching.<\/li>\n<li>Shopping-list pages now send no-cache headers and define <code>DONOTCACHEPAGE<\/code> while rendering.<\/li>\n<li>Profile login and Switch List now use cache-busting redirects so the newly selected person's name\/list is rendered immediately.<\/li>\n<\/ul>\n\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Added a dedicated Shopping List menu in wp-admin.<\/li>\n<li>Moved Shopping Locations under Shopping List &gt; Shopping Locations.<\/li>\n<li>Added Lists &amp; People under the same Shopping List menu.<\/li>\n<li>Updated admin redirects and documentation to use the new menu location.<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Fixed a critical runtime fatal error caused by registering a private migration method as a WordPress <code>init<\/code> callback.<\/li>\n<li>Audited all registered WordPress callbacks to ensure they are public.<\/li>\n<li>Keeps the minimal safe activation flow from 1.6.3.<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Removed legacy-plugin deactivation from the activation hook.<\/li>\n<li>Removed all data migration work from the activation request.<\/li>\n<li>Activation now only creates the plugin role\/capability.<\/li>\n<li>Added a safe legacy-build detector that shows an admin notice instead of booting two incompatible development builds together.<\/li>\n<li>Uses unique transition-release PHP identifiers.<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Fixed activation conflicts when older development copies of the plugin are still active.<\/li>\n<li>Uses unique internal PHP identifiers for the transition release.<\/li>\n<li>Automatically deactivates the known legacy <code>shipping-list<\/code> and <code>mothers-shopping-list-v2<\/code> copies during activation.<\/li>\n<li>Preserves all existing shopping-list data and settings.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Fixed profile switching so lists without a PIN open immediately.<\/li>\n<li>Prevented PIN entry from being treated as a browser password\/passkey field, avoiding unwanted fingerprint prompts.<\/li>\n<li>Improved Switch List so it clears shopping\/profile query state consistently.<\/li>\n<li>Added clearer selected-profile feedback while opening a list.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Prepared the plugin package and metadata for WordPress.org submission.<\/li>\n<li>Fixed PIN-authenticated AJAX actions for visitors who are not logged in to WordPress.<\/li>\n<li>Fixed printing for PIN-authenticated visitors.<\/li>\n<li>Added HTTP-only SameSite profile cookies.<\/li>\n<li>Added PIN attempt throttling.<\/li>\n<li>Preserved stable internal profile IDs when profile display names are changed.<\/li>\n<li>Added WordPress privacy-policy suggested text.<\/li>\n<li>Standardized the plugin directory slug to <code>mothers-shopping-list<\/code>.<\/li>\n<li>Added uninstall behavior that preserves shopping data while removing plugin roles and capabilities.<\/li>\n<li>Updated directory readme metadata and documentation.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added multiple personal shopping lists.<\/li>\n<li>Added PIN-based access without requiring a WordPress login.<\/li>\n<li>Added profile switching.<\/li>\n<li>Migrated existing products to Mum's list.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added administrator-editable store-location buttons.<\/li>\n<li>Added configurable location order.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added saved prices and quantities.<\/li>\n<li>Added estimated totals and Shopping Mode.<\/li>\n<li>Added In basket and Finish Shopping actions.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Made product rows and Edit controls more compact.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Changed printing to use the boxes visibly selected on screen.<\/li>\n<\/ul>","raw_excerpt":"Create private PIN-protected shopping lists with saved prices, quantities, store locations, shopping mode, totals, and printing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/372912","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=372912"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/vincewebdesign"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=372912"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=372912"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=372912"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=372912"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=372912"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=372912"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}