Every recorded version, newest first, with what changed in each one.
Latest 2.5.110 versions
Undated · 10 versions
2.5.1
Latest
1 fix
Fixed
On the Edit My List page, the item menu and the note editor were cut off at the bottom of the list, so on a one-item list or the last row they could not be used. Both open in full.
2.5.0
11 new29 fixes
New
Save for later, from the cart. Every cart line gets a "Save for later" link on the classic cart page and on the Cart block, for guests and customers alike. Saving moves the line onto a real wishlist called "Saved for later" - one per shopper, created on first use, and listed with their other lists so it can be renamed or shared like any of them.
The saved rows appear below the cart, each with the product image, name, price, availability and chosen options, a "Move to cart" button and a "Delete" link. On the Cart block, saving and moving back happen in place, with no page reload. With JavaScript off, every control is a real link and still works.
Move to cart puts the quantity back where it belongs. If the same product is already in the cart, the saved quantity is added to that line instead of making a duplicate; a product that can only be bought once is simply removed from the saved list, since it is already there.
Save for Later settings section. Choose whether saving removes the line from the cart (default) or leaves a copy in it, change the control's wording, or switch the feature off.
Logging in merges a guest's "Saved for later" list into the account's own, summing quantities where the same item appears in both, so nothing saved while logged out is stranded.
On a product with a Gravity Form or other add-on fields, the wishlist picker now offers "Save this configuration", so two differently configured copies of one product can be saved to one list; each is shown and removable on its own.
Item notes (up to 200 characters) and a Low / Medium / High priority per item, with "Allow notes" and "Share notes with: Visitors / No one" settings, and an "Allow priority" setting.
Hand-order a list with Move up / Move down buttons and arrow keys on the manage screen, plus "My order", Priority and Name sorts.
Move or copy items to another list from the manage screen - a per-row "Move to list…", "Move selected to list…" for a selection, an option to keep a copy on the source list, and create-a-list-and-move in one step; "Add to list" does the same from the Saved for later section.
A classic (no-JavaScript) "Copy to another List" bulk action.
My Lists shows each list's item count and when it last changed, renames and deletes lists in place (with a confirmation), and lets a shopper choose a default list - a quick save then targets the default, which the picker lists first.
Fixed
Share links for lists created from the product-page picker or the REST API opened a "not found" page. They open the list again, including links shared before this update.
"Add All To Cart" on a shared list, or on any list on a store using plain permalinks, landed the shopper on a "not found" page even though the items reached the cart. It now returns to the list with the confirmation.
Adding an item to the cart from a list now requires permission to view that list, on the list page and through the Store API alike. A private list's items can no longer be added by someone who is not its owner.
A public list's page no longer carries the list's sharing key in its "Add All To Cart" form, so a list made public and later switched back to shared is not left open to earlier visitors.
"Move to cart" from a saved row respects stock: an out-of-stock product, or a quantity the stock cannot cover, stays on the saved list with a notice. A product that still needs options chosen shows "Choose options" instead.
Security - a storefront URL parameter could make the price-change notification run resend every notification to every subscriber, by anyone, on any store with notifications enabled. It has been removed; runs now start only from the scheduled event or `wp wishlists send_notifications`.
The price-change notification run no longer empties the whole object cache once per wishlist.
Trashing a list in wp-admin erased its owner, sharing, email, names and subscribers, and restoring it left it as a hidden draft. Saving a list on its edit screen also turned a "Saved for later" list into an ordinary one, emptied its subscribers, and detached a guest's list from the guest. Only the fields on the form are saved now, and a restored list is published again.
A guest list assigned to a customer in wp-admin was hidden by the Wishlists screen's "Permanent" filter, showed no user in the User column, and reported an unknown status through the REST API. Such lists, including ones assigned before this update, are now treated as the customer's own everywhere.
After a list was reassigned to another customer or trashed in wp-admin, the previous owner could keep seeing it in My Lists, My Account and the move and copy menus for up to a day. Their lists now update straight away.
Deleting a list through the REST API now fires the 'wc_wishlists_deleted' action, as deleting from the classic pages and from wp-admin always has, so code listening for deleted lists no longer misses these. Deleting a list during a logged-out admin-ajax request no longer gives that visitor a wishlist identity.
Lists created from the product-page picker, the REST API or Save for later now get the customer's email address, like lists created on the Create a List page, so they receive price-drop notifications. They also run the same list-creation filters and the 'wc_wishlists_created' action. A list description sent through the REST API is now cleaned like the form's, which drops line breaks.
Lists customers created with the product-page picker or Save for later since 2.4.0 are given their account email once, in the background after the update, so they start receiving price-drop notifications. Lists that already have an email, or that are waiting for an email address to be confirmed, are not changed.
A list a guest built and then kept by logging in or registering never received price-drop notifications, because it had no email address. From now on such a list is given the customer's account email when it is claimed, unless it already has one. Lists claimed before this update are not changed.
When a list could not be created on the Create a List page, the form came back with no explanation. It now shows an error notice.
"Delete Lines" in a list's Items box in wp-admin removed the rows from the screen but never from the list, so they came back on reload. The items are now removed, and the rows leave the screen only once they have been.
With guest lists set to "Registration Required", visiting the Create a List page could make any other login form later on the same page - a theme's account popup, for example - send the shopper to the wishlist page after logging in.
The "Custom Buttons" colours in the Wishlists style settings had styled nothing since 2.4.0. They apply again to the Add to Wishlist button in button mode, on the product page, in the shop loop (including over the product image) and in the block.
Opening a list - by anyone who can see it, or by its owner on the manage screen - rewrote each item's saved price to today's price, so a price drop seen before the next notification run was never emailed. Viewing a list no longer changes saved prices. For developers: WC_Wishlists_Wishlist::get_items( 'view' ) no longer refreshes prices either (and so no longer fires 'wc_wishlists_wishlist_items_updated'); WC_Wishlists_Wishlist_Item_Collection::update_cached_prices is unchanged.
For developers: moving an item between lists on the classic manage screen now fires 'wc_wishlists_wishlist_items_updated' once for the list the item went to and once for the list it left. It used to fire twice for the list it left and never for the list it went to.
A hand-crafted request to move items from a list onto that same list deleted them, and copying them onto the same list doubled their quantity. Both are now refused with an "Invalid destination list" notice, and WC_Wishlists_Wishlist_Item_Collection::move_item and copy_item return false for them.
Moving or copying items into a list on the classic manage screen, or with "+ Create A New List", permanently deleted any item already on that list whose product had since been deleted from the store, including its purchase record. Those items now stay.
An item sent to a new list with "+ Create A New List" arrived still showing how many had been bought from the list it came from. It now arrives with no purchases, like an item moved or copied any other way.
With JavaScript off, "+ Create A New List" in the "Move to another List" actions copied the checked items to the new list and left them on the old one. It now moves them, as it always has with JavaScript on.
When logging in merges a guest's "Saved for later" items into the account's own, the merged items no longer take over places in the order the customer had arranged; they go after the arranged items.
Since 2.4.0, adding an item from the product-page picker, the REST API or Save for later did not fire 'woocommerce_wishlist_add_item', and changing items with JavaScript on - adding, removing, reordering, editing, moving, saving for later, moving a saved item back to the cart, or merging saved items on login - did not fire 'wc_wishlists_wishlist_items_updated'. Both fire again, the latter once for each list changed.
Running the price-drop notifications from WP-CLI no longer stops at the first email that fails to send. The run carries on, records what it sent, and does not mail the same shoppers again next time.
"No Recipients" is now printed when the price-drop notifications run from WP-CLI, and a store with notifications switched off (the default) is reported as information rather than an error.
Turning on custom button colours without saving any no longer logs a PHP deprecation notice on every page under PHP 8.1 and later.
2.4.4
2 fixes
Fixed
The "Date Added" column on the My Lists page and in the Wishlists table under My Account was always empty. It shows each list's date again.
With guest wishlists switched off, a logged-out visitor on the wishlist pages now sees the "log in or register" message from the settings instead of an empty box.
2.4.3
1 new1 fix
New
A "Require a variation" setting keeps Add to Wishlist inactive on a variable product's page until the shopper chooses options, the way Add to Cart waits. Off by default: saving the product first and choosing options later from the list stays the default.
Fixed
Security. A visitor's wishlist identity is held in a browser cookie, and a value shaped like a customer's account number was accepted as that customer. A crafted cookie could therefore read, rename, add to, take items from or delete another shopper's lists without signing in. Such a value is now rejected outright.
2.4.2
2 fixes
Fixed
On a product page that also lists other products - related products, upsells, or any shop loop - an Add to Wishlist button on one of those could act on the product at the top of the page instead of its own. With a variation chosen above, opening one of those buttons showed the list as already saved, and unticking it removed the product from the top of the page rather than the one whose button was open. Each button now reads only its own product's form.
Restored bind_wishlist_button as a deprecated no-op. Sites still running the temporary snippet our support team supplied for Divi Theme Builder in 2.3.x hit a fatal error on 2.4.0 and 2.4.1, because that method was removed. The snippet is no longer needed on 2.4.x and should be deleted, but it will no longer take the site down. Scheduled for removal in 3.0.0.
2.4.1
3 fixes
Fixed
The Add to Wishlist button's loading spinner stayed on screen on themes that style the contents of buttons, leaving a ring that kept spinning for as long as the page was open. It is hidden again unless the button is actually working.
The Add to Wishlist button's icon and its label keep their spacing on those themes, instead of sitting flush against each other. Add to Cart on the wishlist pages gets the same fix.
A product saved with options - a Gravity Forms entry, a Product Add-ons configuration, an engraving - is now stored as its own item. Saving the same product again with different options keeps both, rather than the newer one taking the place of the older, and saving the same configuration twice adds to its quantity. Items already on a list keep their place; the change applies to items saved from now on.
2.4.0
12 new10 improvements18 fixes
New
A new Add to Wishlist button. It shows whether the product is already saved - outlined icon when it is not, solid when it is - and keeps whatever wording you configured. Choose a heart, bookmark, star or gift icon, drawn in your theme's button colour. Screen readers hear "Saved" or "Saved to 3 lists"; the wording is a new "Saved State Text" setting.
Saving stays on the page. The list picker opens as a dialog showing which of your lists already hold the product; tick to save, untick to remove, name a new list and save to it in one step. A confirmation appears with a link to the list.
On a variable product the button and the picker follow the variation you have chosen, so two colours of the same product can be saved to one list and removed one at a time.
"One-click first save" setting. When a shopper has no lists yet, the first save goes straight to a new list called "My List" instead of opening the picker. Off by default.
The Add to Wishlist button appears in shop listings as well as on product pages, on classic and block themes. A new Product Listing Button section in the Wishlists settings switches it off, hides it on variable products, places it on the product image or above or below the add-to-cart button, and gives it its own text or none at all (icon only). 'woocommerce_wishlists_loop_position' and 'woocommerce_wishlists_render_in_loop' still override the settings, per product.
The "Add to Wishlist" and "Wishlist" blocks can be styled in the editor - colour, spacing, typography and border - and pick up your theme.json. On block themes the listing button is a real block in your product template: see it in the Site Editor, move it, restyle it, or delete it.
The list pages (View a List, Edit My List) are live. Change a quantity, remove an item, or add it to the cart without a page reload; Add to Cart shows a spinner while it works and a checkmark when it lands, with a confirmation linking to the cart. On block themes the Mini Cart count updates immediately. Everything still works with JavaScript off.
Abandoned guest lists are cleaned up automatically. A temporary list older than 30 days with no item saved in 30 days is deleted, so bot-created lists stop piling up. Lists belonging to accounts are never touched. Change the lifetime with 'wc_wishlists_temporary_list_lifetime_days' (0 disables).
A REST API, wc-wishlists/v1, for lists and items, with guest support and share keys. A price hidden by Catalog Visibility Options is hidden there too, and 'wc_wishlists_can_view_price' lets any plugin withhold one.
The confirmation's position is configurable via the 'wc_wishlist_snackbar_position' option or 'woocommerce_wishlist_snackbar_position' filter (bottom-left by default; any corner or centre edge).
'woocommerce_wishlists_loop_template_priority' positions the listing button within its hook, and 'woocommerce_wishlist_icons' / 'woocommerce_wishlist_icon_svg' add your own icons.
'wc_wishlists_use_classic_add_to_cart' sends a list row to the cart through a page reload instead of the Store API. Off by default; used automatically for saved Gravity Forms entries on Gravity Forms Product Add-ons older than 3.8.4.
Improved
A saved item that still needs a choice - a variable product with no variation chosen, or add-on fields not filled in - offers "Choose options" linking to the product page instead of an Add to Cart that could not add it. An item saved with its options chosen keeps them and its Add to Cart.
The icon setting now applies to the button as well as the link. Stores that left it on "Present" will see a gift icon on the button; choose "None" to keep the button plain.
Loading a shopper's lists no longer slows down as a store accumulates wishlists. On a store with 27,500 lists the worst case went from 11.5 seconds to under 50 milliseconds.
The sort/filter row and bulk-action rows on the list pages wrap on narrow screens instead of overflowing, and the Privacy Settings and Email Notifications choices are proper fieldsets with the whole row clickable.
The List Items / Settings tabs on Edit My List are a real tab strip: arrow keys move between them, screen readers are told which is current, and with JavaScript off both panels show.
List quantity inputs are number inputs carrying the product's stock maximum, matching WooCommerce's own.
"Add All To Cart" reports its count in the singular or plural as appropriate (translators will see a new string).
Wishlist pages send no-cache headers so a shared list is never served stale by a page cache.
Stylesheets and scripts are versioned by file date, so browsers pick up the new files after an upgrade instead of serving ones cached from an earlier release.
Minimum WordPress version is now 6.8 and minimum WooCommerce 10.4.
Fixed
Gift-registry purchase tracking - the "previously ordered" column and the "Automatic Removal" setting - had not run on any 2.3.x release. Both now work: rows are removed once an order reaches the configured status, and the column populates.
Creating an account while another shopper was signed in (single sign-on, membership or B2B flows that provision users; the wp/v2 users endpoint) reassigned that shopper's wishlists to the new account. Logins that establish the user before 'wp_login' fires now claim the guest's lists too.
"Add All To Cart" on the View a List page always failed with "Action failed. Please refresh the page and retry."
"Add All To Cart" adds exactly the items the list offers an Add to Cart for, tells the shopper which it skipped and why, no longer adds products with unfilled required add-on fields at base price, and reports the number it actually added.
The quantity typed in the list grid is now the quantity added to the cart, and "Add All To Cart" on the Edit screen saves those quantities to the list as documented. The saved quantity was being used instead.
The "Prompt for quantity when adding to cart" setting works again, still filterable per item via 'woocommerce_wishlist_use_add_to_cart_quantity_prompts'.
Typing a quantity on a list you are only viewing no longer errors or sends a logged-out visitor to the login page.
Adding an item to the cart from a list no longer carries the list's bookkeeping onto the cart line, which on a gift registry could split one item into two cart lines after another guest's checkout.
List rows no longer offer Add to Cart for products that cannot be purchased, such as a product with no price.
A product whose purchases Catalog Visibility Options has switched off could still be added to the cart through a list row's add-to-cart link, because that link never asked. Both add paths now refuse it with "Purchases are currently disabled", as the list itself already did by offering no button. Saving such a product to a list is unaffected.
An external product's buy link is no longer hidden by the purchase filters or by Catalog Visibility Options - those govern this store's cart, and the link is the shopper's only route to the product.
Purchase controls on both list screens now honour 'woocommerce_wishlist_purchases_enabled', both spellings of 'woocommerce_wishlist_user_can_purchase', and Catalog Visibility Options' per-product restrictions. Each screen previously honoured a different subset.
On Edit My List, the second Actions dropdown below the grid did nothing without JavaScript, and pressing Apply Action with no action chosen reported "Invalid destination list".
The List Items / Settings tabs on Edit My List rendered as two stacked rows in Storefront and themes derived from it.
The "In Category:" label on View a List pointed at the Sort by dropdown.
The Items box on a wishlist's wp-admin screen showed each product image at its full upload size. It asked for an image size WooCommerce no longer registers; it now uses the gallery thumbnail.
The [wc_wishlists_add_link] shortcode linked to the retired add-to-wishlist URL, so clicking it reloaded the page and saved nothing. It now renders the same Add to Wishlist control as the product page, for the product it names, with 'title' as the button text.
The 'woocommerce_wishlists_loop_template_location' filter could not be set from a theme's functions.php or a snippets plugin; it was read before the theme loaded.
2.3.23
1 improvement
Improved
WordPress 6.5 is now the minimum supported version
2.3.22
2 fixes
Fixed
Empty wishlists were being created for requests that could not add anything. On a variable product, following the add-to-wishlist link without choosing options created the list first and only then discovered there was nothing to put in it, leaving it behind - so search engine crawlers, which follow that link, produced one empty temporary list per visit. One store accumulated 11,000 of them. The product is now resolved and checked before any list is created, so a request that cannot add anything leaves nothing behind. Existing empty lists are not removed by this update; they can be deleted safely.
Choosing a variation through the add-to-wishlist link failed with "Please choose product options" even when the options were named in the URL. The variation lookup read only posted data, while the link is a normal link and carries its attributes in the query string. It now reads both, matching the validation immediately after it, which always did.
2.3.21
1 improvement2 fixes
Improved
Bumped the asset cache-busting version, which had been left at 2.3.9. Front-end script and style changes since then could be served stale from browser and page caches.
Fixed
On a variable product, clicking "Add to wishlist" before selecting a variation threw a JavaScript error (TypeError: $form.find is not a function) rather than doing nothing. The disabled-state guard returned false, which stops the click bubbling past the body element but not the second click handler delegated on that same element; that handler then ran before the add-to-cart form had been resolved. Themes that keep the control hidden until a variation is chosen never exposed this - it surfaces on layouts that render the control visible from page load, such as Divi Theme Builder product templates.
On a variable product the add-to-wishlist control gave no sign it was inactive until a variation was chosen - it kept full opacity and a pointer cursor, so clicking it appeared to do nothing. It now dims and shows a not-allowed cursor, matching WooCommerce's own disabled add-to-cart button. Only the link version of the control was affected; the button version already inherited this from WooCommerce.
Changelog published by the developer, in their original language.