ÃÛ¶¹ÊÓƵ Commerce 2.4.7 release notes
ÃÛ¶¹ÊÓƵ Commerce 2.4.7 introduces support for PHP 8.3. It introduces hundreds of quality fixes and enhancements. Core Composer dependencies and third-party libraries have been upgraded to the latest available versions. This release includes significant performance improvements, including faster loading of product listing pages for complex products with many options and enhancements for indexer management. This release increases GraphQL coverage for custom attributes and GraphQL resolver caches. It also introduces support for recently updated FedEx and UPS services.
Other release information
Although code for these features is bundled with releases of the ÃÛ¶¹ÊÓƵ Commerce core code, several of these projects (for example, B2B and Progressive Web Applications (PWA) Studio) are also released independently. Bug fixes for these projects are documented in the separate, project-specific release information that is available in the documentation for each project.
ÃÛ¶¹ÊÓƵ Commerce 2.4.7 highlights
Look for the following highlights in this release.
Security enhancements
This release includes the same security fixes and platform security improvements that are included in ÃÛ¶¹ÊÓƵ Commerce 2.4.6-p5, 2.4.5-p7, and 2.4.4-p8. See for the latest discussion of these fixed issues.
No confirmed attacks related to these issues have occurred to date. However, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. Most of these issues require that an attacker first obtains access to the Admin. As a result, we remind you to take all necessary steps to protect your Admin, including but not limited to these efforts:
- IP allowlisting
- Use of a VPN
- Use of a unique location rather than
/admin
- Good password hygiene
Additional security enhancements
Security improvements for this release improve compliance with the latest security best practices.
-
Changes to the behavior of non-generated cache keys:
- Non-generated cache keys for blocks now include prefixes that differ from prefixes for keys that are generated automatically. (Non-generated cache keys are keys that are set through template directive syntax or the
setCacheKey
orsetData
methods.) - Non-generated cache keys for blocks now must contain only letters, digits, hyphens (-), and underscore characters (_).
- Non-generated cache keys for blocks now include prefixes that differ from prefixes for keys that are generated automatically. (Non-generated cache keys are keys that are set through template directive syntax or the
-
Limitations on the number of auto-generated coupon codes. Commerce now limits the number of coupon codes that are automatically generated. The default maximum is 250,000. Merchants can use the new Code Quantity Limit configuration option (Stores > Settings:Configuration > Customers > Promotions) to prevent potentially overwhelming the system with many coupons.
-
Optimization of the default Admin URL generation process. The generation of the default Admin URL has been optimized for increased randomness, which makes generated URLs less predictable.
-
Added Subresource Integrity (SRI) support to comply with PCI 4.0 requirements for verification of script integrity on payment pages. Subresource Integrity (SRI) support provides integrity hashes for all JavaScript assets residing in the local filesystem. The default SRI feature is implemented only on the payment pages for the Admin and storefront areas. However, merchants can extend the default configuration to other pages. See in the Commerce PHP Developer Guide.
-
Changes to Content Security Policy (CSP)—Configuration updates and enhancements to ÃÛ¶¹ÊÓƵ Commerce Content Security Policies (CSPs) to comply with PCI 4.0 requirements. For details, see in the Commerce PHP Developer Guide.
-
The default CSP configuration for payment pages for Commerce Admin and storefront areas is now
restrict
mode. For all other pages, the default configuration isreport-only
mode. In releases prior to 2.4.7, CSP was configured inreport-only
mode for all pages. -
Added a nonce provider to allow execution of inline scripts in a CSP. The nonce provider facilitates the generation of unique nonce strings for each request. The strings are then attached to the CSP header.
-
Added options to configure custom URIs to report CSP violations for the Create Order page in the Admin and the Checkout page in the storefront. You can add the configuration from the Admin or by adding the URI to the
config.xml
file.note note NOTE Updating the CSP configuration to restrict
mode might block existing inline scripts on payment pages in the Admin and storefront, which causes the following browser error when a page loads:Refused to execute inline script because it violates the following Content Security Policy directive: "script-src
. Fix these errors by updating the whitelist configuration to allow required scripts. See in the Commerce PHP Developer Guide.
-
-
A new full-page cache configuration setting can help to mitigate the risks associated with the HTTP
{BASE-URL}/page_cache/block/esi
endpoint. This endpoint supports unrestricted, dynamically loaded content fragments from Commerce layout handles and block structures. The new Handles params size configuration setting sets the value of this endpoint’shandles
parameter, which determines the maximum allowed number of handles per API. The default value of this property is 100. Merchants can change this value from the Admin (Stores > Settings:Configuration > System > Full Page Cache > Handles params size). See Configure the Commerce application to use Varnish. -
Native rate limiting for payment information transmitted through REST and GraphQL APIs. Merchants can now configure rate limiting for the payment information transmitted using REST and GraphQL. This added layer of protection supports prevention of carding attacks and potentially decreases the volume of carding attacks that test many credit card numbers at once. This is a change in the default behavior of an existing REST endpoint. See .
-
The default behavior of the GraphQL query and the () REST endpoint has changed. By default, the APIs now always return
true
. Merchants can enable the original behavior by setting the Enable Guest Checkout Login option in the Admin toyes
, but doing so can expose customer information to unauthenticated users.
Platform enhancements
Platform upgrades for this release improve compliance with the latest security best practices.
ÃÛ¶¹ÊÓƵ Commerce 2.4.7 includes the following platform upgrades:
- PHP 8.3 compatibility. This release introduces support for PHP 8.3. Commerce now supports both PHP 8.3 and 8.2. PHP 8.2 will be supported until its End of Service (EOS) date in December 2025. After December 2025, all merchants running 2.4.7 deployments should migrate to PHP 8.3.
ÃÛ¶¹ÊÓƵ Commerce 2.4.7 is still compatible with PHP 8.1 for upgrade purposes only. PHP 8.1 is not supported and not recommended. ÃÛ¶¹ÊÓƵ Commerce 2.4.7 core code, all bundled extensions, and all ÃÛ¶¹ÊÓƵ-owned extensions and SaaS services are compatible with PHP 8.3.
-
RabbitMQ 3.13 support. This release is compatible with the latest version of RabbitMQ 3.13. Compatibility remains with RabbitMQ 3.11 and 3.12, which is supported through August 2024 and December 2024 respectively, but ÃÛ¶¹ÊÓƵ recommended using ÃÛ¶¹ÊÓƵ Commerce 2.4.7 only with RabbitMQ 3.13.
-
Composer 2.7.x. Compatibility with Composer 2.2.x remains.
-
Varnish cache 7.4 support. This release is compatible with the latest version of Varnish Cache 7.4. Compatibility remains with the 6.0.x and 7.2.x versions, but we recommended using ÃÛ¶¹ÊÓƵ Commerce 2.4.7 only with Varnish Cache version 7.4 or version 6.0 LTS.
-
Elasticsearch 8.11 compatibility
-
Opensearch 2.12 and OpenSearch 1.3 support
-
Redis 7.2
-
The
extjs
library has been replaced with the latest version ofjsTree
. -
jquery/fileUpload
library has been removed.
All JavaScript libraries and NPM dependencies in ÃÛ¶¹ÊÓƵ Commerce core code have been updated to the latest available versions. All Laminas library dependencies have been updated to the latest version that are compatible with PHP 8.3.
Additional upgrades
-
Multiple coupons per order support. Merchants can now configure the maximum number of coupons that can be applied per order with the new Maximum number of coupons per order configuration option. This value is set to 1 by default. You can now use or to apply multiple coupons to a cart.
-
The Commerce UPS XML API gateway has been migrated to the new Commerce UPS REST API to support updates that UPS is making to their . (UPS is implementing an OAuth 2.0 security model (bearer tokens) for all APIs.) All previous Commerce UPS XML APIs have been removed from the ÃÛ¶¹ÊÓƵ Commerce 2.4.7 code base.
-
ÃÛ¶¹ÊÓƵ Commerce integration with FedEx has been migrated from legacy FedEx WSDL Web Services to the latest FedEx RESTful APIs. FedEx Web Services Tracking, Address Validation, and Validate Postal Codes WSDLS will be retired in May 2024.
-
Added support for the new USPS Ground Advantage shipping method. This is an out-of-box integration with USPS’s new shipping method, USPS Ground Advantage, which was released July 2023. This new integration can be used to retrieve shipping rates and schedule deliveries and returns through the USPS shipping service. The USPS Ground Advantage shipping method replaces these shipping methods, which were retired when the USPS Ground Advantage shipping method was released:
- USPS Retail Ground
- First-Class Package Service
- Parcel Select Ground
-
Temando shipping modules have been removed from the core Commerce code base. This feature was deprecated in ÃÛ¶¹ÊÓƵ Commerce 2.4.4.
Performance and scalability enhancements
Commerce 2.4.7 includes the following enhancements to Commerce performance and scalability:
-
Enterprise merchants can now configure up to one million active, coupon-based cart price rules in ÃÛ¶¹ÊÓƵ Commerce with no significant performance degradations of cart and checkout operations.
-
Enhanced indexer management. The new
indexer:set-status
command supports the dynamic management of indexer status. Admin users can use this command to change indexer status tosuspended
,invalid
, orvalid
. This feature is particularly useful for managing system performance during extensive bulk operations, such as product imports or updates, by allowing control over when indexers are automatically triggered by the system’s cron jobs. See Manage the indexers. -
Product listing page for complex products with many options. Load time has improved for product listing pages that include complex products with over 100 options. The performance of GraphQL requests to list products by category has also improved.
-
JSON format now supported for the REST . Merchants can now import up to 100,000 records per minute into ÃÛ¶¹ÊÓƵ Commerce in JSON format.
-
Sales rule performance improvements. Improved performance of enterprise deployments with many (approximately 100,000) active sales rules. Enterprise deployments that heavily implement promotions often deploy many active cart rules. These types of enterprise deployments running Commerce 2.4.7 will not see any performance degradation related to the number of configured cart price rules during checkout operations.
-
Faster save operations of store-level configurations for deployments with many stores. Saving configuration settings in deployments with more than 500 stores can be time-consuming. The new Async Config module enables asynchronous configuration save operations by running a cron job that uses a consumer to process the save operation in a message queue. AsyncConfig is disabled by default.
-
Faster generation of the config cache for large configurations. The
bin/magento cache:clean config
command now pre-warms the config cache when the config cache is enabled. This reduces the downtime required to generate the config cache for large configurations. Configuration save operations no longer clean theconfig_scopes
cache before writing data to the cache, which also reduces the time that other requests are locked out while config data is being written.
GraphQL Application Server
GraphQL Application Server enables ÃÛ¶¹ÊÓƵ Commerce to maintain state among Commerce GraphQL API requests and eliminates the need for bootstrapping, which results in higher throughput, lower latency, and efficient resource use for all GraphQL APIs. By sharing application state among processes, GraphQL API requests become significantly more efficient, and GraphQL API responses are on average 30% faster.
GraphQL Application Server is available for ÃÛ¶¹ÊÓƵ Commerce only. It is not available for Magento Open Source. You must submit an ÃÛ¶¹ÊÓƵ Commerce Support ticket to enable GraphQL Application Server on Pro projects.
ÃÛ¶¹ÊÓƵ Commerce Extension metapackage
This release introduces the ÃÛ¶¹ÊÓƵ Commerce Extension metapackage v2.0.0, which automatically bundles select ÃÛ¶¹ÊÓƵ Commerce extensions with this core release. The versions of these extensions that are included in this metapackage are installed when composer update
is run, simplifying the process of upgrading these extensions when upgrading to the latest core release. These extensions maintain independent release schedules.
The ÃÛ¶¹ÊÓƵ Commerce Extension metapackage for ÃÛ¶¹ÊÓƵ Commerce 2.4.7 includes these extensions:
Future versions of this extension metapackage may contain additional extensions.
ÃÛ¶¹ÊÓƵ Commerce webhooks
Commerce webhooks (v1.2.0 ) enable developers to configure synchronous logic to execute calls to external systems when an ÃÛ¶¹ÊÓƵ Commerce event triggers. Synchronous calls are required when Commerce must immediately compute or validate a value such as an order total, tax, or payment using a third-party endpoint and subsequently write the result back into ÃÛ¶¹ÊÓƵ Commerce.
Commerce webhooks is now installed by default. See
ÃÛ¶¹ÊÓƵ Stock
The ÃÛ¶¹ÊÓƵ Stock package (adobe-stock-integration
) is now packaged in the Commerce extensions meta package (extensions-metapackage
) to support more frequent updates.
B2B
Braintree
-
Vaulted PayPal and Pay Later Changes—Logged-in customers who have previously vaulted/stored their PayPal account have the option to pay with:
- Pay Now (without having to log into their PayPal account, the user can pay with their default card)
- Pay with a different funding source
- Pay with a different account
- PayPal Pay Later or PayPal Credit button
-
3DS support for Google Pay—Included 3DS verification support for the Google Pay non-tokenized cards. See the for more information.
-
Vault Apple Pay Payments—Allow logged-in customers to vault/store their Apple Pay payments to their Commerce store account to use on future transactions. This reduces the number of steps on checkout and creates a faster checkout experience for the returning customer.
-
Vault Google Pay Payments—Allow logged-in customers to vault/store their Google Pay payments to their Commerce store account to use on future transactions. This reduces the number of steps on checkout and creates a faster checkout experience for the returning customer.
-
Vault Venmo Payments—Allow logged-in customers to vault/store their Venmo accounts to their Commerce store account to use on future transactions. This reduces the number of steps on checkout and creates a faster checkout experience for the returning customer.
-
Vault ACH Payments—Allow logged-in customers to vault/store their ACH payments to their Commerce store account to use on future transactions. This reduces the number of steps on checkout and creates a faster checkout experience for the returning customer.
-
Express Payment buttons at the top of checkout—To encourage a faster checkout experience, we’ve introduced Express Payment options at the beginning of the checkout. Customers can now pay by PayPal, PayPal Pay Later, Apple Pay, and Google Pay Express payments.
-
Braintree release notes and Support links within the Admin Configuration—Merchants can now directly link from the Commerce Admin to Braintree support and release notes online.
-
GraphQL support for all Braintree payment methods except Venmo—More configurations are exposed in the GraphQL API. This is particularly useful for headless applications.
-
Vaulting payments in account area—Logged-in customers can now vault/store new credit/debit cards and PayPal accounts in the Customer account area. Previously, customers could only vault/store when saving their payments for later use when completing a transaction on the checkout, now they can vault new credit/debit cards and PayPal accounts without needing to create a new transaction.
-
Frictionless Transactions—Frictionless transactions accelerate the payment process by reducing the amount of customer clicks/steps to complete an online credit/debit card transaction. Previously (when 3DS was enabled), every customer was 3DS challenged. With the new Frictionless Transactions feature, customers are only challenged for 3DS when the bank requests it. This reduces cart abandonment, increases conversion rates, and leads to more sales.
-
Dispute webhooks—When a customer disputes a transaction in Braintree, the dispute status is now passed on to Commerce. It is searchable in the Sales > Order grid and attached to each order.
Commerce integration with ÃÛ¶¹ÊÓƵ IMS
The ÃÛ¶¹ÊÓƵ IMS integration package (adobe-commerce/adobe-ims-metapackage
) is now packaged in the Commerce extensions meta package (extensions-metapackage
) to support more frequent updates.
GraphQL
Commerce 2.4.7 includes enhanced GraphQL caching abilities, support to the GraphQL schema for custom attributes, support for headless order cancellation, and improved resolver caching.
-
More flexible cart management. The
clearCart
mutation now clears the contents of a specified shopping cart in a single action. It replaces theclearCustomerCart
mutation, which has been deprecated. -
Improvements in create cart mutations. The
createGuestCart
mutation has been added to replace the deprecatedcreateEmptyCart
mutation. Previously, if you usedcreateEmptyCart
, you could not determine whether the cart was for a guest or logged-in customer. -
Order items now include product images.
OrderItemInterface
exposes product images, which permits images to be associated with ordered products and load more efficiently. -
Expanded support for resolver caching. The following GraphQL query resolvers are now cacheable in the GraphQL Resolver Results cache, which improves performance when queries are submitted with POST requests:
Magento\CustomerGraphQl\Model\Resolver\Customer::resolve
Magento\CustomerGraphQl\Model\Resolver\CustomerAddress::resolve
Magento\CustomerGraphQl\Model\Resolver\IsSubscribed::resolve
Magento\CatalogGraphQl\Model\Resolver\Product\MediaGallery::resolve
-
Support for order cancellation. The mutation allows a customer to cancel an order, passing its identifier and a cancellation reason.
- The new
order_cancellation_enabled
andorder_cancellation_reasons.description
response fields in thestoreConfig
query support user-initiated order cancellation requests. See
- The new
-
Enhanced support for custom attributes. GraphQL custom attribute support has been enhanced by enriching API data to support all attribute types. The GraphQL EAV attributes schema now supports extending customer attributes and customer address objects in the Admin and retrieving them using GraphQL. Specific areas of enhancement include:
- extended/added custom attributes support to specific areas such as customer and customer address
- added caching for custom attributes
- enhanced existing custom attributes support for products
-
Enhanced GraphQL caching capabilities improve page load speed. Caching capability has been added to these queries, improving the speed of page load time for most PWA pages:
- and
-
Improved GraphQL parser performance. GraphQL parser performance has been improved by reducing the number of times the parse method is called per request. It is now called once. Previously, the parser was called at least three times.
New fields for existing mutations
-
Added the
quickorder_active
field to the and queries. This field indicates whether the quick order feature is enabled. -
Added the following fields to the
setBillingAddressOnCart
andsetShippingAddressesOnCart
mutations:fax
middlename
prefix
suffix
New queries and mutations
- query
- query
- query
- query
- query
- mutation
- query
- mutation
- mutation
- mutation
- mutation
- mutation
- mutation
- mutation
Deprecated queries and mutations
clearCustomerCart
mutation- mutation
- query
- query
Inventory Management
Inventory Management (v1.2.7) provides tools to manage product inventory. This community-developed feature is bundled with ÃÛ¶¹ÊÓƵ Commerce and Magento Open Source core code.
Payments
-
GraphQL support has been added for core operations for all payment methods except for Venmo. New GraphQL endpoints for payment services are described in .
-
Credit card vaulting has been enhanced for all payment methods except for Venmo. Shoppers can now vault, or save, their ACH payments and view or delete them from their account page. Merchants can enable and disable ACH vaulted payments from the Admin.
-
The checkout workflow now includes an express payment section that provides PayPal, Google Pay, and Apple Pay Express buttons.
Payment Options introduces supported payment methods.
PWA Studio
PWA Studio v14.0 is compatible with ÃÛ¶¹ÊÓƵ Commerce 2.4.7. It includes multiple enhancements to improve accessibility. For information about bug fixes, see . See for a list of PWA Studio versions and their compatible ÃÛ¶¹ÊÓƵ Commerce core versions.
Web API framework
Working with multiple coupons per cart
New REST endpoints support viewing, adding, and deleting multiple coupons associated with a cart.
V2
instead of V1
. For example, GET /rest/default/V2/carts/{cartId}/coupons
. For Commerce merchants, these endpoints are meant to replace the V1
versions of the endpoints. These endpoints are only available in ÃÛ¶¹ÊÓƵ Commerce.Return all coupon codes that are associated with a cart:
GET /rest/{store_code}/V2/carts/{cartId}/coupons
GET /rest/{store_code}/V2/carts/mine/coupons
Append a coupon code to a cart:
POST /rest/{store_code}/V2/carts/{cartId}/coupons/{couponCode}
POST /rest/{store_code}/V2/carts/mine/coupons/{couponCode}
Replace coupon codes in a cart:
PUT /rest/{store_code}/V2/carts/{cartId}/coupons
PUT /rest/{store_code}/V2/carts/mine/coupons
Remove coupon codes from a cart:
POST /rest/{store_code}/V2/carts/{cartId}/coupons/deleteByCodes
POST /rest/{store_code}/V2/carts/mine/coupons/deleteByCodes
Additional endpoints
This release introduces two new REST endpoints that provide a workaround for a limitation with the REST API GET
and POST V1/products/attributes
endpoints. These endpoints return the same value for the is_filterable
attribute for both the Filterable(with results)
and Filterable(no results)
options of the Use in Layered Navigation option. (The is_filterable
attribute property is of type Boolean
, which does not permit setting this property to Filterable(no results)
.)
Two new REST endpoints have been implemented as a workaround:
PUT /V1/products/attributes/{attributeCode}/is-filterable/{isFilterable}
. Path parameters:attributeCode
(String
) andisFilterable
(int
values are: 0 is No; 1 isFilterable (with results)
; 2 isFilterable (no results)
).GET /V1/products/attributes/{attributeCode}/is-filterable
. Path parameters:attributeCode
(String
).
Fixed issues
We have fixed hundreds of issues in the ÃÛ¶¹ÊÓƵ Commerce 2.4.7 core code. A subset of the fixed issues included in this release is described below. Fixes included in previous Commerce 2.4.7-beta releases are also described.
Installation, upgrade, deployment
- Unnecessary cache manipulation has been removed from the set-up process. Previously, Commerce wrote its configuration to disk unnecessarily when
bin/magento setup:db-data:upgrade
orbin/magento setup:upgrade
was run, which caused issues with som modules during setup.
- Deployment issues due to insufficient memory and large tables have been resolved. The
bin/magento setup:upgrade
command no longer fails due to memory-exceeded errors that are related to large MySQL tables.
bin/magento setup:install
now completes successfully afterapp/etc/config.php
has been deleted. Previously, the missing file was not regenerated during installation, and Commerce threw an error.
bin/magento setup:upgrade
has been refactored to run successfully when installing a new module that installs both tables and associatedmview
indexers.
- Database restoration no longer fails due to a delimiter error. Previously, Commerce threw this error when
bin/magento setup:rollback --db
was executed:Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'delimiter' at line 1, query was: delimiter ;;
.
- The
bin/magento setup:upgrade
command no longer fails with this type of MySQL memory limit-related error:PHP Fatal error: Allowed memory size of 4294967296 bytes exhausted (tried to allocate 20480 bytes)
. Multi-select attribute migration has been optimized to consume less memory duringsetup:upgrade
.
- Generating a database backup now works as expected from both the Admin and command line. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error:
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'delimiter' at line 1, query was: delimiter ;;
.
- Running
setup:config:set
without specifying the--lock-db-prefix
parameter no longer erases the current value from theenv.php
file.
- Varnish configuration has been updated to prevent guest users from accessing cached content related to other customer groups.
- Shoppers can now place an order in a deployment that implements split database when Checkout Async is enabled. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error:
An error occurred on the server. Please try to place the order again
.
bin/magento setup:upgrade
now completes successfully when installing a new module that installs both tables and associatedmview
indexers.
bin/magento setup:upgrade
now displays a more informative error message when a message queue topic does not include a topic name.
bin/magento setup:upgrade
now displays a more informative error message when merged XML files are invalid. The error message now includes the filename.
Admin UI
- Charts are now successfully disabled by default on the dashboard.
- The Admin Sales menu now displays submenus correctly. Previously, the column break did not work correctly, and some submenus were not displayed.
- Select dropdown menu options are now visible on Admin Content > Pages when multiple pages are selected in the grid.
- Corrected the path to the default value of
system/dashboard/enable_charts
in configuration settings. Charts are now displayed in the Admin as expected.
- Corrected display issue with Admin Customer grids. Previously, grid columns were not completely contained within the displayed page.
- Hover colors are now applied as expected on the rows of Admin static grids.
- The checkout workflow no longer displays a warning when a shopper enters a postal code for Greece that does not contain a blank space.
- The Admin
It's time to change your password
link now redirects to the Change Admin Password page as expected.
- Submenu titles now indicate any siblings irrespective of the access level that is assigned to the user. Previously, this information was hidden from admin users with limited access, even if multiple sibling groups existed for the submenu.
- Page title suffixes are now included in both the
title
tag and themeta title
tag for product pages.
- The product stock status condition is now correctly applied for related products rules.
- The Login as Customer button is now displayed correctly on mobile devices.
- ÃÛ¶¹ÊÓƵ Commerce no longer displays the Admin Add new customer group button if the logged-in admin user lacks permission to add a new customer group.
- An admin user with restricted permissions can now save a child product whose parent product is assigned to a different scope. Previously, Commerce invalidated the cache for a parent product that was not assigned to the scope in which the child product was changed.
- Admin users can now successfully switch between Admin filter views without view data being corrupted or lost.
- The archived order grid is now asynchronously updated with new order statuses as expected. An event-based approach to updating order status in the archive grid results in accurate order status, including post-credit memo refunds.
- The Admin grid actions dropdown menu can now hover as expected over a selected link for Content > Pages (and shared catalogs in the B2B module). Previously, this menu was mostly hidden, and admin users had to scroll to see options.
Analytics
- The product detail page
meta itemprop="image"
andmeta itemprop="description"
properties are now available for the main product image.
- The Report section of the Products in Carts grid now displays the correct product price when Catalog Price Scope is set to Website. Previously, the product price was displayed as zero when the product was assigned to a website other than the default website.
- Revenue reports are now displayed as expected in the Google Analytics (GA4) portal.
price
andquantity
values in the Google Tag Manager data layer are now sent as numeric values as expected to Google Analytics. Previously, these values were sent as strings.
- Errors in handling header data when sending deployment data to the New Relic module have been resolved.
- Google Analytics 3 tags are now triggered as expected when the Google Analytics 4 tags are disabled.
Banner
- Refactored the way banner content is loaded to remove excessive database queries, resulting in improved cart load times.
Bundle products
- The category product count now correctly accounts for bundle products when Display Out Of Stock* is enabled.
- The
customerCart
query now returns all applied discounts on bundle products as expected. Previously, the total discounts that were applied to a bundle product were returned as zero.
- Product detail pages now display the correct price for bundle products for which a 100% discount has been applied. Previously, Commerce did not apply a 100% discount to bundle product prices.
- Cart price rules are now applied to product bundles instead of to each child product for dynamic-priced bundled products.
- Corrected an error that occurs when you use the
POST V1/shipment
endpoint to create a shipment containing a bundle product. The endpoint now adds items as expected and no longer returns this error:The shipment couldn't be saved
.
- You can now save a scheduled update of a bundle product that includes a simple product that has an indefinite scheduled update. When the bundle product snapshot is created, the linked products are now grabbed by ID, entity ID, and also by SKU. Previously, the original version of the simple product was checked when the scheduled update on the bundle product was saved instead of the current version of the simple product.
- You can now use the
GET V1/shipment/
API route to create a shipment with a bundle product when the product has the together shipment type set. Bundle products are also now validated based on their shipment type property.
- Shoppers can now edit the quantity of a bundle product in their storefront shopping cart. Previously, ÃÛ¶¹ÊÓƵ Commerce did not handle null values for
ItemId
when products were edited in the storefront shopping cart and displayed an error.
- Bundle products can now be successfully added to an Admin order using SKUs that contain a slash (
/
) character. Previously, admin users could not use this method to add products to an Admin order, and Commerce threw a JavaScript error.
- Admin users can now set decimal default values for newly added bundle options when Qty Uses Decimal is enabled for the corresponding simple product. Previously, decimal values could be set only for saved selections.
- Optimized performance for saving bundle products with a large number of options
- Bundle products are now successfully imported without duplicating SKUs in product options. Previously, ÃÛ¶¹ÊÓƵ Commerce created multiple duplicate SKUs in product options when you imported bundle products with duplicate entries.
- Bundle product price is now calculated properly when one of the products in the bundle is out of stock. Previously, if a product that was part of the bundle were out of stock, it was removed from the price calculation.
- Bundle products are now displayed as out of stock when the last of their required child products are bought. Previously, bundle products were displayed as in-stock on the storefront when their simple products were out of stock.
- Performance issues when adding bundle products with non-required options to the cart using the
addBundleProductsToCart
mutation have been resolved.
- The
categoryList
query now returns all bundle options as expected when the Show out-of-stock products configuration setting is enabled. Previously, out-of-stock options were not included in the query response.
- Bundle products created with
POST V1/products
now succeed when catalog price scope is set towebsite
. Previously, an integrity constraint violation occurred.
Cache
- Categories are now visible to shoppers in stores where the cache is set to Fastly CDN (Caching Application=Fastly CDN). This affected both guest shoppers and registered customers.
- Cache cookies after login are now the same after browsing the website. Previously, the login controller sent the wrong cache cookie, and pages might have been cached multiple times.
- Responses from GraphQL GET operations on CMS pages that contain CMS blocks are now cleared as expected in Fastly cache. Subsequent schedule updates now show accurate, update content for these pages.
- Page cache is now cleared as expected for a parent product when one of its child products has been saved from the Admin. A plugin check has been introduced to reach cache invalidation for configurable variants, similar to other product types, irrespective of indexer state (scheduled or real time). Previously, prices were not updated properly on the storefront after a configurable variation was updated from the Admin.
- Added a caching mechanism for AWS credentials. A credentials provider now uses the Commerce cache to cache credentials retrieved from AWS for EC2 configuration.
- The plugin whose purpose is to add the configurable cache tag when a simple product associated with a configurable product is saved now works as expected. All relevant configurable cache tags are removed as expected when a simple product is updated by
POST V1/products
. Previously, not all prices were updated on the storefront, and caches had to be manually cleared.
Cart and checkout
- Commerce now optimizes performance by not loading user-specific quote data when generating full page cacheable pages such as Product Details Pages (PDP) and CMS pages when persistent cart is enabled. Previously, the system would unnecessarily load user-specific session and quote data during the generation of these pages, which affected performance.
- Custom address custom attributes are now saved as expected in the database. Previously, attribute values that were saved in the database were prepended with attribute code.
- Generation of cart rules filter text for product attributes has been improved. Individual products are no longer loaded multiple times.
- ÃÛ¶¹ÊÓƵ Commerce now displays an informative error message when an error occurs during checkout and no longer returns the shopper to an earlier checkout step. Previously, the shopper was returned to the shipping page.
- The
cart
query no longer returns shipping method and address for virtual carts. Previously, when a cart contained both physical and virtual products, and all physical products were removed, the cart query response continued to include shipping information.
- Commerce now displays informative messages when an add-to-cart action is triggered. Previously, the
The requested qty is not available
was not always displayed as needed on the storefront.
- Checkout page load times have been improved for customers with large address books. Commerce now processes only the number of customer addresses specified in the Customer Addresses Limit setting. Previously, Commerce loaded the entire address book.
- Product quantity can now be changed in the cart as expected for in-stock items when one item is out of stock. Previously, shoppers could not change product quantity of any items when one was out of stock.
- The
AdvancedSalesRule
product attribute filter now works correctly with the decimal attribute backend type. As a result, the cart rules withCoupon Type
set to No Coupon now work as expected.
- The full amount of a whole cart discount is now applied as expected to carts that contain both bundle and configurable products.
- Customer Section cookies now honor the cookie’s domain setting. Previously, the mini cart was not updating as expected in stores that contained subdomains, even though the session was shared.
- Shipping an order to multiple addresses no longer triggers an error during region ID processing.
- Fixed-discount amounts that are applied at the cart level are now correct.
- Coupons are now applied successfully to an order when a shopper applies the coupon after selecting the flat rate shipping method where a cart price rule with shipping method set as a condition applies. Previously, the cart page displayed the Coupon is Not valid error, and the coupon was not applied.
- The My billing and shipping address are the same checkbox now remains checked by default when a shopper uses Chrome autocomplete to fill in their shipping address and then clicks Next before the shipping methods block is reloaded.
- The
applied_rule_ids
value in thequote_item
table now includes a correct list of applied rule IDs. Previously, this value contained only the last applied rule ID.
- Mini-cart and customer data in local storage now resets when a session is removed from the server. Previously, this data still appeared when the session file was removed.
- Discrete carts are no longer mistakenly merged from the Admin when persistent cart is enabled.
- The default shipping address in the checkout shipping step is no longer populated with the previously selected pick-in-store address.
- Products in the cart are no longer excluded from related and upsell product lists after the cache is flushed.
- The cart tax and shipping estimator now accurately reflects the default destination configuration. Previously, when you configured default tax destination calculation settings and specified State/Region and ZIP, only the ZIP value was shown in the cart under Estimate Tax and Shipping. This resulted from ÃÛ¶¹ÊÓƵ Commerce setting the region ID to undefined before invoking the conditional statement that set the default region ID from the Admin.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws this error during checkout when persistent shopping cart is enabled:
Invalid state change requested
. Previously, when this error was thrown, multiple orders with the samequote_id
were occasionally created.
- The mini cart now displays bundle product prices that reflect cart tax configuration settings. Previously, the mini cart always included taxes in the prices of bundle products.
- The performance of customer segment rules that rely on active carts has been improved, which has reduced the time needed to add a product to the cart.
- The shipping estimate provided from the cart page is now accurate.
collectShippingRates
is now set only once. Previously, the shipping estimate was duplicated.
- The
cart
query no longer returns an error when a product in the specified cart is out of stock. Previously, shoppers using this query to make a purchase could not complete their purchase when an item was out of stock, and their checkout page was blank.
- Guest API requests to
POST V1/guest-carts/<cartId>/shipping-information
no longer return acancel
status if the page reloads during login in a mobile environment. Previously, ÃÛ¶¹ÊÓƵ Commerce threw a 500 error and logged this exception:TypeError: Argument 2 passed to Magento\CustomerCustomAttributes\Model\Plugin\ProcessCustomerShippingAddressCustomAttributes::beforeSaveAddressInformation() must be of the type string, null given
.
- Free shipping eligibility is now calculated as expected when the Subtotal (Excl. Tax) condition for cart rules is applied.
- The
cart
query now returns the correct tier pricing for a product.
- Informative error messages have been added to the checkout page to guide shoppers when the application of a coupon on the shipping page conflicts with the selected shipping method. Previously, a message told shoppers to return to the previous page.
- The authentication popup is now initialized only when it is needed instead of whenever guest checkout is enabled. It is now initialized when the guest shopper tries to proceed to checkout, and guest checkout is disabled.
Cart price rule
- The cart price rule product subselect condition now includes the
total (incl.tax)
option as expected.
- The
If an item is FOUND/NOT FOUND in the cart with ALL/ANY of these conditions true
catalog price rule condition now works correctly with category and SKU attributes. Previously, this condition was not correctly applied in cart price coupon logic, and invalid coupons were applied to orders.
- You can now successfully save a new cart price rule with the
Magento_OfflineShipping
extension disabled. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error:report.ERROR: Warning: Undefined array key "simple_free_shipping"
.
- Cart price rules are now applied as expected when a cart price rule related to one shipping method is configured for the store, and this shipping method is changed to another during check out. Previously, the
applied_rule_ids
value was never changed in thesales_order_item
table, and the cart price rule was not applied to the order.
Catalog
- Running
bin/magento cache:clean
orbin/magento cache:flush
no longer flushes the entire built-in or Varnish full-page cache unless specified.
- Merchants can now use the Product Carousel to create CMS blocks when
catalog_product_price dimensions-mode
is set towebsite
. Previously, Commerce did not save the block and threw this SLQ error:report.CRITICAL: PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table
.
- Commerce no longer displays duplicate images when the product color is changed on a product detail page.
- Optimized the algorithm for synchronizing website-specific values after adding a new store or changing an existing one in large, multi-store environments.
- The clean-up process for cached image files has been improved to avoid the creation of hidden directories in the
pub/media/catalog/product
folder. Previously, hidden directories led to disk space issues during clean-up operations. The operation could be terminated, which left behind temporary hidden directories that were never deleted.
- Bundle product prices are now calculated correctly, and an issue with the order of operations when calculating prices have been resolved.
- An unnecessary clause has been removed from
catalog_product_price
index queries, which has improved performance of this indexer on stores with large catalogs.
- Commerce no longer inserts product description text into the product detail page Meta Description field when this field has been left empty. Previously, when a product description contained HTML code that was generated by Page Builder or another HTML editor, the HTML was displayed in the Meta Description field, and you could not leave this field empty.
- Configurable product options on configurable product PDP pages are no longer affected by other configurable products options on the page. Previously, configurable products with drop-down attributes no longer trigger an exception when a product carousel is present on the product details page. Configurable product options were not selectable when other configurable products with swatch options were present on the page.
- Recently viewed product information is now displayed in accordance with store view configuration. Previously, the recently viewed product data was not updated per store view, including name and prefered language.
- Vimeo videos now play as expected on product pages in mobile view in Chromium-based web browsers.
- The
bin/magento catalog:images:resize
command now correctly generates product images for the products that are assigned to a custom website with a custom theme.
- Metadata with
NULL
orNOT NULL
values are now saved for the default store according to the Use Default Value checkbox as expected. Previously, metadata withNULL
value was not saved when this checkbox was unchecked.
- Merchants can now successfully delete an existing image from the product details page, then upload a new image with the same name. Previously under those circumstances, the storefront product page did not display the correct image.
- The
productDetail
query now returns the product name instead of null when the product imagealt
attribute is set as empty.
- Orders that include both downloadable and physical products now include working links to the downloadable product as soon as the order has been completed. Previously, links to downloadable products were not available until the physical products in the same order shipped.
- URL rewrites are now updated when a category is moved from one store/root category to another store/root category. Obsolete database entries are now removed when the sub-categories are transferred to new parent categories. The database now includes only relevant entries. Previously, the
url_path
was not updated with the proper store ID.
- The REST
V1/products/<sku>/media
endpoint can now process the simultaneous upload of multiple media images. Previously, while processing several requests simultaneously, inconsistent data was created, and Commerce threw an error when this data was saved into the database.
- Customer segment banners now behave as expected when a shopper that is using a newly created customer account logs out. Previously, banners created for the logged-in customer segment was displayed even after that account session ended (that is, the registered shopper logged out).
- Partial re-index performance for the Category Products and Product Categories indexers has been improved. Previously, the
indexer_update_all_views
cron job ran re-indexers multiple times per single product or category.
- When product stock status is automatically updated to out of stock based on stock configuration (quantity), stock status will be subsequently updated to in stock when the stock quantity is updated. Previously, the
stock_status_changed_auto
setting was ignored when a product’s stock configuration was updated to in stock.
- Toolbar sorting now works as expected on Search pages when the Remember Category Pagination setting is enabled.
- Multi-select attributes are now saved as expected when Use Default Value checkbox in the store-view scope is selected. Previously, this checkbox was unchecked when the product was edited and the default value was saved.
- Admin users with website-limited access can now add Images to a product that falls within their scope. If the admin user does not have access rights to the product, Commerce displays an informative message. Previously, admin users with website-limited access could not add images to products to which they had access.
- User-defined
special_from_date
,special_to_date
,news_from_date
, andnews_to_date
values are not overridden when a product is edited in store-view scope.
- Commerce now displays the correct name after sorting products by name in Admin > Category > Products in category in multistore deployments where product names vary by store.
- The
addProductsToCart
mutation now returns customizable options with data. Previously, it returned only empty customizable options.
- Product position and ID selection are now displayed correctly when an admin user adds a new product to a category after clearing the cache but not reloading the category page. Previously, product position and selection were mismatched and displayed incorrectly.
- Merchants can now update the future start date or time of a scheduled change for downloadable product. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error during update of the future start date or time for the downloadable product:
The downloadable link isn't related to the product. Verify the link and try again
.
- Product backordered status is now displayed correctly on the storefront. Previously, products that were available for shipment were incorrectly identified as backordered.
- Accessing downloadable products from the Admin no longer results in an error when the admin user changes the store view from the view used during product creation to another store view. Product prices are now successfully converted to float when an admin user switches store view from all store views to the default store view. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an error.
- Exported products now have the correct
manage_stock
value when theuse_config_manage_stock
value equals1
. Previously, this default value was incorrect.
- ÃÛ¶¹ÊÓƵ Commerce no longer displays a warning message when you save a product that was created with custom options after deleting its image.
- Product thumbnail images are now displayed as expected in the product stock alert email that is sent when a product is back in stock. Previously, this image was not displayed in the alert email
- The product count in the category tree (Admin Catalog > Category) is now accurate. Previously, the category products count could not be retrieved from the
catalog_category_product_index
table. The typo that triggered this bug has been fixed.
- The main product image on the product details page no longer visibly shifts downward during page load when
product_image_white_borders
in themeview.xml
is disabled. Previously, the product image visibly shifted downward during page load due to incorrect height settings in Fotorama JS.
- Customers are now notified about drops in product price when the customer is subscribed to price drop alerts. Previously, price-drop notifications were not always sent due to application-level caching.
- Server-side validation has been added to the process of creating product attributes through the web API. You cannot enable the Use in Layered Navigation Catalog field when the Catalog Input Type for Store Owner field value is
Text Field
,Text Area
,Text Editor
,Date
, orDate and Time
. Previously, products were omitted from categories and search results.
- The category page now re-loads with the correct pagination after a shopper opens the page, changes the pagination, navigates to a product page, and then returns to the category page.
- Out-of-stock simple products that are options for a configurable product are now displayed as disabled on the storefront when Display Out of Stock Products is set to Yes. Previously, all options were displayed as available, despite their status and real availability.
- Updating the website scope attribute in a specific store view no longer overrides the value of that attribute in global scope. Previously, importing product prices when multiple rows are available with the same SKU and
store_view_code
resulted in inaccurate prices for the default and All Store view scopes.
- Merchants can now add a GIF image to a product’s image gallery from the Admin. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error:
imagecolorsforindex(): Argument #2 ($color) is out of range
.
- Checks have been added to handle errors that result from undefined array keys. Previously, an error occurred during declarative schema whitelist generation.
- ÃÛ¶¹ÊÓƵ Commerce now returns a valid result for the custom date
01/01/1970
. Previously, the custom attribute returned this error:Invalid input datetime format of value '1/01/1970
.
routes
queries that use fragments now return category information as expected. Previously, an internal server error occurred on the category page.
- Issues with the
cataloginventory_stock
partial re-indexing process have been resolved, and indexer performance has improved. Previously, stock and product categories were not accurately updated.
- ÃÛ¶¹ÊÓƵ Commerce now generates a 301 redirect for a product when the category it belongs to has been moved to a new parent.
Catalog rules
- Catalog rules are now correctly indexed when enabled by schedule update. As a result, discounted prices are now correctly generated and indexed. Previously, when two catalog rules were available, and one rule is activated after the first rule before the first rule’s the catalog rule indexing operation has completed, the catalog rule discount prices were not generated for the second catalog rule.
- Catalog rules are now applied as expected in a multi-website environment.
Configurable products
- Merchants can now select Skip quantity at this time and Skip image uploading at this time when configuring a configurable product without affecting the source of associated simple products. Previously, selecting Skip quantity at this time resulted in the disappearance of product sources.
- The As low as label is no longer displayed for a configurable product price when all options have the same price.
- Admin users with website permissions can now save a child product that is part of a configurable product in a different store context. Re-indexing processes now skip this type of configurable product.
- Configurable products with two child products are no longer marked as out of stock when one child product is disabled by a scheduled update.
- The performance of save operations for configurable products with multiple options has improved. Previously, time outs could occur during product save operations.
- The storefront display of configurable product prices now change as expected when a shopper selects a product option.
Coupons
- Coupon codes with a limited number of uses per customer can now be used a second time when the order for which it was previously used fails. Previously, the promo code was not released when the prior order was canceled.
- Coupon codes that contain space characters are no longer invalidated. Previously, if a coupon code contained a space character (before or after the actual code), validation failed.
- Shoppers can now use two separate auto-generated coupon codes that have been generated by the same cart price rule. The
Uses per Coupon
field is now enabled when the coupon type selected toAuto
(similar for coupon type =Specific Coupon
) . This in turn enables the shopper to apply multiple coupon codes to the same cart price if the codes are different.
- A shopper’s single-use coupon value is now restored as expected when the order to which it was applied is canceled.
- The
GET V1/coupons/<couponId>
endpoint now returns the full expected response for manually created coupons just as it does for autogenerated coupons. Previously, some fields were omitted (for example,usage_limit
,usage_per_customer
, andcreated_at
).
cron
- The
aggregate_sales_report_bestsellers_data
cron job no longer creates very large temporary MySQL tables and now completes successfully. This cron job now inserts data per store, not for all stores at once. Previously, this cron job could result inNo space left on device
errors.
- The number of pending records in the
cron_schedule
table has been reduced by preventing cron jobs from trying to acquire unnecessary cron job locks. Previously, cron jobs tried to acquire locks when it was too late to run the job. Cron jobs incron_schedule
were not marked as missed even though they had already passed their scheduled time. Commerce also displayed this error repeatedly in the error log:report.WARNING: Could not acquire lock for cron job: indexer_update_all_views
.
- Fixed the divide-by-zero fatal error in cron expressions.
- The
sales_clean_quotes
cron process has been optimized to run faster by adding a composite index onstore_id
andupdated_at columns
in the quote table. This change improves cron job performance when processing many quotes.
- Admin users can now view which task the
bin/magento cron:run
process is currently performing. The title of the currently running process now lists the group and job names.
Customer
- ÃÛ¶¹ÊÓƵ Commerce now displays the Date of Birth, Tax/VAT Number, Gender, Telephone, Company, and Fax fields on the edit customer page based on configuration settings.
Customer segments
- Customer segment conditions now load all matched customers as expected. Previously, the customer segment matched customers list did not contain all matched customers.
EAV
- The EAV indexer no longer requires the deletion of the non-visible entities during batch processing. By default, the indexer no longer batches non-visible products, and indexer performance has improved.
- Emails that contain diacritics or accents (that is, utf8 email) are now supported for customers and companies as well as for order placing by guests and registered customers. Previously, Commerce did not save customer records that contained diacritics and displayed this error:
Something went wrong while saving the customer
.
- Email sender names can no longer include colon characters. A new validation rule now prevents the saving of sender names that contain colon characters from the Store Email Addresses section of Admin Stores > General. Previously, merchants could save a sender name that contained a colon character, which resulted in mail server errors.
- Image options are no longer displayed as HTML markup in the Returns customer emails (default template) for products with custom image options.
- Company Admin details are now saved as expected, and admins are correctly redirected, when Assign Company Admin emails contain a
CMS Block URL
variable.
- Customer email addresses can now include diacritics. Previously, front-end validation prohibited the creation of a user with diacritics in their email address.
- Stock and price alert emails are now translated according to the language configured for the website default store view. Previously, these emails were not translated.
POST V1/order/notify-orders-are-ready-for-pickup
now sends an email alerting customers that an order is ready for pickup only when the order is ready. Email is now triggered only when the request has been fulfilled without an exception.
Frameworks
- Improved debugging by adding the
UNCACHEABLE
value when outputting an HTTP header with Varnish is in use. Previously, onlyHIT
orMISS
values were outputted.
- Added code to support default Varnish compression handling.
- The
bin/magento varnish:vcl:generate
command now includes aninput-file argument
. This supports the addition of a custom VCL to a Git repository, relative to the Commerce root.
- Support for Varnish 4.x and 5.x has been removed from the codebase.
phpcodesniffer-composer-installer
incomposer.json
has been upgraded to v1.0.0.
- Characters that do not comply with have been removed from the codebase.
- Fixed an incorrect PHP doc tag in the
Magento\Reports\Block\Adminhtml\Shopcart\Product\Grid
class.
- Refactored code throughout the codebase that was created when coding practice dictated that any cache section that was included in the
app/etc/env.php
file would include a frontend section. This refactoring addresses potential problems when upgrading Commerce pre-2.4.4 deployments.
- Clarified the error message that is associated with
StockItemValidator.php
when a stock ID with a value of 0 is supplied during an API call.
- Added a default empty array to
$tagGenerators
inCompositeTagGenerator
to prevent errors during dependency injection compilation. Previously, running thebin/magento setup:upgrade
command when theMagento_DirectoryGraphQl
andMagento_StoreGraphQl
modules were disabled resulted in an error.
- The unused
AlgorithmProviderFactory
class has been removed as well as dependencies on this class in classes includingJweAlgorithmManagerFactory.php
,JweContentAlgorithmManagerFactory.php
, andJwsAlgorithmManagerFactory
.
- The
var/log/system.log
file no longer containsmain.INFO error
messages. The menu entry log has been moved from level INFO to DEBUG. Previously, thevar/log/system.log
file was flooded with messages like this:Add of item with id Magento_Theme::design_config was processed …
.
- Redis preloading no longer fails when
exec()
returns false. Verification has been added to the preloading process to preventarray_combine
from receivingfalse
as a second argument. As a result, preloading will continue to run whenexec()
returnsfalse
.
- Refactored the
Magento_CatalogWidget
module to replace$block
escaping functions with$escaper
escaping functions.
Swaziland
has been updated toEswatini
throughout the codebase.
- Added the new Nicaraguan currency (NIO) to the list of available currencies.
- Changed the name of the
reponseBody
variable toresponseBody
inapp/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewConditionHtml.php
.
- Resolved subtotal rounding errors that occurred in transactions for products for which decimal quantity has been enabled.
- The date filter for the Admin customer grid now works as expected according to the specified locale.
- The
bin/magento setup:upgrade
command no longer fails due to the$schemaPatch
variable data type. Previously, the string value was passed to theget_class
function, which caused the error.
- Critical database read failures when
synchronous_replication
is enabled for slave connections on ÃÛ¶¹ÊÓƵ Commerce Cloud no longer occur.
- The connection to the MySQL database is now restored if the connection times out during a transaction when you set
max_messages = 0
for consumer. Previously, the connection was terminated.
- The
magento/module-release-notification
core module has been marked as deprecated in the 2.4-develop code with this comment:Starting from Magento 2.4.7, Magento_ReleaseNotification module is deprecated in favor of another in-product messaging mechanism
.
- Proxy code generation now generates Proxy and Factory files as expected for deployments running in production mode.
- The Indian state of Ladakh is now listed as an option in the Admin address State dropdown menus.
- The event countdown ticker is now displayed as expected on the category page.
- The forbidden
@author
tag has been removed from the code base, including these modules:Magento_user-variable-wee
,Magento_Catalog
, andMagento_Customer
,Magento_Wishlist
,Magento_Review
Tax
, and throughout the framework. , , ,
- The JSON serializer in the
User
module has been replaced with a new, more accurate serializer (JsonHexTag
). Previously, Commerce sometimes crashed when trying to use data serialized by the regular serializer when it contained unescaped elements.
- Broken pipeline errors no longer occur while running a full reindex (
bin/magento indexer:reindex
). AMPQ connections are now closed before the process manager forks processes.
- The queue message validator now validates the the subtype of all array elements. Previously, Commerce threw an exception.
- The queue connection configuration per topic in
app/etc/env.php
now works correctly. Previously, the product alert queue does not generate correctly when a new message queue was created with a custom exchange. If the queue connection for a topic was configured inapp/etc/env.php
with a custom exchange, a new binding was created for all topics with that custom exchange. Merchants could not process product alerts.
- Temporal formats marked with a
/* mariadb-5.3 */
comment no longer cause errors duringbin/magento setup:install
when upgrading MariaDB server to version 10.5.1 or higher.
- The AwsS3 driver now works as expected as a replacement for the base default file storage implementation. Previously, data could be corrupted when this driver was configured for file storage.
bin/magento config:show
andset
commands that use$_ENV
variables now support the use of website and store codes that contain camelcase or uppercase characters.
- Added classes with
!important
as used in Tailwind 3 for CSS layout support.
- A missing
jQuery
dependency has been added to thetrim-input.js
file.
- Event-specific details are now passed as a second attribute (
context
) of thelog
method.
- Aspect ratio values have been added to catalog images and unnecessary scripts have been removed from the UI framework.
- Revised error messages triggered by invalid XML configuration to be more informative.
- Refactored deprecated code related to the creation of dynamic properties throughout the codebase.
- The performance of indexers for large stores with extremely active product databases has improved. Indexers now index the latest product information once for each index rather than multiple times. Previously, products disappeared from the website, and product data could be out of date on the website.
mview_state
record status now accurately indicates state based on changelog activity when a slave database connection is available. Previously, these records remained in awaiting
state in cloud deployments even when there were no new entries in the changelog.
- Added support for the
precision
option for currency format to preserve feature parity with the deprecatedZendCurrency
class.
- Cookie messages have been converted into observable attributes, and developers can now manipulate state, which can potentially trigger UI changes. Previously, cookies were read-only and could not be manipulated.
- Admin users can now generate an invoice when their Commerce instance is connected to S3 storage. Previously, Commerce displayed this error:
Cannot create image resource. File not found
.
- ÃÛ¶¹ÊÓƵ Commerce now logs an exception message as expected when VAT number validation by the VIES validation service fails.
- The
Administrators
name has been removed from the query used to fetch an administrators role during admin role creation.
- The
bin/magento setup:config:set
command no longer fails when an invalid database user name is included in theapp/etc/env.php
file.
- Sorting by column on reserved words in a default Admin UI component no longer results in an SQL error in
var/log/exception.log
.
- Added
AddDataForCostaRica.php
to provide state information for Costa Rica. .
- Improved error message for scenario where user tries to access an invalid URL from the Admin. .
Param $options[
position]
for currency symbols now works as expected and supports the customization of the currency symbol position. Previously, after migrating from Zend Framework 1, thetoCurrency
method ignored theposition
parameter. This issue occurred throughout the Admin interface.
- Refactored deprecated code related to creation of dynamic properties throughout the codebase.
- Custom style formats that were created by extending the TinyMCE editor in ÃÛ¶¹ÊÓƵ Commerce and Magento Open Source releases prior to 2.4.6 are now available as expected in the Page Builder
text
content type. Previously, the custom style format was ignored, and only the default formats loaded after upgrade to ÃÛ¶¹ÊÓƵ Commerce 2.4.6-p1.
- Added the following informative note to the
quote.php
file:Important: This method also copies customer data to quote and removes quote addresses
.
- Instantiation of the lock provider now goes through
\Magento\Framework\Lock\Proxy
class. The lock provider is now configured with thelock
setting through theapp/etc/env.php
file.
- Mutex has been implemented for orders to prevent race conditions during update by concurrent requests. Previously, concurrent requests (race conditions) for order cancellations caused duplicated entries in the
inventory_reservation
table.
- The
populateWithArray
function now transforms object properties to snake case correctly, making it compatible with theAbstractModel
getters and setters. Previously, the snake case formatting was incorrect when the data attribute name contained several uppercase letters in a row.
- The auto increment value in the
catalog_product_entity_varchar
table now increments correctly after a product is saved. Previously, this value increased by ten.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws this file system exception when you try to flush the JavaScript/CSS cache:
No such file or directory
.
- The value of
value_id
incustomer_entity_int
is now incremented correctly. An update query is executed instead ofinsert on duplicate key update
when updating an entity that incorporates these attributes. As a result, the auto-increment columns used within the EAV model now grow in a linear fashion. Previously, the auto-increment process for columns skipped values due to failed insert queries.
- Removed unnecessary white space from
id
attributes that do not require it. (This bug was introduced by an ÃÛ¶¹ÊÓƵ Commerce 2.4.6 code change.)
- Store codes no longer appear in the store URL when the store is in single-store mode.
- Minor updates have been made to
around
plugins.
- The swatches
Helper
has been refactored to remove misleading import aliases.
- Admin users can now delete or rename a
sitemap.xml
file as expected. Previously, an admin user could delete the file from the Admin, but it remained in the file system.
- Coupons are no longer flagged as used when payment fails for the order to which they have been applied. Queue messages are now processed in the order in which they are published when the consumer is started. Previously, the first message was pulled from the queue to simply check whether messages were queued, and was rejected afterward, which caused the first message to be processed last.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an exception in the log file when a user tries to print a shipping label. Previously, if an extension modifies response headers that contain an attachment, the system threw an exception in the log file.
- Support for more HTML classes has been added to
elements.xsd
.
General fixes
- Changed the name of the
reponseBody
variable toresponseBody
inapp/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/NewConditionHtml.php
.
- Scheduling product updates no longer clears multi-select attribute data. Previously, when an update was scheduled for a product, the product’s multi-select attribute data was erroneously cleared.
- Saving a product with a non-default store scope no longer results in unchanged attributes becoming store-scoped when loaded using
ProductRepository
.
- Shoppers can now access pages that are configured as hierarchy nodes when access restrictions are enabled. Previously, an infinite redirect loop occurred, and the browser threw this error:
ERR_TOO_MANY_REDIRECTS
.
- Informative error messages have been added to custom field validation on product detail pages.
- Special characters can now be used in name fields. Previously, the ampersand character (&) was restricted in the name validator, which blocked customer add or edit operations when the customer name contained an ampersand.
- Admin users with restricted access to a specific store can now use a mass update action to update product reviews. Previously, Commerce threw this exception:
report.CRITICAL: TypeError: array_intersect(): Argument #1 ($array) must be of type array, null given in app/code/Magento/AdminGws/Model/Models.php:439
.
- The storefront login page’s Show Password functionality now displays passwords as expected. Previously, passwords were not displayed.
- The product comparison list is now always website-specific for guest shoppers and does not contain products that were added from the other websites, including products that were assigned to both websites.
- CMS content blocks that contain emojis are no longer truncated after the emoji when saved to the database. Previously, content was truncated after the emoji because the default database configuration did not support four-byte characters.
- The related product rule’s Is one of condition now works correctly when configured with the Products to match setting. Previously, this rule did not identify any products.
- The CMS page grid now filters pages based on the store view that is assigned to the admin user. Previously, role scope was not applied.
- Passwords are now displayed as expected when the Show Password checkbox on the login page is active.
- The Reset Password Token system attribute of customer entity (
rp_token
) validation has been removed from attribute validation during customer account creation, and diacritics validation is included only in the resulting customer email. Previously, Commerce did not save the customer record and displayed this error:Something went wrong while saving the customer
.
- You can now successfully save edits to the Admin Pages and Block grid after deleting a column.
- Company admins can now add company users from the storefront. Previously, Commerce logged this error when admin user tried to add a new user:
report.CRITICAL: Error: Call to a member function __toArray() on null in app/code/Magento/LoginAsCustomerLogging/Observer/LogSaveCustomerObserver.php:123
.
- Customers can now log in successfully with a new password from one device after resetting their password on a different device.
- The Admin customer address State/Province field now retains the last saved value as expected. Previously, when you removed the value from this field, Commerce continued to display the deleted value in the State/Province field.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws a constraint violation error when you first deselect, then select a newly created CMS page.
- A hierarchy website root is now correctly assigned to a newly created CMS page… Previously, the hierarchy website root selection was mismatched on newly created CMS pages.
- Errors no longer occur during requests for an RSS feed for categories when RSS Feed Top Level Category is enabled. Previously, browsing the RSS feed category page resulted in Elasticsearch
CRITICAL
errors in log files when RSS Feed Top Level Category was enabled.
- The correct value is now saved for
gws_store_groups
when role scope is changed during user role creation. Previously, when role scope was selected asAll
, thegws_store_groups
value was saved as null during user creation but not during role editing. Also, if role scope was selected asCustom
, then thegws_store_groups
value was always saved as null.
- The reset password page can now be accessed by clicking the Admin reset password link on the Admin login page when the Add Store Code to Urls setting is enabled. The Admin reset password link previously opened the login page or 404 page.
- The date range in the Admin statistics dashboard is now calculated based on the time zone that is set in configuration settings, then converted to UTC in order to fetch data from the database.
- The CMS hierarchy filter works as expected after you filter a store view then click Save on Admin Content > Hierarchy. Previously, clicking Save refreshed the page, but the context was lost, and the selected store view was no longer displayed.
- Clicking the Send invitation button (Admin Marketing > Private sales > Invitation) now submits a POST request along with the form key and sends the invitation successfully. Previously, when you clicked this button, neither the HTTP POST method nor the form key were present.
- Zero-byte files can now be successfully copied to remote storage with AWS S3.
- Admin users can now add a new customer address from the Admin when that customer has been created for another website whose store ID does not match the website ID. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this pop-up message:
Something went wrong
.
- The CMS block editor page now displays the correct widget
block_id
value.
Gift cards and wrapping
- Merchants can no longer create a gift card with a negative value.
- The
setGiftOptionsOnCart
mutation now removes gift wrapping from an order as expected. The value ofgift_wrapping_id
is now unset at the cart level. Previously, thegift_wrapping_id
was updated to its previous value after the order was placed even when this value was unset at the cart level.
- Gift card accounts now remain active as expected when the partial refund of a simple product is processed from the order to which the card was applied. Previously, the gift card account was deleted.
- The
setGiftOptionsOnCart
mutation now successfully updates the database when removing a gift message from the cart. Previously, message details were not updated in the database, and the gift message was not removed from the cart.
- The gift registry
Event Information
label is now translated as expected.
- Subtotals are now calculated correctly for custom gift card amounts.
- Gift cards are now applied correctly during checkout with multiple addresses. Previously, gift card amounts were applied incorrectly for multi-address shipments, which resulted in invalid gift card amounts.
- Emulation now starts during
send()
calls once the emulation has completed during thegetInfoBlockHtml()
call, and no error are logged. Previously, thesystem.log
file was flooded with this error:main.ERROR: Environment emulation nesting is not allowed
.
- You can now use the
updateCartItems
mutation to update a gift card in a shopping cart. Previously, only the card amount could be updated in the cart by this mutation.
- Gift wrapping is now included as expected in a quote based on merged carts. Previously, gift messages were successfully merged, but not wrapping selections.
- The
addProductsToCart
mutation now successfully adds a gift card to a cart. Previously, this query expected the gift card recipient name, but the sender name was instead returned. ÃÛ¶¹ÊÓƵ Commerce threw this error:Please specify a recipient name
.
Google Tag Manager
- The Google Tag module now pushes the correct data to the data layer. Previously, page impressions data was not pushed to the data layer.
GraphQL
- The
getCustomerWishlist
query no longer results in an internal server error when querying lists that contain configurable products.
- The
customerCart
query now returns all applied discounts on bundle products as expected. Previously, the total discounts that were applied to a bundle product were returned as zero.
- The
getCustomerWishlist
query no longer results in an internal server error when querying lists that contain configurable products.
- The declaration of the
is_subscribed
flag, its resolver, cache, and associated tests have been moved from theCustomerGraphQl
module to theNewsletterGraphQl
module.
- The
addProductsToCart
mutation no longer reports unrelated errors inuser_errors
. Previously, errors related to the cart were included inuser_errors
along with the expected operation errors.
- The
products
query product filter can now return partial match results as well as full matches. The newmatch_type
(PARTIAL, FULL) attribute supports specifying match type. Previously, the query returned full matches only.
- Mutex has been added to the
addConfigurableProductsToCart
query to prevent race conditions during an update by concurrent requests. Previously, when a merchant sent two parallel requests to add the same configurable product to a cart, two separate items with the same product SKU were added.
- Product aggregation in GraphQL responses now includes non-zero values for attributes when Use in Layered Navigation is set to Filterable (no results). Previously, only non-zero values were returned.
- Improved the performance of the
setShippingAddressForEstimate
query for cart-related operations that involve custom product attributes. Previously, the query loaded all product attributes when parameters were sent as variables.
- The
products
queryConfigurableProduct.configurable_options
field now returns only values that have at least one enabled product. Previously, this field returned disabled simple products.
- Improved the performance of the
GetCategories query
by reducing the number of unnecessary SQL queries it generates.
- Address error handling for GraphQL library components now works as expected.
- The
products
query now returns all relevant storefront pricing details when dynamic pricing is set to no and discounts are applied. Previously, the price range for products was not returned.
- GraphQL transactions names now include top-level query names only in the New Relic logs. Previously, transaction names also included secondary query names.
- Address error handling for GraphQL library components now works as expected.
- When the Visibility setting for a product is set to
Catalog
,products
queries on that product now resolve the setting correctly. Previously, any filter provided was switched to theVisibility: Catalog
setting.
- The
customer
query now returns aproduct_sale_price
field that includes tax on orders when the product price has been configured to include tax.
- Product attributes of type
DateTime
now map to theFilterRangeTypeInput
filter in products queries. Previously, these attributes were mapped toFilterMatchTypeInput
. As a result of this change, queries filtering onDateTime
attributes requirefrom
andto
values instead of match values.
- The
customer
query now returns only customer reviews related to a specific store view as expected when filtered by store ID.
- The
categories
query no longer returns an error when theitems.redirect_code
response value contains a null value.
- Rule-based related products now load as expected in GraphQL responses after a full cache clean. Previously, the product EAV attributes that were responsible for rule-based matches were not loaded for the requested entity, although they were loaded after re-loading the storefront product page.
- The
changeCustomerPassword
mutation now triggers email as expected after successfully resetting a password.
urlResolver
androute
queries now return a result when theTarget Path
of URL rewrite is an absolute URL. Previously, theurlResolver
query returned NULL when you used it to retrieve redirect data.
- The
products
query now returns correct labels when multiple store views exist.
- The
categoryList
query now returns a populatedproduct
section of theoptions
block for bundle products’ child products as expected. Previously, no information about bundle product child products was returned.
- The
route
query now returns routes for categories and products as expected without an internal server error.
- The
products
query now fetchesurl_key
values when multiple categories are selected.
product
queries now return aggregations only for products that are assigned to the specified shared catalog. Previously, aggregation data for products not assigned to a shared catalog appeared in layered navigation.
- The
OptionValueProvider
classget()
method now returns an attribute option value based on the givenoption_id
as expected. Previously, it returned an error.
- The
products
query now returns all available aggregations (filters) and their correctly translated labels. Previously, price and category aggregation labels were not translated as expected.
- You can now use a fragment
ProductCard
when queryingrelated_products
,upsell_products
, andcrosssell_products
onProductInterface
.
- The
products
query now returns related, upsell, and cross-sell products in the order in which they were saved.
- GraphQL queries now return related products data sorted by position.
category_url_path
has been added toProductAttributeFilterInput
, which supports requesting all products for a category in a single query.
- Corrected an error in which the method that sets the current store in a GraphQL mutation executed before the method that handles validation.
Image
- The Admin favicon icon upload form now supports
.ico
file types.
Import/export
- The product import process now parses values with the correct separator. Previously, the import process used the pipe (“|â€) operator to parse multi-select values until the determined value separator was not equal to the default value. The import process subsequently failed.
- 301 redirects are now automatically created when
URL Key
values are updated by CSV import.
- Shipping table rates are now updated as expected in the table rate import CSV file. The table rate upload file is temporarily stored until the asynchronous configuration processor cron job runs. This cron job picks up the new location of the file and processes it accordingly. Previously, table rates were not updated as expected because the asynchronous processor looked for the file in the wrong location.
- The Export Files grid now shows all exported files regardless of timestamp. Previously, the grid did not display all exported files that had the same timestamp.
- Products with customizable options can now be imported successfully. Previously, options data was lost during import.
- Special characters in exported CSV files are now represented as expected in Excel.
- Importing stock sources and customer addresses using the Customers and Addresses (single file) option now completes successfully.
- Product import no longer fails due to lack of memory. Previously, importing any number of products to a database that already contains approximately ten million products failed due to lack of memory.
- Validation checks now halt the import process as expected when there is no valid data to import, and Commerce now displays this error:
There are no valid rows to import
. Previously, validation passed under these conditions, but the import process failed with this message:entity values are mixed
.
- Importing URL keys with the same product no longer overwrites or deletes existing default store view keys. URL rewrites are now regenerated for store views only when there is no overridden
url_key
value. Previously, importing URL rewrites with the same URL key overwrote the existing default store view URL key. (key_store
URL rewrites were deleted, but the URL rewrite on the Default store view level for the product was still set tokey_store
.)
- Product count no longer changes unexpectedly during import. Cache flush is now postponed until after the import process.
- The status of scheduled import actions now accurately represents the success or failure of the import operation. Previously, all actions were logged as successful.
- Commerce now takes into account the Disable Automatic Group Change Based on VAT ID setting during import of customer records. Previously, the
disable_auto_group_change
value in the import files was ignored.
Magento\Framework\Convert\Excel
now successfully handles numbers that are preceded by a space. The Excel XML now encodes fields as aString
. Previously, the Excel writer encoded these values asnumber
, which resulted in invalid files.
- Merchants can now specify the locale in which import data is presented and how data validators should parse this data. If a locale value is not specified, ÃÛ¶¹ÊÓƵ Commerce uses the default configuration locale (not the default store view) to parse the data. In the Admin, import and export processes continue to use the admin user interface locale to import, parse, and format data respectively.
- Importing products with
country_of_manufacture
attributes that were created by an admin user with a different locale setting than the admin user who is importing the products no longer throws a validation error. Previously, this import operation could result in a validation error on thecountry_of_manufacture
attribute.
- Stock source data is now imported successfully by the store import process, and Commerce now displays a complete notification message when the import process completes. Previously, the notification message was missing.
- Redundant indexer invalidation has been removed when indexers are in scheduled mode.
- Exported products now have the correct
manage_stock
value when theuse_config_manage_stock
value equals1
. Previously, this default value was incorrect.
- ÃÛ¶¹ÊÓƵ Commerce now displays an informative error message in the scheduled import grid when an image is not imported successfully during a scheduled import operation. Previously, no error message was displayed.
- The product import process is no longer interrupted when product images are missing. Previously, when a product image was missing during the import of a third-party service using a CSV file, ÃÛ¶¹ÊÓƵ Commerce displayed this error:
Maximum error count has been reached or a system error is occurred!
.
- The performance of customer export from the Customer grid has been improved in deployments where B2B is enabled.
- The product import process no longer throws a validation error when an attribute value in
configurable_variations
column contains a comma.
- Decoding has been excluded from the export process. The CSV export file text remain unchanged after import. As a result, the description does not change after re-import. Previously, HTML tags were removed in the Page Builder editor after product export and import.
- Non-default configurations (website or store scope) that are added as environment variables no longer interrupt the
app:config:import
process with a recursion error.
- Catalog search and price indexers in Update on Save mode are no longer invalidated after import. Previously, the Elasticsearch Indexer document version changed version when new and existing products were imported.
- Product reports are now exported to the
var
directory. Previously, these reports were exported to the document root directory, which is a read-only directory in cloud instances.
- Empty multi-select customer address fields no longer interrupt or halt the export process.
Index
- Improved performance of the
catalogrule_product
indexer when no catalog rule is set.
- Problems with price indexer performance have been resolved. Indexer performance no longer gradually degrades. The indexer has been refactored to increase indexer processing speed by changing how temporary tables are created. These temporary tables are now recreated instead of being addressed by more time-consuming DELETE statements.
- Price indexer performance has been improved. An index hint has been added to the price indexer that improves the run times of MySQL queries that are fired during indexing.
- All indexers now use the same colors to represent indexer state.
- The performance of the Catalog Rule Product indexer in deployments where rules are not assigned to all websites has been improved.
- Creating a custom product type when indexers are set to Update on schedule no longer causes the index update
cron
task to fail.
- Display issues on the storefront product details page that were due to catalog permissions indexing have been resolved. Previously, ÃÛ¶¹ÊÓƵ Commerce cleared the index table first and then re-indexed during a full
catalogpermissions_product
orcatalogpermissions_category
indexing process. Catalog permissions did not work as expected on the storefront until the re-indexing completed.
bin/magento indexer:reindex customer_grid
no longer fails with a MySQL error when the customer grid includes newly created custom customer attributes.
- Changing indexer mode for multiple indexers (that is, a mass action indexer mode change) now changes an indexer’s mode only when the current mode differs from the one being applied. This improves performance by preventing unnecessary trips to the database.
Infrastructure
- Added a missing
return
statement to the Admin usage enable controller. Previously, there was noreturn
statement, and the controller inFrontendController
class was handled incorrectly.
- Replaced MySQL
CREATE TEMPORARY TABLE ... LIKE
with refactoredCREATE TEMPORARY TABLE
for compliance with MySQL 8.x.
- ÃÛ¶¹ÊÓƵ Commerce no longer includes the full path to the root of the server in the error message it displays when a malformed HTTP request has been sent to the server. Only strings are now passed to the
explode
method as a second argument.
restricted_classes.php
has replacedZend_Validate_File_Upload
. Previously, the validator crashed during upload of an import file larger than the value configured inphp.ini
.
- Attribute options provided by the data source model and installed using the setup data patch (typically from third party modules) can now be used with customer segment rules. Previously, this combination did not return the list of customers that matched the configured segment.
- The email template engine can now correctly process certain nested directives (for example,
{{if}}{{depend}}...{{/depend}}{{/if}}
).
product
queries with aggregation data now return the correct label values for Boolean type product attributes.
- CSS files are no longer corrupted when merged when
var/tmp
andpub/static
are on different filesystems and CSS Merging Enabled is enabled. Temporary files have been created in the same static directory as the target file to ensure that both files are on the same filesystem. As a result, the call to rename it is atomic.
- Fixed a potential error when calling a member function
getId()
onint
, which occasionally triggered an exception when a customer was viewed in the Admin.
- Type checks are now enforced for array type in the design theme config processor.
Inventory management
- Products are now automatically returned to In-stock status after a credit memo that includes a return of product quantity. Previously, if a product was out of stock but a credit memo returned stock of this product, merchants had to manually change product stock status.
- Improved performance of the inventory indexer in async mode by removing redundant requests to re-index default source items.
- Corrected issues with the Inventory indexer that affected the accuracy of the storefront stock count of configurable products.
- Updating inventory source items via REST
V1/inventory/source-items
now works faster. The call no longer triggers a re-index or a clean-cache operation on unchanged inventory products.
- REST
V1/products/<sku>
now triggers an automated stock re-index when updating a product’s stock status. Previously, a stock re-index was not triggered for the product that was being updated.
- Configurable product stock status is now updated on the storefront as expected when child products are updated by
V1/inventory/source-items
.
- The
POST <store_code>/V1/inventory/source-items
REST call now validates payload for whitespace in returned inventory source items and sends an error message about validation as needed.
- Merchants can now notify shoppers that an order is ready for pickup when the No Manage Stock setting is enabled for a product. Previously, when this setting was enabled, Commerce displayed this error message:
Your order is not ready for pickup
.
- Merchants can now create a credit memo for orders from which a simple product that is associated with a configurable product has been deleted. Previously, merchants could not create the credit memo, and Commerce threw a
TypeError
exception.
- The Admin grid source count now returns valid records after a filter has been applied. Previously, the
getSourcesCount
method always returned the total number of sources after a filter was applied.
- The Category page no longer redirects to the Admin dashboard when you sort products using the “Move out of Stock to bottom†option. The issue has been resolved by putting the SQL join statement inside the conditional statement only after ensuring that it is already not included. Previously, the page redirected to the Admin dashboard with the message:
Invalid security or form key. Please refresh the page
.
AUTO_INCREMENT
of theinventory_source_item
table is no longer increased with everyUPDATE
operation. Previously, each update increased theAUTO_INCREMENT
of this table, which eventually caused theAUTO_INCREMENT
value to be out of range when adding a new record to theinventory_source_item table
. As a result, admin users received the following error when they tried to create a new product from the Admin:Numeric value out of range...
.
- Admin users can now add a product to a customer cart from the Admin for a particular store view scope with Inventory management. Previously, the stock ID was not determined properly, and admin users could not add the product to the customer cart.
- Synchronization between Inventory and catalog no longer relies on the Synchronize with Catalog configuration setting. Previously, products were properly synchronized only when this setting was enabled.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error after page reload when a shopper deducts a product quantity from an order that falls within the range of product available while selecting shipping source.
- Configurable product stock status is now properly updated when a configurable product and its child products
Stock Availability
value is updated by a mass inventory update. Previously, you could not return a configurable product and its child products back to into stock by mass update.
- The datatype for non-default sources has been updated to
DECIMAL (12, 4)
to support up to eight integer digits, which is the same limit implemented for default stock. This value is now in sync with the Admin add and edit product pages, which support input validation for up to eight digits for all types of inventory sources. Previously, the input for the Quantity field (for non-default sources) was supported up to six digits only.
- Both default and non-default sources now display the correct information for product salable quantity when a non-default source that was ordered from the storefront is processed for shipment. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed incorrect stock status for product sources.
\Magento\Catalog\Model\Product::getIsSalable()
now returns stock status based on the scope defined in the product object (\Magento\Catalog\Model\Product::getStoreId()
). Previously,getIsSalable()
returned stock status based on current scope regardless of the product object.
Logging
- Updated the date-time format in the System Reports feature to include records from log files in reports.
- Admin users can now see the logs for bulk actions that are created by integrations in the Bulk Actions Log section of the Admin.
Login
- Resetting a password in one browser and subsequently logging in through a different browser no longer results in an exception.
- Customers are now redirected to the login page after activating an account as expected. Previously, customers were automatically logged in.
Media Gallery
- Merchants can now upload images with the same name but different cases (a mix of upper and lower case characters) to the Media Gallery. Previously, image file names were case-insensitive in Page Builder, and files with the same names other than case were overwritten in Commerce media storage that were hosted on case-sensitive file systems.
Newsletter
- Commerce now checks whether the newsletter subscription functionality is enabled before accepting new subscribers to a newsletter.
Orders
- Products moved from the Admin shopping cart to the list of items to order are now deleted as expected from the shopping cart.
- Merchants can now create credit memos as expected for the partial return of orders that were paid for in part by reward points. Previously, when a merchant created a partial return, order status was incorrectly identified as closed, and the Admin order page did not display credit memo options.
- The Admin action log rotation now works as expected when rotation log archiving frequency is set to weekly or monthly intervals. Previously, when weekly or monthly intervals were set, logs were not rotated.
- Commerce now applies the correct discount amount to partially canceled orders. Previously, the discount amount as calculated in the
base_discount_cancelled
column was incorrectly calculated when an order was changed. Support for negative values has been added to invoices for discounted orders.
- The REST
V1/orders
endpoint now applies gift cards as expected when importing orders. Previously, changes to gift card extension attributes in this endpoint were not saved.
- Commerce now sorts custom customer address attributes based on the sort order that was provided when the admin user created the order in the Admin.
- The Admin Sales Order Grid page now loads as expected when a merchant initiates a search from this page. Previously, when a merchant tried to search orders from this table, the page froze, and Commerce displayed a
Request-URI Too Long
error in the browser console.
- Order status is now marked as closed rather than complete when the entire order amount has been refunded with store credit plus an additional payment method. Previously, order status was marked as complete because the refunded amount was incorrectly calculated.
- Improved the performance of the
OrderRepository::get()
method by reducing the number of times it loads an order from the database. Previously, this method loaded an order multiple times.
- Merchants can now generate credit memos for orders that contain some items with a zero total when other order items are available for refund. Previously, merchants could not perform multiple refunds when a customer had a 100% discount on some items in the order.
- Links between child and parent products are now displayed on the order page during re-order of the child product from the Admin.
- The header section of the order page now contains the expected information about the sent invoice, credit memo, and shipment.
- Credit memos for orders that contain only one configurable product are now generated correctly. Previously, the
isLast()
function did not returntrue
as expected.
- Improved performance of the
aggregate_sales_report_bestsellers_data
cron job by optimizing the main data query.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error when creating a credit memo with an offline refund to a customer balance when the admin user does not have permission to the customer’s website. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error:
More permissions are needed to view this item
, and the admin user could not create a store credit refund.
- Order status is now correct when a partial refund has been made for an order that contains bundle products. Previously, order status was listed as complete after a partial refund was issued, even though the remaining order was not complete.
- Shoppers can no longer order a product using a custom price when an order is first generated from the Admin using the one-off custom price. Previously, if an order contained an item with custom prices, this custom price was applied for other orders placed with the re-order functionality.
- Shoppers can no longer save incorrect order statuses on the order page. Order status is no longer changed from Complete to Processing when an item is shipped. Previously, ÃÛ¶¹ÊÓƵ Commerce did not check current order status before saving order status after a shopper entered a comment.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error on the storefront order return page when the configurable product being returned has been deleted. Previously, ÃÛ¶¹ÊÓƵ Commerce logged this error:
report.CRITICAL: Error: Call to a member function getShipmentType() on null in magento2ee/app/code/Magento/Rma/view/frontend/templates/return/create.phtml:52
.
- The sales order grid is now asynchronously synced with all orders as expected.
- The filter-by-purchase-date functionality in the customer orders section of the orders page now works as expected. Previously, a JavaScript error occurred when the timezone conversion logic threw an error when the same time zone was provided to the method.
- The ÃÛ¶¹ÊÓƵ Commerce dashboard now displays the correct orders statistics on first load. Previously, the dashboard displayed incorrect order information, but displayed the correct information once the time period was updated.
- Admin users are now redirected as expected to the order page after selecting a store view during new order creation from the Admin.
- The
GET V1/orders/<OrderID>
endpoint now returns information on both the configurable and simple products in the order regardless of the stock status of the simple products. Admin users can place orders now only if the selected items (products) are in stock or salable. Previously, this API returned information only about the products that were in stock.
- The credit memo page no longer crashes when free shipping is enabled when shipping price includes tax, and tax calculations are applied after discounts. Previously, ÃÛ¶¹ÊÓƵ Commerce threw a
Division by zero
exception.
- Using the
rest/V1/orders/{id}/comments
endpoint to post a comment about an order without providing order status no longer affects the display of the order. Previously, order status was logged as NULL in thesales_order
andsales_order_grid
tables, and neither the My Orders page or the Admin order grid displayed the order.
- Invoices, shipments, and credit memos can now be successfully moved back from the archive together with their associated orders when the IDs they include differ from order IDs. Previously, if an order were moved to the archive and then restored, then invoice, shipping, credit memo records were missing from that order if the ID numbers did not match.
Page Builder
- Images now maintain the correct aspect ratio when resized in Page Builder.
- Page Builder now displays error messages as needed when you try to upload an image larger than the specified maximum file size. Previously, Commerce displayed an alert popup message for uploaded image files that were smaller than the specified maximum.
- CMS page product sliders now include the parent products of any child products that have been selected for inclusion in the slider. Previously, parent products were excluded from the slider.
- HTML-converted content is now displayed in email templates as expected when the
Magento_AsyncConfig
module is disabled. Previously, email templates contained raw HTML only.
- The performance of Page Builder save operations in the Chrome browser has improved.
- You can now use the Page Builder option in Admin > Content > Pages to insert copied text in all styles using the
text
element. Previously, Page Builder displayed plain text only and did not save styles.
- CORS errors no longer appear during product content editing with Page Builder when the admin user has a specific ACL. The admin user can now save the product. Previously, Page Builder did not save the product, and the save process froze.
- Accurate file size information is now included in the image preview for uploaded images in Page Builder.
- Page Builder page elements now render at an acceptable speed in the Chrome browser (v112). Previously, saving content with Page Builder running in the Chrome browser was slow, and Commerce logged this error in the browser console:
[ERROR] Page Builder was rendering for 5 seconds without releasing locks
.
- Page Builder video element autoplay now works as expected on mobile Safari browsers on iOS when the element is linked directly to a remote video file. Previously, no preview image was displayed.
- Page Builder now works as expected in the Chrome browser. Previously, content changes made in that browser were not always saved.
- Loading an Admin product edit page a product no longer generates an intermittent
Uncaught TypeError
JavaScript error.
- Images that are uploaded through the Page Builder editor are now tagged as used on Content > Media Gallery. Previously, these images were marked as not used anywhere in the Media Gallery.
- Adding a product to a shopping cart from the Page Builder carousel no longer duplicates item quantity from pages with two different widgets displaying the same products.
- Page Builder no longer adds the
tabindex
HTML attribute to hyperlink tagsa
when you edit a hyperlink, then save a template.
- The products widget and Page Builder preview now handle HTML special characters properly. Previously, the product widget did not correctly display SKUs that contained the
&
character.
- Page Builder text element content is now updated as expected when you select and update the complete content block in preview mode.
- Copying and pasting text from one Page Builder text editor to another now works as expected. Previously, the page into which you tried to paste text could not saved, and ÃÛ¶¹ÊÓƵ Commerce displayed this console error:
[ERROR] Page Builder was rendering for 5 seconds without releasing locks.
.
- Page Builder
column-block
content type that was created in older versions of Page Builder is now displayed correctly.
- Filtering for the product metadata description during product creation from the Admin has been improved. Previously, if Page Builder were enabled, the product metadata description was generated based on the default
{{name}} {{description}}
mask. The default product meta description mask is now composed of{{name}}
.
- Adding a dynamic block with no content no longer triggers an error.
Payment
- Commerce now correctly handles 502 errors from PayPal by preventing order creation when this error occurs. Previously, orders were still be created despite a 502 error from PayPal, which lead to inconsistencies between Commerce records and PayPal’s.
- PayPal Express Checkout transactions now include child product SKUs and full product titles. The
Magento/Paypal/Model/Cart.php
file now collects child product SKUs with their parent product title to identify the product title with the child SKU.
- The Card Security Code Does Not Match configuration setting is now processed as expected during the Payflow Pro payment process. Previously, this evaluation process never completed, which blocked checkout.
- The Vault payment method option no longer appears in the Admin checkout workflow when the shopper does not have a vault token.
- The Venmo button now can be hidden when the PayPal buttons are enabled. Previously, the Venmo button could not be removed from the cart, mini cart, product detail, or the checkout pages.
- Shoppers can now select a shipping method while applying coupon code during checkout. Previously under these conditions, Commerce threw an error and assigned flat rate shipping to the order.
- Issues with the storefront processing of PayPal and PayPal credit payment methods have been resolved.
- Resolved issues with fallback URLs for orders paid with by Ideal payments when local payment is enabled.
- Shoppers can no longer create a PayPal order without adding a last name.
Braintree
- Braintree payment information is now saved per store, and shoppers now see only card information that has been saved in the store in which they are shopping. Previously, shoppers could see stored card information from all stores during checkout.
- Shoppers can now check out an order being shipped to multiple addresses using a Braintree payment method when vault for card payments is disabled.
- Partially invoiced orders are now captured as expected in the correct account in deployments where merchants have two different merchant account IDs for the same currency in their Braintree account.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error when creating a second partial invoice for an order paid for by Braintree when the Enable Vault for Card Payments is enabled. Previously, when a merchant tried to create a second invoice, ÃÛ¶¹ÊÓƵ Commerce threw this error:
Your payment could not be taken. Please try again or use a different payment method. Payment method token is invalid
.
- The Braintree Vault payment method option is no longer automatically deselected in the checkout workflow when a shopper updates their billing address. Previously, the payment method was deselected when the shopper deselected the My billing and shipping address are the same button.
- Resolved issues with checking out with PayPal through Braintree after upgrading from ÃÛ¶¹ÊÓƵ Commerce 2.4.5-p2.
- Phone numbers are now rendered as expected with addresses in the Google Pay modal popup shipping address fields. Previously, phone numbers were missing.
- Orders are now placed successfully with Braintree when the Braintree response includes an empty value for
threeDSecureInfo/eciFlag
. Previously, a PHP error occurred during checkout when this value was empty.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error when a shopper applies a coupon on the order review page when checking out with Google Pay from the mini cart. Previously, shoppers were redirected to a 404 page.
- Shoppers can now complete checkout using Braintree Payments and ÃÛ¶¹ÊÓƵ Commerce 2.4.6 with invisible ReCAPTCHA v2 or v3.
- Shoppers can no longer click the PayPal button to purchase a configurable product without first selecting required options. Previously, shoppers could click the PayPal button and were subsequently redirected back to the product page with an error:
- The PayPal button is now displayed as expected on the cart and mini cart pages. Previously, this button was not displayed on the cart page and duplicated on the mini cart page.
Performance
- Multiple clicks in the Sales > Orders page’s mass action drop-down menu no longer generate multiple POST requests.
- Only
200
or404
responses are cached when a shopper navigates to a page that triggers a 301 redirect unless the page’s Cache-Control header containsprivate
. Previously, an HTTP status 200 withprivate
in the Cache-Control header was cached, and an HTTP status 301 was cached unless it containedprivate
in its Cache-Control header.
- Removed the unused
Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper
fromMagento\Catalog\Model\ProductRepository
. Previously,ProductRepository
loaded this helper, which is anAdminhtml
controller.
- Improved performance of page loading speed when many options are added to bundled products.
- The process of assigning products to categories from the Products in Category tab has been optimized. The Assign and Remove buttons in the Add Product by SKU tab are now disabled until products are fully loaded in the grid. Previously, admin users could not add products by SKU in catalogs that contained millions of registered products.
- The performance of the
addProductToCart
mutation when executing with many custom product attributes has improved. Previously, when this mutation was executed with many product attributes ( approximately 1000), Commerce tried to load all product attributes.
- Performance issues when loading product attributes that are used by cart rules have been resolved. Only product attributes for active cart rules are now loaded.
- The
bin/magento setup:perf:generate-fixtures setup/performance-toolkit/profiles/ee/small.xml
command now executes successfully when run multiple times. Previously, it threw this error when run more than once:Coupon with the same code already exists
.
Promotion
- The effects of the Fixed amount discount for whole cart price rule, when applied with the Apply to shipping amount rule, is now proportionally distributed as expected between products and shipping amounts. Previously, discount calculations were incorrect.
- The Discard Subsequent Rules setting is now applied as expected. When this setting is enabled, other rules with low priority can be applied to a different product only.
reCAPTCHA
- Invisible reCAPTCHA v3 now works as expected for the checkout page Sign in button. Previously, shoppers could not login, and Commerce threw JavaScript errors.
- The Google reCAPTCHA in the checkout workflow now works as expected for checks, money orders, and custom payment methods.
- ÃÛ¶¹ÊÓƵ Commerce forms can no longer be submitted before the Google ReCAPTCHA checkbox loads.
- The reCAPTCHA widget now precedes the Place Order button on the payment page. Previously, the widget was displayed at the top of the page.
Reports
- The Orders report (REPORTS > Sales > Orders) now includes correct order values when orders are generated by stores that use non-default currencies. Previously, this report included incorrect values.
- Misleading information in the sales order report form has been revised for clarity.
- Admin users can now search for records with emails that contain
+
(plus) signs from the Abandoned Carts Report page.
- GraphQL transactions names are now displayed properly after New Relic is disabled from the Commerce Admin.
Reviews
- Shoppers can no longer quickly submit duplicate product reviews when Invisible reCAPTCHA v3 is enabled.
Rewards
- Reward points expiration emails are no longer sent after the points have expired. The
magento_reward_balance_warning_notification
andmagento_reward_expire_points
cron tasks have been refactored to increase flexibility and email sending capacity. Previously, merchants could not send many emails that are generated by these cron tasks in a short period of time. This could have caused delays in delivering time-sensitive notifications.
- Expired reward points are now subtracted from a shopper’s current reward points balance as expected.
- The reward points balance update email notification now takes into account the current store context. Previously, the reward points balance update email used configuration settings for the default store.
- Reward points can now be refunded after the creation of a credit memo. Previously, merchants could not refund rewards points after creating a credit memo, and order status remained
Completed
, notClosed
.
RMA
- The REST
POST /V1/returns
request now creates one RMA per product. Previously, this request could bypass validation and return multiple RMAs per product.
- RMA attributes are now automatically added to the default EAV form when the Show on Storefront RMA attribute is set to no. Previously, the RMA item details popup was blank when a custom return attribute was created and the Show on Storefront RMA attribute was set to no.
- The value of the Enable RMA attribute now matches the value that is specified in configuration when the Use Config checkbox on the product edit page is enabled.
- The Enable RMA attribute at the individual product level now respects the store RMA settings configuration. Previously, this setting was toggled off by default when you added a product, no matter what the store configuration settings were.
Search search-heading
- The auto-complete search suggestions on the header’s mini search frontend now work as expected. Previously, auto-complete did not populate this field when this feature was enabled.
- The performance of queries made from the Admin search bar has been improved by the addition of an indexer. Previously, the larger the
search_query
table, the longer the query took to complete.
- Alphabetical sorting of products by name now works correctly for names that contain Turkish characters.
- The Use in Search Results Layered Navigation product attribute property is now displayed only when Use in Search setting is set to Yes.
- The advanced search price and SKU filters now work correctly when applied together in an advanced search.
- Searches are no longer performed for empty search fields. This reduces the size of the
search_query
table. Previously, incorrect queries or querying on empty search fields returned a huge data set, which increased the size of thesearch_query
table and resulted in problems with/tmp
.
- Storefront filters now work as expected when sorting catalog entries with dropdown custom attributes.
- Search results now display relevant results based on search weight of the attributes as expected.
- Informative text under the
Search Weight
²¹³Ù³Ù°ù¾±²ú³Ü³Ù±ð’sStorefront Properties
input field on Admin Stores > Attributes > Product now describes possible values.
Shipping
- Cart price rules now work as expected when a bundle product is added to the cart when dynamic price attributes are disabled. Free shipping and the correct table rate are applied whether the dynamic attribute is enabled or disabled. Previously, free shipping was not applied as expected.
- Commerce now transitions to a new shipment page as expected after creating a partial shipment for an order. Previously, after creating a partial shipment, Commerce did not create a complete shipment page for the remaining products of the order.
- The total amount for shipping an order to multiple addresses is now correctly calculated. Previously, when a quote contained more than one shipping address, the total collector updated the shipping amount for the address given in
$quote->getShippingAddress()
instead of passing it by$shippingAssignment
as expected.
- Commerce no longer throws an exception during checkout with multiple shipping addresses when the admin user has used the login as customer feature.
- Products are now listed correctly on the Create Packages page Products grid when you add products to a package after the shipping label has been created.
- The
cart
query now returns discrete shipping discounts as separate shipping discounts with unique discount labels. The newapplied_to
discount property supports differentiation between discounts applied to a cart item. Previously, all shipping discounts were combined into one hardcoded Shipping Discount value.
- When an admin user creates a re-order, the billing and shipping addresses from the initial order automatically populate the relevant fields when the admin user clicks the Reorder button (Admin Sales > Orders > View ). If the same addresses are saved in the shopper’s address book, the re-order will always incorporates an updated version of these addresses. Previously, the shipping address field was pre-populated with the updated data, but the billing address field was not.
- The Shipping Policy text box is now visible in the Admin Store View scope when Apply custom Shipping Policy is enabled and a custom shipping policy is available.
- The
cart
query now returns aselected_shipping_method
value that matches one of theavailable_shipping_methods
carrier and method codes. Previously, when one of the selected shipping methods contained an underscore, these carrier/method codes were mismatched.
- The
setShippingAddressesOnCart
mutation no longer throws an error when the second value in the street array is null. Previously, this exception was thrown:The address failed to save. Verify the address and try again
.
Sitemap
- The XML sitemap now works as expected in a multistory deployment. Previously, the sitemaps did not contain the assigned default pages for each store.
- Merchants can now create and save a product when website
id != 1
and single-store mode is enabled. Previously, the save action failed with this message:SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
.
Staging
- Staging updates for sales rules are no longer duplicated in the staging dashboard.
- Bundle products are now updated properly if a shopper adds them to their cart when a schedule update is in process. Previously, if a bundle product with options was added to the cart when a schedule task was in process, Commerce threw this exception:
Some of the products below do not have all the required options. Please select all required options
.
- Schedule updates now maintain the correct prices for bundle options. Previously, these prices were changed to zero for specific website or store views.
- Updating a scheduled update no longer removes the previous version of the staged item if no end date is specified. Previously, when a staged item was updated, the rollbacked version of the item was removed if no end date was specified. Commerce did not throw an error or warn admin users before deletion.
- Store view labels values are no longer erased after a scheduled update for cart price rules. Previously, these labels were erased even if they were not specified in the update.
- Content staging previews now work properly for linked pages. Previously, you could not navigate to linked pages in the staging preview, but were instead directed incorrectly to storefront pages.
- Сhanging a staging update no longer results in the removal of scheduled updates that are assigned a later date.
- JavaScript errors no longer occur when you add or edit scheduled updates for categories when Google Analytics Content Experiments is enabled.
- Merchants can now successfully save an existing schedule update for a category after viewing or editing it. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an error in
system.log
.
- Downloadable links are now preserved as expected when a scheduled update is applied while previously added products are in the cart. Previously, downloadable links disappeared from the the customer’s My Account (My Downloadable Products) page and the Admin order view page.
- Products are now visible on the storefront as expected after a staging update that enables the product is applied. Previously, the product was enabled in the Admin but was not visible in the storefront category when the indexer mode of the catalog inventory was set to Update on Schedule. A full re-index fixed the issue.
- The
staging.synchronize_entity_period
consumer queue in themagento_bulk
table no longer increases when there are no staging updates to process. Previously, whencron
was configured to run every minute, a new record related to thestaging.synchronize_entity_period
consumer was added to this table every minute.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an SQL error when you create a schedule change for a product while saving another product. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error:
The product with the SKU "%1" couldn't be added to the current update
.
Target rules
- Target rules now work correctly with different store views. Previously, issues with the related products rule cache prevented the display of recommended products in multi-store deployments.
Tax
- Invoices now display the correct subtotal when taxes are configured and FPT is enabled.
- Commerce now displays the correct value for the Regular Price value when a custom option is selected for a product that has a Special Price value when Price Display Settings is set to include tax.
- Tax is now included as expected in the checkout workflow shipping price as specified by configuration settings.
- The
cart
queryapplied_taxes
response value now includes all individual tax rules as expected. Previously, it returned the total tax value when multiple tax rules were configured.
- The collapse/expand icon for the Additional Settings section during tax rule creation now works as expected. Previously, only the expand icon worked.
- You can now edit the value of Tax Rate Country and Region from the Tax Rule edit page as expected. Previously, edits made from that page were not saved.
- The tax amount in the cart estimation area is now refreshed as expected when the shipping method is updated. Previously, the tax rate was not updated after a shopper changed country during check out.
- The
tax class
value for newly created simple products is now set to the parent product’s value when creating new variations of an existing configurable product in Store View scope. Previously, this value was set to none. As a result, no tax was added to these products in the cart, and customers were undercharged tax.
Test
- Improved the
AdminCreateOrderWithVirtualProductFromDefaultSourceWithBackorders
test to eliminate failures caused by premature completion of the email field.
StorefrontVerifyProductAfterPartialReindexOnSeveralWebsitesTest
has been refactored to improve reliability.
- Fixed the
AdminSimpleProductwithTextandVisualSwatch
test by introducing an extra step that explicitly set the attributes to be used in the search.
- Corrected typo in the
SortbyTest
unit test.
- Removed references to non-existent classes in unit tests.
- Improved the
AdminCreateOrderWithVirtualProductFromDefaultSourceWithBackorders
test to eliminate failures caused by premature completion of the email field.
- Refactored
Magento\GraphQl\Catalog\ProductSearchTest::testFilterProductsBySingleCategoryId
test to handle random category order inproducts
query responses.
- Performance issues with large arrays in
TableNameSniff
have been resolved.
- Integration tests for the edit gift registry functionality no longer rely on existing entity IDs. All required data is now obtained through fixtures. Previously,
\Magento\GiftRegistry\Controller\Index\EditPostTest
failed.
CollectionTest::testGetDateRangeFirstPart()
now accounts for Daylight Savings time.
- Fixed deprecation notice for
StorefrontDeleteItemFromRequisitionListPrintView
.
UI framework
- The image uploader now works as expected in dynamic rows. Images are now uploaded correctly when sent as a multinational array.
- File upload styles are no longer duplicated in the Luma theme.
- Street fields on the street field customer account edit address form are now saved correctly. These fields are now sorted correctly by the given keys in the form.
- Corrected cursor behavior in the gift registry Message text field.
- Cumulative Layout Shift (CLS) values have improved for product detail pages. (This metric quantifies the visual stability of page layouts.)
- Improved the messaging of errors that occur during template rendering. Commerce now displays an informative message. Previously, Commerce displayed HTML leaks when a PHP error occurred.
- Custom customer attributes (type
File attached
) now work correctly with images that have been deleted, then subsequently uploaded. Previously, custom attributes uploaded, then deleted, then uploaded again could not be saved from the storefront.
- Corrected a syntax error in the calendar template file.
- Admin users can now change the storefront logo when single store mode is enabled. Previously, Commerce displayed the default fallback logo.
- Mixins configuration values are no longer empty, and jQuery mixins now work regardless of loading position. Previously, jQuery mixins were not loaded consistently across browsers.
- Passwords are now displayed as expected when the Show Password checkbox on the login page is active.
- ÃÛ¶¹ÊÓƵ Commerce now displays correct prices for fixed bundle products with special prices.
- Updated the link to the GitHub Issues listing page in the storefront footer template file.
- The Recently Viewed widget now displays the correct amount of tax in grouped product prices.
- Admin users was can now drag and drop the customizable options created for the simple product as expected.
- The order of product Dropdown attribute types now matches the order of images on the configurable product page.
- System messages now load more quickly. Only the messages being displayed are loaded. Previously, all messages were loaded from the database, which was time-consuming.
- Removing the breadcrumbs node by setting
remove=true
through the layout XML no longer results in removal of the page title on the category page. Previously, removing breadcrumbs this way removed the page title from the category page.
- The customer registration form now loads as expected when it includes multi-select customer attributes. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this exception:
[2023-03-05T05:57:40.032602+00:00] report.CRITICAL: Exception: Deprecated Functionality: explode(): Passing null to parameter #2 ($string) of type string is deprecated in /magento2ee/app/code/Magento/CustomAttributeManagement/Block/Form/Renderer/Multiselect.php on line 53 in /lib/internal/Magento/Framework/App/ErrorHandler.php:62
.
- Welcome messages containing single quotation marks are now rendered correctly on the storefront with no console errors. Previously, if a welcome message contained a single quotation mark, then the welcome message was not loaded during storefront rendering. ÃÛ¶¹ÊÓƵ Commerce also displayed console errors.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error when you try to quickly change the view between comment history and Returns in the Admin order page. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this generic error:
A technical problem with the server created an error
.
- Admin users with privileges restricted to one website can now update website-specific product attributes set to an
all stores view
scope.
- The magnifier widget now loads as expected on the product page.
- Multi-line customizable options are now rendered properly in invoice, shipment, and credit memo PDF documents. Previously, multi-line text was preceded by an unexpected page break, and if the text exceeded the page, text was truncated.
- Admin users can now add a new customer address from the Admin when that customer has been created for another website whose store ID does not match the website ID. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this pop-up message:
Something went wrong
.
- Company Admin details are now saved as expected, and admins are correctly redirected, when Assign Company Admin emails contain a
CMS Block URL
variable.
- Error messages associated with submitting comments on the order details page are now more informative. Previously, when a shopper clicked Submit comment without either changing order status or entering text into the comment area, ÃÛ¶¹ÊÓƵ Commerce displayed this message:
The comment is missing. Enter and try again
.
- The calendar icon is now displayed as expected in the date range fields on Admin Marketing > Cart Price Rules after a date is selected for one field. Previously, after you selected a date for one field, the calendar icon was no longer displayed on other fields, and ÃÛ¶¹ÊÓƵ Commerce displayed placeholder text.
- Customer registration forms that include multi-select fields now load successfully. Previously, this form did not load when it contained multi-select fields, and the following error was triggered:
report.CRITICAL: Exception: Deprecated Functionality: explode(): Passing null to parameter #2 ($string) of type string is deprecated in /magento2ee/app/code/Magento/CustomAttributeManagement/Block/Form/Renderer/Multiselect.php on line 53 in /lib/internal/Magento/Framework/App/ErrorHandler.php:62
.
- Clicking a video thumbnail in the product gallery full screen mode now displays the video as expected. Previously, the video was not displayed, and the browser console displayed a JavaScript error.
- Added a variable to the copyright line that is automatically updated each year.
- The image slider on the product page now works as expected in mobile view. Previously, only the first image was successfully displayed.
URL rewrites
- The
crossorigin
attribute has been added tolinkTypes
forHEAD
elements.
- URL rewrites are now generated based on store-level visibility configuration in multi-store deployments. Previously, URL rewrites were not generated for non-default stores when product visibility was set to not visible under the default store scope.
Category::getUrl()
no longer fetches a 301 redirect.
- Commerce no longer generates product URL rewrites for root categories and for products that are set to Not Visible Individually in multi-store setups when generating missing URL rewrites for custom stores.
- Canonical URL tags now reflect changes as expected after the category URL Key property has been updated. Previously, the obsolete category URL was used, which immediately triggered the redirection to the new URL.
- Category product URL rewrites are now generated as expected for all store views when a product is added to a category.
- Commerce no longer throws an error when you try to create a 301/302 redirect for a product URL when Generate category/product URL Rewrites is enabled. When a product is created and assigned to a category, automated URL rewrites are created: one for the direct URL and one for the product through the category path. When a new product URL rewrite is created, correlations among product, category, and store are checked. This check is now based on correlated entity properties (category and product). Previously, this check was performed on pre-existing URL rewrites.
- Category URL rewrites are now generated for all store views when a new category is imported from a CSV file.
- Product URL suffix and Category URL suffix configurations now match the suffixes in the
url_rewrite
table. Previously, race conditions when updating URL suffix configurations occurred, and the configured URL suffixes and theurl_rewrite
table did not match.
- ÃÛ¶¹ÊÓƵ Commerce now renders the category tree at all levels when creating category URL rewrites. Previously, only the first three levels of categories were displayed.
- Newly created CMS pages with one child node are now included in the marketing filter grid (Marketing > URL rewrites). Previously, URL rewrites were not created for those CMS pages.
- Category URL rewrites are now present in the CSV file during import of a new category.
- Multi-store CMS pages without URL rewrites are now forwarded as expected. Previously, requested multi-store CMS pages without URL rewrites were redirected to the store home page, but the original CMS pages were not directed.
Visual Merchandiser
- You can now use the
Categories
attribute for Visual Merchandiser rules. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this exception:Something went wrong while saving the category
.
Web API framework
- Commerce no longer displays an
Integration not secure
warning in Admin System > Extensions > Integrations when the Callback URL and Identity link URL fields are empty.
- Added the
taxes
,itemized_taxes
, andadditional_itemized_taxes
extension attributes toMagento\Sales\Api\Data\OrderInterface
. These attributes allow you to save applied taxes with Order REST calls.
- The Tier Prices REST API now supports decimal quantities. Previously, this API did not allow decimal quantities even when the Use Decimal Quantity setting was enabled.
- The REST
V1/orders/{id}/comments
endpoint no longer changes the status of an order when trying to add a comment to a pending order’s status. It now gives an informative error. Previously, this endpoint changed the order status when adding a comment.
- The REST API
GET
andPOST V1/products/attributes
endpoint no longer returns the same value for theis_filterable
attribute for bothFilterable(with results)
andFilterable(no results)
options of the Use in Layered Navigation option. Previously, this endpoint returned the same value because theis_filterable
attribute property was of typeBoolean
, which did not permit setting this property toFilterable(no results)
.
- The missing
media_gallery_entries
field has been added to the RESTV1/configurable-products/sku/children
endpoint. Previously, this function was missing the code needed to store and displaymedia_gallery_entries
.
- The REST
V1/carts/mine/estimate-shipping-methods
method now validates all levels of payload field data and returns a 400 HTTP code for invalid data. Previously, only the first level of API payload was validated, and if invalid data was returned in non-validated levels of the payload, Commerce returned a 500 status code.
- Asynchronous bulk REST API operations to update products with tier prices and different attribute sets now complete successfully. Previously, products with different attribute sets could not be updated this way, and Commerce displayed this error:
The product was unable to be saved. Please try again
.
- The
POST /V1/products/tier-prices
endpoint now returns a more informative error message when an invalid customer group name is used during tier price creation. Previously, ÃÛ¶¹ÊÓƵ Commerce returned an error like this:Notice: Undefined index: XXXXX in ~/public_html/vendor/magento/module-catalog/Model/Product/Price/Validation/TierPriceValidator.php on line 474"
.
- You can now execute an authorized asynchronous bulk API request to create customers with a non-default group ID. Previously, these requests reset the group ID to the default value.
- Customers created using the Bulk API now receive customer registration emails in the language that is configured in their assigned website. Previously, all emails were sent to the default locale, not the locale of the website to which the customer is assigned.
- The
POST V1/guest-carts
call no longer submits guest orders when Allow Guest Checkout is disabled.
- You can now open an order from the Admin with the status
Received
whenAsyncOrder
is not enabled. Previously, you could not open the order detail page from the Admin when the order status was changed byPOST V1/orders
.
- ÃÛ¶¹ÊÓƵ Commerce now successfully returns the
content
attribute (base64 image code) inGET V1/products/sku/media
product media API responses. Thecontent
attribute did not previously appear in the response.
Wish list
- Commerce now displays a message indicating that an item has already been added to a wishlist when a shopper tries to add the same item to a wishlist multiple times. Previously under these conditions, Commerce increased the product quantity in the wishlist.
- ÃÛ¶¹ÊÓƵ Commerce now successfully adds products with required uploaded customizable option files to the wishlist. Previously, Commerce added two products to the wishlist, not one.
System requirements
Our technology stack is built on PHP and MySQL. For more information, see System Requirements.
Installation and upgrade instructions
You can install ÃÛ¶¹ÊÓƵ Commerce 2.4.7 using Composer.