ÃÛ¶¹ÊÓƵ Commerce 2.4.4 release notes
ÃÛ¶¹ÊÓƵ Commerce 2.4.4 introduces support for PHP 8.1. All project libraries and dependencies have been updated for compatibility with PHP 8.1. Core Composer dependencies and third-party libraries have also been upgraded to the latest versions that are compatible with PHP 8.1. This release also provides support for OpenSearch 1.2.
This release includes almost 250 quality fixes and enhancements.
Apply AC-3022.patch
to continue offering DHL as a shipping carrier
DHL has introduced schema version 6.2 and will deprecate schema version 6.0 in the near future. ÃÛ¶¹ÊÓƵ Commerce 2.4.4 and earlier versions that support the DHL integration support only version 6.0. Merchants deploying these releases should apply AC-3022.patch
at their earliest convenience to continue offering DHL as a shipping carrier. See the Knowledge Base article for information about downloading and installing the patch.
Other release information
Although code for these features is bundled with quarterly releases of the ÃÛ¶¹ÊÓƵ Commerce core code, several of these projects (for example, B2B, Page Builder, 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.
composer.json
file before the plugins will be executed. Currently, plugins that are included in the composer.json
file but not marked as trusted are automatically installed. However, as of July 2022, Composer will not load plugins unless they have been explicitly allowed. See the Knowledge Base article for instructions on how to modify the composer.json
file to explicitly allow plugin loading.Hotfixes included in this release
ÃÛ¶¹ÊÓƵ Commerce 2.4.4 includes resolution of all issues that were addressed by the following hotfixes, which were provided for ÃÛ¶¹ÊÓƵ Commerce and Magento Open Source 2.4.3, 2.4.3-p1, and 2.3.7-p2:
-
The vulnerability addressed by
MDVA-43395_EE_2.4.3-p1_COMPOSER_v1.patch
andMDVA-43443_EE_2.4.3-p1_COMPOSER_v1.patch
has been resolved in this release. -
AC-384_Fix_Incompatible_PHP_Method__2.4.3_ce.patch
. This patch addresses a fatal PHP error that occurred during upgrade. See the Knowledge Base article.
Apply this hotfix after you install 2.4.4
We recommend that you apply the following patch after you install ÃÛ¶¹ÊÓƵ Commerce 2.4.4:
braintree-disabled-partial-capture-for-applepay-googlepay.patch
. Merchants cannot submit partial refunds for orders paid with Apple Pay through Braintree. When a merchant tries to create a credit memo for a partial refund from the order invoice, the Qty to Refund field is not editable. This hotfix addresses that issue. See the Knowledge Base article.
ÃÛ¶¹ÊÓƵ Commerce 2.4.4 highlights
Look for the following highlights in this release.
Security enhancements
This release includes one security fix and platform security improvements. This security fix has been backported to ÃÛ¶¹ÊÓƵ Commerce 2.4.3-p2 and ÃÛ¶¹ÊÓƵ Commerce 2.3.7-p3.
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
See for the latest discussion of these fixed issues.
Additional security enhancements
Security improvements for this release improve compliance with the latest security best practices, including:
-
Email variable usage was deprecated back in 2.3.4 as part of a security risk mitigation in favor of a more strict variable syntax. This legacy behavior has been fully removed in this release as a continuation of that security risk mitigation.
As a result, email or newsletter templates that worked in previous versions of ÃÛ¶¹ÊÓƵ Commerce may not work correctly after upgrading to ÃÛ¶¹ÊÓƵ Commerce 2.4.4 or Magento Open Source 2.4.4. Affected templates include admin overrides, themes, child themes, and templates from custom modules or third-party extensions. Your deployment may still be affected even after using the Upgrade compatibility tool to fix deprecated usages. See for information about potential effects and guidelines for migrating affected templates.
-
Integration tokens can no longer be used for API Bearer token authentication. Previously, an integration token could be used as a standalone key for token-based authentication. However, this behavior has been disabled by default due to the security implications of a never-expiring access token. The previous behavior can be enabled through the command line or Admin. See .
-
Session IDs are no longer stored in the database.
-
OAuth access tokens and password reset tokens are now encrypted when stored in the database.
-
Validation has been strengthened to prevent the upload of non alpha-numeric file extensions.
-
Added reCAPTCHA support to coupon codes.
-
Swagger is now disabled by default when ÃÛ¶¹ÊÓƵ Commerce is in production mode.
-
HTTPS is now enabled by default for the ÃÛ¶¹ÊÓƵ Commerce storefront. The Use Secure URLs on Storefront and Use Secure URLs in Admin settings are enabled by default, and all built-in cookies are now set as secure.
-
The dependency confusion plugin is now required for all ÃÛ¶¹ÊÓƵ Commerce installations. Previously, this plugin was required for Composer-based installations only. It now permits trusted versions. Merchants can bypass the constraints set in this plugin that prohibit certain combinations of Composer installations. The constraints can be bypassed for trusted versions, and ÃÛ¶¹ÊÓƵ Commerce now displays a warning before proceeding with installation.
-
Developers can now configure the limit on the size of arrays accepted by ÃÛ¶¹ÊÓƵ Commerce RESTful endpoints on a per-endpoint basis. See .
-
Added mechanisms for limiting the size and number of resources that a user can request through a web API on a system-wide basis, and for overriding the defaults on individual modules. This resolves the issue addressed by
MC-43048__set_rate_limits__2.4.3.patch
. See .
Platform enhancements
ÃÛ¶¹ÊÓƵ Commerce 2.4.4 now supports PHP 8.1. All project libraries and dependencies have been updated for compatibility with PHP 8.1. Additional platform enhancements include:
-
ÃÛ¶¹ÊÓƵ Commerce 2.4.4 provides support for Elasticsearch 7.16 and OpenSearch 1.2. ÃÛ¶¹ÊÓƵ Commerce merchants with deployments hosted on-premises can use either solution. However, OpenSearch is now the default search engine for ÃÛ¶¹ÊÓƵ Commerce 2.4.4 deployments hosted in the cloud. All customers with cloud deployments who upgrade to version 2.4.4 must use OpenSearch. See
-
The
JQuery
library has been upgraded to version 3.6. Thejquery-ui
library has been upgraded to version 1.13.0. Several other JavaScript libraries have been updated to the latest versions. -
TinyMCE 5.8.1 is now supported. TinyMCE 4 has been removed from the codebase.
-
The
RequireJS
library has been upgraded to the latest version (v2.3.6). -
PHPUnit has been upgraded to the latest version (9.5.x). Tests and test frameworks have been updated to be compatible with the new version.
-
Most Laminas dependencies have been upgraded to the latest versions that are compatible with PHP 8.1. Three Laminas dependencies were removed from the codebase to reduce the number of dependencies.
jQuery UI upgrade
jQuery UI has been upgraded to the latest version (v1.13.0). The following v1.10.0 jQuery components have been removed:
-
ajaxOptions
andcache
options for tabs. See . -
.zIndex()
. jQuery UI v1.12.1 includesjquery/z-index.js
, which supports the use of.zIndex()
. See . -
Data fallbacks for widget names. You must use the full name for the
.data()
key. -
Hard coding of classes such as
ui-corner-all
in widgets.
Performance and scalability enhancements
ÃÛ¶¹ÊÓƵ Commerce performance enhancements boost high throughput order processing and message queue optimization. The asynchronous orders feature introduced in this release supports the creation of approximately 60,000 orders/hour. Earlier versions of ÃÛ¶¹ÊÓƵ Commerce supported the processing of approximately 10,000 orders/hour, which presented a potential bottleneck for flash sales. The new multiple consumers feature supports scaling the number of message queue consumers on a single Cloud instance and increases the number of orders processed per hour.
Performance enhancements in this release:
-
The AsyncOrder feature supports faster order placement than synchronous execution provides. When AsyncOrder is enabled, order placement is executed in the background while shoppers complete other tasks on the storefront.
-
The new Enable Inventory Check On Cart Load configuration option provides a switchable inventory check when loading a product in the cart. It is enabled by default. When you disable this option, ÃÛ¶¹ÊÓƵ Commerce skips the inventory check as the quote loads, which speeds up checkout, especially for carts containing many items.
-
The new
multiple_processes
configuration option supports running parallel consumers in multiple processes. Previously,cron
ran a single consumer when needed. Launching multiple consumers to run processes in parallel can improve task execution speed. To enable this feature, addmultiple_processes
to theapp/etc/env.php
file. -
Cart operations for carts containing over 750 configurable products have been improved by increasing the memory limit set by
max_input_vars
in thephp.ini
file to support input variables volume. -
Optimization of sales rules processing during checkout by deferring total calculation. Typically, sales rule processing occurs every time a shopper adds a product to their cart, updates product quantity, or clicks the Place Order button. Merchants can enable this deferment by setting the
checkout/deferred_total_calculating
variable in theenv.php
file. Alternatively, you can runbin/magento setup:config:set --deferred-total-calculating 1|0
. -
Improvements to the validation process for orders affected by a cart price rule during asynchronous order placement.
GraphQL
This release includes these GraphQL enhancements:
- Complete GraphQL coverage for negotiable quotes. B2B company users can now complete all tasks related to negotiable quotes using GraphQL. Previous versions of this API supported negotiation flows but not checkout.
New mutations
-
mutation
-
mutation
-
mutation
-
mutation
-
mutation
-
mutation
-
Performance improvements:
-
The performance of GraphQL cart operations has improved. The
collectQuoteTotals()
method is now called only once during a GraphQL request, which reduces response time. -
Storefront performance has been improved by changes to how GraphQL requests are cached. Fastly and Varnish now cache GraphQL requests sent with
auth
tokens.
-
-
New storefront-related Admin configuration settings. The
storeConfig
query now returns the configuration settings for the Zero Subtotal Checkout and Check/Money Order payment methods. -
Updated core GraphQL library. The
webonyx
library, which enables core GraphQL to function, has been upgraded to version ^14.9. -
Fixed translation issues in GraphQL with multi-site and multi-language stores. The GraphQL resolver now returns translated strings based on store scope as expected.
-
GraphQL now provides New Relic with descriptive transaction names, which can be helpful for debugging.
See the for details on these enhancements.
B2B
This release includes multiple bug fixes. See B2B Release Notes.
Vendor-Bundled Extensions
With the exception of Braintree, all vendor-bundled extensions have been removed from the ÃÛ¶¹ÊÓƵ Commerce 2.4.4 code base. Merchants should migrate to the official extensions, which are available on the .
PWA Studio
PWA Studio v.12.3.0 is compatible with ÃÛ¶¹ÊÓƵ Commerce 2.4.4. It includes support for reCaptcha, Page Builder content optimization, and personalized content. For information about enhancements and bug fixes, see . See for a list of PWA Studio versions and their compatible ÃÛ¶¹ÊÓƵ Commerce core versions.
PayPal Payment enhancements
-
The Venmo payment option is now supported.
-
Pay Later has been added as an option for shoppers based on the shopper’s location, not the merchant’s location.
-
Merchants can now set the shopper country when testing the shopper experience in their country of choice. Previously, tests were limited to testing only for the country in which the merchant is located. This change is valid in sandbox mode only.
-
Messaging on the checkout page now displays accurate messaging on how much and in how many increments shopper will be expected to pay when using Pay Later.
Live Search
Live Search now supports PHP 8.1.
The new Magento_ElasticsearchCatalogPermissionsGraphQl
module is disabled during the updated Live Search installation. Existing Live Search installations must be upgraded to Live Search 2.0.0 to take advantage of these features. For more information, see the Live Search Release Notes.
Accessibility updates
This release brings increased conformance to standard accessibility guidelines. These enhancements improve the experience of users with limited vision or with limited language, cognitive, and learning abilities. Screen Reader tools performance has also improved.
Accessibility enhancements include:
- Tooltip links with text and accurate, task-focused, visible labels for inputs
- Edit buttons now have unique text.
- Admin buttons now have unique, accessible, and descriptive purpose in adherence to AA standards
- Icon images that convey meaning now provide a textual alternative.
- Enhanced contrast in Admin buttons and form fields to a contrast ratio of at least 3:1 with adjacent colors.
Page Builder
- Merchants can now add alternative text (
alt_text
) to images (Image, Banner, Slide) to enhance content accessibility.
Fixed issues
We are fixing hundreds of issues in the ÃÛ¶¹ÊÓƵ Commerce 2.4.4 core code. A subset of those fixed issues is described below.
Installation, upgrade, deployment
- ÃÛ¶¹ÊÓƵ Commerce now logs static content deployment errors in build log files as expected.
- Data patches can no longer ignore a table’s unique constraints and insert duplicate values into a MySQL database table. Previously, patches could insert duplicate values, which corrupted the database.
- Merchants can now successfully upgrade from an ÃÛ¶¹ÊÓƵ Commerce 2.4.2 deployment with Klarna to ÃÛ¶¹ÊÓƵ Commerce 2.4.3.
- Sitemap generator configuration can now be successfully changed from the command line. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error when you tried to change sitemap configuration outside the Admin:
Import failed: Notice: Trying to access array offset on value of type null in app/code/Magento/Cron/Model/Config/Backend/Sitemap.php on line 78
.
- The
bin/magento app:config:import
command now executes without error when you updatetime
values inconfig.php
. Previously, changing product alert configuration by manual editing (that is, not using the Admin) resulted in an error.
Accessibility
- Accessibility errors with navigation on the cart and checkout pages have been resolved.
- Screen readers can now read all relevant form elements on product pages.
- Contrast has been improved for image delete and move icon buttons throughout the storefront to improve readability for low vision users.
- The magnifying glass icon that is used to execute searches throughout the product interface has been assigned an accessible name and textual alternative.
- The rich text editor toolbar can now be accessed using the Tab key.
- The This item has weight select input on the Catalog > Product details page now has visible labels and an accessible name.
- The accessible name of the control now includes the text of its visible label for the number of items per page dropdown.
- The table controls on the Catalog > Product details page now have visible labels and an accessible name when the table is collapsed.
- Edit links in the Products table now have unique, meaningful link text.
- The triggers that expands tooltips now provide textual names.
- Buttons throughout the storefront now have unique, descriptive accessible names. Previously, split buttons with a text button and an adjacent down arrow icon button had the same accessible name.
- Contrast has been improved for image delete and move icon buttons throughout the storefront to improve readability for low vision users.
- Textual alternatives have been added to the pencil icon that appears when a merchant edits input for the Search Engine Optimization accordion.
- The magnifying glass icon that is used to execute searches throughout the product interface has been assigned an accessible name and textual alternative.
- The product page New View text input field now has an accessible name.
- The This item has weight select input on the Catalog > Product details page now has visible labels and an accessible name.
AdminGWS
- Administrators with restricted permissions can now create a return as expected.
Backend
- Administrators can now log in to the Admin in a deployment for which a custom Admin path is configured and secret key is enabled. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error:
Invalid security or form key. Please refresh the page
.
- ÃÛ¶¹ÊÓƵ Commerce no longer redirects to the All Store View scope when the multi-store hierarchy changes. Previously, after the hierarchy was saved, shoppers were redirected to an incorrect store URL and the All Store Views scope was selected in a multi-store deployment.
Bundle products
- Shoppers can now add a bundle product with Fixed Product Tax and two options to their shopping cart. Previously, ÃÛ¶¹ÊÓƵ Commerce did not add the product and displayed this error:
We can't add this item to your shopping cart right now
.
- Form validation in the form of the
data-validate
andmin
attributes has been added to the cart quantity field to prevent negative values for bundle products.
- The
products
query now filters bundle products correctly when child products are disabled on the store-view level. Previously, the query returned child products that were disabled at the store-view level.
cron
now clears the product category cache as expected duringindexer_update_all_views
execution. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed an incorrect product count on the category page after the mass update of many products in the category.
- ÃÛ¶¹ÊÓƵ Commerce now updates the category product cache as expected when a bundle product reappears in stock.
- The cache cleaning algorithm that runs during re-indexing has been optimized. Bundle products are now displayed as expected when a category is cached during re-indexing. Previously, bundle products were not displayed for hours after product categories were cached during re-indexing.
- Currency conversion now occurs as expected in email confirmations for bundle product purchases in multi-store deployments that use different currencies.
- Advanced pricing special price discounts are now correctly displayed for bundle products with a % prefix in the product grid. Previously, a % discount was incorrectly displayed with $ prefix instead of % in the product grid.
- Bundle product status in the Admin now updates automatically when a related product changes its status.
- The GraphQL resolver for bundle products now checks whether child bundle products have been disabled. Previously, this check did not occur and queries such
categoryList
returned child products that were not salable.
cart
query responses now return accurate discounts for bundle products with dynamic prices. Previously, query responses included discounts applied to each bundle product individually.
Cache
- Page cache no longer grows rapidly under typical use.
- Placing an order no longer results in the removal of all cache tags that are related to the ordered products from the Varnish cache.
- Full-site page cache is no longer wiped out when you update a product from top categories or run an index to update product attributes or stock status. Previously, Varnish cache added top menu category IDs to all page cache tags.
Cart and checkout
- The Minimum Advertised Price What’s this? link on the cart page is now clickable and opens the information popup as expected. Previously, clicking this link had no effect.
- Shoppers can now place orders without errors after a session timeout in deployments where persistent shopping cart is enabled. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed a payment error after a session timeout.
- Assigning a high sort order value to a customer address attribute no longer causes performance degradation on the checkout page.
- ÃÛ¶¹ÊÓƵ Commerce now reverts the shopping cart product quantity to the previous value if the updated quantity is invalid.
- Clicking the Add to Cart button in the Recently Viewed section now redirects as expected to the product details page. Previously, shoppers were redirected to the product listing page.
- Guest shoppers can now successfully check out with a customer address that contains several types of custom customer address attributes. Previously, values for custom attributes were not properly formatted when displayed during checkout.
- ÃÛ¶¹ÊÓƵ Commerce now correctly applies the free shipping threshold to orders when table rates are enabled.
- You can now use
POST /V1/guest-carts/:cartId/items
to add simple products with different options to a cart. Previously, this call changed the quantity of the first simple product you added instead of adding a second simple product with the specified options.
- The Order Summary section of the checkout page now displays the correct currency and amount when a deployment is configured for
Poland
country andPLN
currency. Previously, the shopping cart and checkout page displayed the amount PLN 0.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error when a shopper clicks Update Cart after changing a product quantity in the mini cart. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error:
The quote item isn't found. Verify the item and try again
.
- GraphQL
products
queries for configurable products in a specific store now return the price ranges of products on the specified store only. Previously, requests returned price ranges for simple products on non-specified stores.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws this error when a shopper adds a billing address that is missing a street field:
Uncaught TypeError: Unable to process binding "text: function(){return currentBillingAddress().street.join(', ') }"
.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws a console error during checkout in stores from which the mini cart has been removed.
- Checkout no longer fails at the payment stage when the billing address is missing street field values or the street field value is not an array. Previously, checkout failed with this error:
Uncaught TypeError: Unable to process binding "text: function(){return currentBillingAddress().street.join(', ') }"
.
- Sales total is now calculated correctly in the coupon report grid. Previously, the sales total did not include the shipping amount.
- Whole-cart discounts are now calculated correctly when the shopper switches between shipping methods.
- The dropdown list for the State field on the Admin create order page is now populated by the predefined values for the selected country. Previously, this field was an input text field instead of a dropdown menu.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error after you use the
addConfigurableProductsToCart
mutation to add a configurable product to a cart directly after changing the store view.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error when you use the
addConfigurableProductsToCart
mutation to add a disabled child of a configurable product to the cart. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an integrity constraint violation error.
- Cross-sell products are no longer visible on the cart page when the Show Cross-sell Items in the Shopping Cart configuration setting is disabled.
- The coupon usage value no longer changes if the order that the coupon has been applied to fails. Previously, single-use autogenerated coupons were marked as invalid after the coupon was applied in the cart but the order was not placed.
- Validation has been added to the checkout workflow to compare the customer’s street address against default value. If the validation process identifies changes, it sets
customer_address_id
tonull
to treat it as a new customer address. Previously, If the customer saved the address without validation at checkout and the same customer tried to place an order using the same address after validation was applied to checkout field , ÃÛ¶¹ÊÓƵ Commerce did not accept the edited address and threw an exception.
Cart price rules
- Coupon generation is now blocked until the related cart price rule is saved with the
auto
option enabled. If you try to save this rule without enabling theauto
option, ÃÛ¶¹ÊÓƵ Commerce displays this message:Rule is not saved with auto generate option enabled. Please save the rule and try again
.
- Added test for confirming the correct application of a cart price rule discount.
- Cart price rules that use an SKU condition with If an item is FOUND/NOT FOUND in the cart with All/Any of these conditions true now work as expected with configurable products.
- Cart price rules are now applied correctly for fixed-price bundle products. Previously, cart price rules did not apply to these products when at least one child product had same attribute set specified in the rule condition.
- A product with the price of 0 can now be successfully added to the cart when ÃÛ¶¹ÊÓƵ Commerce is configured with the Fixed amount discount for whole cart cart price rule. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error:
report.ERROR: Warning: Division by zero in /home/mer33515/public_html/ee24develop/app/code/Magento/SalesRule/Helper/CartFixedDiscount.php on line 85
.
- Corrected a condition where the
cart
query returned an inaccurate discount amount when shopping cart rules with fixed amount discounts were activated.
Catalog
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an exception when performing a mass attribute update action on the product grid when a product has a
datetime
attribute.
- GraphQL queries now return results for child products of a configurable product according to the visibility filter settings of the child product(s).
- ÃÛ¶¹ÊÓƵ Commerce no longer modifies related product prices when the configurable product attributes are changed. Previously, the Minimum Advertised Price (MAP) for a configurable product overwrote the price of related products on the store front.
- Administrators can now re-assign the last product remaining in a category and save the empty category.
- Dropdown/multi-select attribute values for the Admin product grid and filters are now derived as expected from Admin settings. Previously, attribute values were derived from the default store settings.
- GraphQL category queries return information about changes to staged categories as expected.
- Product lists are now accurately rendered in the Admin in deployments with products assigned to both a parent category and its subcategories but in different positions within each category. Previously, product list rendering failed with this error:
Item (Magento\Catalog\Model\Product\Interceptor) with the same ID "<ID>" already exists
.
- Multi-select attributes with many options (over 150) can now be assigned to new products. Previously, attribute options were saved in the
catalog_product_entity_varchar
table, and not all options were present when you reopened the product in the Admin.
- Added validation for the case when a router cannot instantiate an action class collected from a URL. ÃÛ¶¹ÊÓƵ Commerce now displays the standard error message. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error:
PHP Error: Cannot instantiate abstract class Magento\Catalog\Controller\Product\Compare
.
- ÃÛ¶¹ÊÓƵ Commerce now correctly calculates discounts when two cart rules are applied to an order that meet these conditions: one cart rule is applied with a coupon code and a Fixed price on whole cart condition and the second cart price rule has no coupon and a Percent of product price discount condition. Previously, the relevant algorithm could not properly split the discount proportionally among cart products when a previous cart rule had already applied a discount on some products.
- Assignment of many products (approximately 10,000) to a category no longer causes the browser to crash.
- Image attributes are now saved in the database consistently whether saving from the Admin or importing. Previously, image ALT text values were saved inconsistently. If the image existed and the label was set to null, the label value was not reset in the database.
- The Catalog Widget SQL query has been optimized. Previously, large MySQL queries slowed down page load and resulted in MySQL outages.
- Price filters now work correctly with out-of-stock configurable products. Previously, out-of-stock configurable products were not shown in their correct price range.
- Updating a child product no longer removes the catalog rule discount inherited from its parent configurable product during the partial indexing process. Previously, when we assigned a configurable product to a category but not its associated simple products, and then used that category to create a catalog rule, ÃÛ¶¹ÊÓƵ Commerce removed the catalog rule assigned to the simple product during the partial indexing process.
- The grid view list of grouped and configurable products now contains only simple and virtual products when adding product options. Previously, the application included simple products with options.
Catalog rule
- Daily updates of catalog rules no longer result in performance degradation. Previously, partial catalog product price indexing did not remove old prices or dates.
- ÃÛ¶¹ÊÓƵ Commerce no longer removes catalog price rules on configurable products during partial re-indexing. Previously, only sub-products were re-indexed when configurable products were re-indexed.
- Catalog price rules with the category is not category_id condition now apply to products that do not belong to any category.
Configurable products
- The configurable product option label name is now based on the selected store view during Admin order creation. Previously, ÃÛ¶¹ÊÓƵ Commerce used the label name from the default store view.
- Product lists now correctly include child products of an out-of-stock product when the global flag for displaying out-of-stock products is enabled. Previously, the product list did not include the child product if one one of several child product options were out-of-stock when this flag was enabled.
- You can now use the
addConfigurableProductsToCart
mutation to add a configurable product to the cart on a non-default store view. Previously, you could not add a configurable product to a cart when website ID and store ID differed.
- GraphQL
products
queries no longer return data about the disabled child products of configurable products.
- Creating new configurations for a configurable product no longer overrides changes in existing configurations. Previously, the status of existing variations were overridden with the default status
enabled
after new variations were generated.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an internal error when you try to add a disabled child of a configurable product to the cart.
Customer
- ÃÛ¶¹ÊÓƵ Commerce now considers website scope for Admin locales during order creation. Previously, order details such as customer address attributes worked properly on one website only in a multi-site deployment.
Customer segment
- The Matched Customers count for a new customer segment now updates automatically when you create a company account. Previously, you had to refresh segment data to get an accurate count.
- Email field validation errors on the checkout login popup now match email validation errors on the customer login page when a customer tries to log in using an invalid email account.
- ÃÛ¶¹ÊÓƵ Commerce no longer includes an error message in the shipment details email when a shipment comment is added from Admin and the Notify Customer checkbox is activated. Previously, shipping confirmation emails included this message:
We're sorry, an error has occurred while generating this content
.
- Region and country ID values are now properly converted in email templates. Previously, when you clicked on Preview link from the Admin email template, country and the region name were not displayed correctly.
- Sales update emails sent from the Admin for non-default store views now contain correct order status labels. Previously, these emails always displayed status from the default store.
- ÃÛ¶¹ÊÓƵ Commerce now includes
Content-Disposition: inline
headers in email as expected.
- Order and shipment notification emails now work as expected in deployments using Microsoft Outlook and MS Exchange Server. Previously, the email body was empty but contained an ATT*-labeled attachment.
- Order emails now contain data localized using the shopper’s locale as expected. Previously, order emails used the Admin locale.
- Clicking on the preview of any email template now opens the template preview in a separate window as expected. Previously, ÃÛ¶¹ÊÓƵ Commerce opened the template preview simultaneously from the Email Templates grid and in a popup window.
- Asynchronous order emails that are sent from a non-default website now include logo URLs from the appropriate website. Previously, these emails always included logos from the default or primary website. (A default key with a
storeCode
value has been assigned to the second array argument that is passed to theUrlInterface
getUrl
function. This value distinguish URLs in respect to different stores/websites and generates a correctbaseUrl
for the email content that is sent to customer.)
Frameworks
- Non-strict comparisons between numbers and non-numeric strings now work by casting the number to string and comparing the strings. Comparisons between numbers and numeric strings continue to work as before. This means that
0 == "not-a-number"
is now considered false.
- The helper
Magento\Payment\Helper\Data
no longer creates new layouts in constructors. Previously, when this helper was used in custom commands without specifying an area code, ÃÛ¶¹ÊÓƵ Commerce threw an error.
- Updated the
allure-framework/allure-php-api
Composer dependency.
- ÃÛ¶¹ÊÓƵ Commerce now returns a 500 response code when an exception occurs in the bootstrap file. Previously, ÃÛ¶¹ÊÓƵ Commerce returned a 200 OK status code.
- The currency symbol is now loaded as expected on storefront product details pages. Previously, this symbol sometimes disappeared after JavaScript page reloads.
- Updating
symfony/console
no longer causes a failure when runningbin/magento setup:di:compile
.
- New required options have been added to the
.htaccess
andnginx.conf
files that are distributed with ÃÛ¶¹ÊÓƵ Commerce for PHP 8.x support. Outdated options have also been removed.
- Merchants can now upload a video for multiple products. The file generation process now appends an extension to the file name only if the uploaded file name includes an extension. Previously, when a merchant tried to upload then save the same video for two different products, ÃÛ¶¹ÊÓƵ Commerce threw this error:
Notice: Undefined index: extension in /app/7ha7zds7wvqys_stg/vendor/magento/framework/File/Uploader.php on line 699
. This occurred because ÃÛ¶¹ÊÓƵ Commerce tried to append a file extension to the name irrespective of whether the uploaded file name had an extension.
- Corrected issues with
sprintf(__())
andsprintf(Magento\Framework\Phrase())
construction for compatibility with PHP 8.x throughout the codebase. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this type of error:Expected parameter of type 'string', 'Magento\Framework\Phrase' provided
.
- Improved validation of the advanced search query parameters.
- Executing
bin/magento support:backup:code
now creates a backup as expected. Previously, ÃÛ¶¹ÊÓƵ Commerce created a backup but threw an error.
- Successfully executed
cron
processes are now assigned a status ofsuccess
. Previously, the samecron
process could be run twice because successfulcron
processes were assigned apending
status.
- The
staging_synchronize_entities_period
cron
job now works as expected. Previously, the first staging update was applied successfully, but ÃÛ¶¹ÊÓƵ Commerce threw this error with subsequent updates:report.ERROR: Cron Job staging_synchronize_entities_period has an error: The active update can't be deleted
.
- The
Magento_Logging
module now supports IPv6.
General fixes
- ÃÛ¶¹ÊÓƵ Commerce now copies all product fields according to their defined scopes when duplicating a product. Previously, the name and description fields were reset to
global
scope.
- ÃÛ¶¹ÊÓƵ Commerce no longer applies delta rounding to a discount when the product price is 0. Previously, ÃÛ¶¹ÊÓƵ Commerce calculated a negative discount amount.
- Products with a Set as New attribute that is assigned an empty start date and an expired end date can now be successfully saved. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error when you saved a product with these settings:
Make sure the To Date is later than or the same as the From Date
.
- ÃÛ¶¹ÊÓƵ Commerce no longer duplicates an existing CMS page in the CMS hierarchy when you change its SEO URL identifier. Previously, ÃÛ¶¹ÊÓƵ Commerce created a new node in the CMS hierarchy, duplicating an existing one.
- Administrators can now retry operations that have been running over the maximum processing time. The default maximum is 12 hours.
- Broken pipe errors no longer occur during bulk action processing due to unacknowledged messages for the consumer. A prefetch count property now limits these messages for the consumer and avoids errors. Previously, running
bin/magento queue:consumers:start async.operations.all
generated this error:Broken pipe or closed connection
.
- Shoppers are now redirected back to the login page as expected after a second failed login attempt. Previously, shoppers were redirected to a 404 page after a second unsuccessful login attempt.
- Password reset token validity has been extended to avoid the occurrence of a race condition during submission of the password change page.
- Permissions that are assigned to new integrations are now respected.
- Corrected regression issue that affected messages left in the exception logs for the Contact Us form.
- Resolved multiple issues with JavaScript loading of customer data.
- Using
QuoteIdToMaskedQuoteId
in an extension no longer significantly increases response time.
- The class
BundleDiscountPrice
inmagento2/app/code/Magento/Bundle/Pricing/Price/ConfiguredPrice.php
is now declared as expected. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error:Class Magento\Bundle\Pricing\Price\BundleDiscountPrice not found
.
- Escaped CSV field values written by the AWS S3 adapter now match the data written by other file system adapters.
- S3 compatible storage is now supported.
- Logging out from one device no longer automatically logs out the shopper from other devices.
- ÃÛ¶¹ÊÓƵ Commerce now successfully saves a CMS page when you edit it from inline the grid on store-view level when the Use the parent node hierarchy configuration setting is disabled. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error and did not save your CMS page edits:
A technical problem with the server created an error. Try again to continue what you were doing. If the problem persists, try again later
.
- Breadcrumbs are now displayed correctly for nodes that contain the same page. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed the same node name for pages that belonged to multiple nodes. ÃÛ¶¹ÊÓƵ Commerce retrieved only the first node for a page even when more than one node existed for each page.
- URL rewrite inline editing events are now logged in reports.
- The
mage-messages
cookie is not reset if there are no new messages.
Gift cards
- Added a more informative error message when a shopper enters an invalid gift card.
GraphQL
- The
generateCustomerToken
andrevokeCustomerToken
mutations now provide the correct cache ID for the user state. Previously, these mutations used an invalidx-magento-cache-id
, which degraded performance.
- The
setBillingAddressToCart
mutation now correctly uses thesame_as_shipping
parameter to set the billing address to match the shipping address as expected. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error:The shipping method is missing. Select the shipping method and try again
.
- GraphQL cart operations now calculate cart grand totals only when the query requests it. Previously, cart operations always calculated the grand total, which is a resource-intensive operation.
- The
addProductsToCart
mutation now adds to the cart only products that are assigned to the store that is defined in the header.
products
queries using layered navigation filters now return correct child category lists.
- Queries and mutations that return the
ConfigurableCartItem
object contain information about configured variants as expected.
- The
products
query now returns configuration product option values and variant attribute values. Previously, these values were empty in query responses.
- The
products
query now filters bundle products correctly when child products are disabled on the store-view level. Previously, the query returned child products that were disabled at the store-view level.
- GraphQL now provides New Relic with descriptive transaction names, which can be helpful for debugging.
- The
setShippingAddressesOnCart
mutation now supports setting shipping addresses on a shopping cart with an empty telephone number value when the Show Telephone Admin configuration setting is set to optional. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error:Field CartAddressInput.telephone of required type String! was not provided
.
- Corrected an issue where the
addSimpleProductsToCart
mutation allowed you to add simple products to a cart that are not assigned to the target website.
- MySQL queries have been optimized for GraphQL
products
queries that use search parameters to refine search results.
- The
addConfigurableProductToCart
mutation no longer supports adding a product to a cart if the product is not included in the requested scope.
- The
products
query now returns only configurable variants that are assigned to the requested storeview. Previously, all variants of the requested configurable product were returned.
addSimpleProductsToCart
requests can now run successfully in parallel. Previously, multiple requests for the same SKU created duplicate line items for the same cart ID rather than increasing the product quantity as expected.
- The
addProductsToCompareList
mutation can now be used to compare variants of configurable products.
- When the price of a tier product is updated from the backend, the new price is updated correctly on the customer’s cart. Previously, although the subtotal in the cart summary section was updated correctly, the row subtotal was not updated.
- The
addProductsToCart
mutation now adds all selected options to the cart when used to add bundle products with multiple selection options. Previously, the mutation added only the last selection.
- GraphQL queries now return billing address as expected when the value of an optional telephone field is set to an empty string. Previously, queries returned a null address value.
- The
products
query response now lists products according to the specified sort order when multiple products have the same relevance or price value.
- Concurrent
addSimpleProductsToCart
andaddProductsToCart
requests no longer result in duplicated quote items.
products
query layered navigation filters now return correct child categories lists. Only direct subcategories are now included when theincludeDirectChildrenOnly
flag is provided in the request. Previously, all categories were included in response in the aggregation section when a product was assigned to several categories.
- Added search suggestion functionality for GraphQL search queries.
- The
OrderAddress.telephone
field is now optional in thecustomer
query or other queries and mutations that return or modify customer order addresses.
- Prices are now correctly updated for customers in a specified group in both the storefront and Admin when a group ID is changed via API. Previously, these prices were not updated correctly when a group ID was changed via API.
Image
- Watermark images with transparent backgrounds no longer have a white background on the transparent product image that it overlays. Previously, when both the watermark image and product image had a transparent background, the watermark was displayed with a white background.
- Logos for invoices and shipping receipts are now uploaded and displayed as expected when AWS S3 is enabled.
- The media tag associated with an image added to a CMS page in a deployment where the Admin is set to a different domain than the store URL now contains store URLs as expected. Previously, media tags contained static Admin URLs instead of the expected store URLs.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error when you flush the images cache while simultaneously loading images on the storefront.
Import/export
bin/magento remote-storage:sync
no longer fails when filenames are similar but differ by only one or two characters. Previously, the first image was stored correctly, but the second, similarly named image triggered a sync failure and this error:Notice: Undefined index: media/catalog/product/5/_ in /src/vendor/magento/module-remote-storage/Driver/Adapter/Cache/Generic.php on line 197
.
- ÃÛ¶¹ÊÓƵ Commerce now converts the timestamp in the export filename to the user’s timezone after a scheduled export. Previously, these values were not converted, and ÃÛ¶¹ÊÓƵ Commerce displayed the UTC timestamp.
- ÃÛ¶¹ÊÓƵ Commerce no longer creates duplicate images in remote storage when the same CSV file is imported more than once.
- Import no longer fails with this message:
Import failed: Area code not set: Area code must be set before starting a session
.
- You can now import successfully after running
bin/magento app:config:dump
and manually editingconfig.php
.
- Non-default multiple value separators can now be used in custom multi-select attributes. Previously, validation failed during import.
- Product position in categories is now assigned correctly during import from CSV.
Index
- ÃÛ¶¹ÊÓƵ Commerce now displays products as expected on the storefront after re-indexing. Previously, when the first 500 products being re-indexed were in stock, and the next 500 products were out of stock, the storefront did not display any additional products.
- Resolved consistency issues in merged
indexer.xml
files. The allowed values inclassType
are now the same in unmerged and mergedindexer.xml
files.
- A synchronization mechanism has been implemented in category indexers to prevent full and partial indexers from running in parallel. Previously, when these indexers ran in parallel, products could be temporarily omitted from storefront category pages or category pages could be temporarily empty of products.
Infrastructure
- The unsupported
str_contains
method has been replaced with a supported function. This was a known issue for ÃÛ¶¹ÊÓƵ Commerce 2.4.3.
-
Refactored the codebase to correct usage of the keyword
match
, which is a reserved keyword in PHP 8.x. -
HTML tags are now nested and closed properly to meet standards in JQuery 3.5.x for non-void elements including custom elements.
- Fixed
abs()
andround()
functions for compatibility with PHP7.x and PHP8.x.
- Updating
symfony/console
no longer causes failure when runningbin/magento setup:di:compile
.
- Corrected the restriction for the
colinmollenhour/cache-backend-redis
Composer dependency.
- The codebase has been refactored to remove calls to deprecated methods of
phpunit/phpunit
.
- ÃÛ¶¹ÊÓƵ Commerce now displays an informative error when an administrator with a read-only
pubs/media
tries to access the product details page for a product that includes images. Previously, ÃÛ¶¹ÊÓƵ Commerce threw a PHP error.
- All member-level
@api
annotations have been moved to their class throughout the codebase.
gift-card Cms
widget data has been moved fromMagento/WidgetSampleData
(Magento Open Source) toMagento/GiftCardSampleData
(ÃÛ¶¹ÊÓƵ Commerce). This has resolved problems installing (Magento Open Source) with sample data on PHP8.1.
- Marked interfaces throughout the ÃÛ¶¹ÊÓƵ Stock Integration codebase with
@api
as needed.
- Integers and floats in result sets are now returned using native PHP types instead of strings when using emulated prepared statements.
- Auto-creation of arrays from false values have been disabled to ensure compatibility with PHP 8.1.
- The helper
Magento\Payment\Helper\Data
no longer creates new layouts in constructors. Previously, when this helper was used in custom commands without specifying an area code, ÃÛ¶¹ÊÓƵ Commerce threw an error.
- You can now pass a
data
argument to a block instance constructor bydi.xml
.
- Optimized
Generator.php
for readability.
- Improved the JWK check in the
JwsManager
class to handle situations when the algorithm is set directly in the header. Previously, this check ignored this valid scenario.
Upgrades for PHP 8.1 compatibility
-
Functions that have been deprecated in PHP 8.1 have been removed from the codebase.
-
Added return type declarations to internal methods with incomplete return types for compatibility with PHP 8.1.
-
Updated the root
composer.json
metapackage andcomposer.json
file for each module to PHP 8.1. -
Third-party
jquery.tabs
library (latest version) -
NPM packages (latest version) ,
-
jquery.cookie
third-party library (latest version)
Composer dependency updates
-
All Composer dependencies were updated to the versions compatible with PHP 8.1.
-
PHPUnit has been upgraded to the latest version (9.5.x). Tests and test frameworks have been updated to be compatible with the new version.
JavaScript dependency updates
jquery-validate
third-party library
Less.js
(v3.13.1)
Library removals and deprecations
-
The following libraries have been removed because all browsers that ÃÛ¶¹ÊÓƵ Commerce 2.4.x supports have built-in support for this functionality:
es6-collections.js
MutationObserver.js
Modernizr
FormData.js
-
Removed the unused
jquery.hoverIntent
JavaScript library. -
lib/internal/Magento/Framework/Filter/Money.php
has been deprecated. It contains themoney_format()
function, which was removed in PHP 8.x. -
Removed the deprecated, unsupported
grunt-autoprefixer
package.
Library upgrades
-
The following libraries have been upgraded to more recent versions:
script.aculo.us
Chart.js
moment.js
moment-timezone-with-data.js
matchMedia.js
underscore.js
PrototypeJS
RequireJS
LessCSS
Invoice
- Casting to
int
has been removed for auto-incremented invoice IDs when prefixed with a string. As a result, invoices now display a 0 for numbers that are prefixed with a string.
Logging
- ÃÛ¶¹ÊÓƵ Commerce no longer creates log entries for failed API calls executing bulk actions in System > Bulk Actions. Previously, permanent entries for failed API calls were added to the bulk action log.
- The auto-creation of arrays from false values is no longer permitted. ,
ÃÛ¶¹ÊÓƵ Commerce coding standard
- Updated
phpunit/ phpunit
to the latest version for themagento-coding-standard
repository.
- Updated the
webonyx/graphql-php
dependency to version ^14.9 in the ÃÛ¶¹ÊÓƵ Commerce coding standard repository.
- Added new sniff
Magento2.PHP.ArrayAutovivification
to the ÃÛ¶¹ÊÓƵ Commerce coding standard to identify the auto-creation of arrays from a false value.
- Added new sniff
Magento2.Functions.DeprecatedFunction
to the ÃÛ¶¹ÊÓƵ Commerce coding standard.
- Added deprecated functions to sniff
Magento2.Functions.DiscouragedFunction
in the ÃÛ¶¹ÊÓƵ Commerce coding standard.
- The
Magento2.Annotation.MethodAnnotationStructure
sniff no longer fails with a false positive.
Media Gallery
- The
bin/magento media-gallery:sync
command no longer fails in deployments where AWS S3 is enabled.
- Newly added Media Gallery Content submenu titles are now displayed when menu items exceed 11 and the Enable Old Media Gallery configuration setting is enabled.
- Loading time for the Media Gallery tab when editing a product with many images has improved.
MFTF
-
CURLOPT_POSTFIELDS
no longer accepts objects as arrays. To interpret an object as an array, perform an explicit (array
) cast. This practice also applies to other options that accept arrays. -
curl_init()
now returns aCurlHandle
object rather than a resource. Thecurl_close()
function no longer has an effect. Instead, theCurlHandle
instance is automatically destroyed if it is no longer referenced.
- Fixed errors in MFTF tests for downloadable products.
- Removed
CliCacheFlushActionGroup
fromCatalogSearch
,GroupedProduct
,Newsletter
,Paypal
,Quote
, andReview
modules.
- Non-strict comparisons between numbers and non-numeric strings now work by casting the number to string and comparing the strings. Comparisons between numbers and numeric strings continue to work as before. This means that 0 == “not-a-number†is now considered false.
parse_url()
now distinguishes between absent and empty queries and fragments.
- Updated the codebase to avoid a fatal error when using the
ReflectionType::isBuiltin()
method.
New action groups
AdminCheckOrderStatusInGridActionGroup
StorefrontSelectFirstShippingMethodActionGroup
AdminClickUpdateChangesOnCreateOrderPageActionGroup
Action groups
Repetitive actions have been replaced with action groups in these tests:
AdminAddInStockProductToTheCartTest
AdminAddBundleItemsTest
AdminConfigurableProductAddConfigurationTest
AdminConfigurableProductBulkUpdateTest
AdminConfigurableProductDisableAnOptionTest
AdminConfigurableProductOutOfStockAndDeleteCombinationTest
AdminConfigurableProductOutOfStockTestDeleteChildrenTest
AdminConfigurableProductRemoveAnOptionTest
AdminConfigurableProductRemoveConfigurationTest
AdminCreateAndEditSimpleProductSettingsTest
AdminCreateAndEditVirtualProductSettingsTest
AdminCreateInactiveFlatCategoryTest
AdminCreateInactiveInMenuFlatCategoryTest
AdminCreateDuplicateCategoryTest
AdminCreateDuplicateProductTest
AdminDeleteSimpleProductTest
AdminEditRelatedBundleProductTest
AdminMassDeleteBundleProductsTest
AdminNavigateMultipleUpSellProductsTest
AdminSimpleProductSetEditContentTest
AdminSimpleProductTypeSwitchingToConfigurableProductTest
AdminConfigurableProductTypeSwitchingToVirtualProductTest
AdminCreateConfigurableProductWithDisabledChildrenProductsTest
AdminUpdateFlatCategoryAndAddProductsTest
AdminUpdateTopCategoryUrlWithNoRedirectTest
AdminUpdateTopCategoryUrlWithRedirectTest
CatalogProductListWidgetOperatorsTest
CreateProductAttributeEntityWithReservedKeysTest
EnableDisableBundleProductStatusTest
StorefrontCheckRefundGrandTotalActionGroup
StorefrontInactiveCatalogRuleTest
StorefrontConfigurableProductCantAddToCartTest
StorefrontConfigurableProductOptionsTest
StorefrontConfigurableProductCanAddToCartTest
StorefrontConfigurableProductGridViewTest
StorefrontConfigurableProductListViewTest
StorefrontProductNameWithHTMLEntitiesTest
StorefrontProductNameWithDoubleQuoteTest
New tests
AdminCreateOrderWithCheckedAppendCommentCheckboxTest
CheckoutWithEnabledCaptchaTest
StorefrontAddProductWithBackordersAllowedOnProductLevelToCartTest
StorefrontGiftMessageForOrderOnCheckoutCartPageTest
StorefrontCaptchaCheckoutWithEnabledCaptchaTest
StorefrontCheckoutWithEnabledMinimumOrderAmountOptionTest
Refactored tests
CaptchaWithDisabledGuestCheckoutTest
Newsletters
- Users with appropriate permissions can now manage customer newsletter subscriptions as expected. Previously, only administrators with full permissions could manage customer newsletter subscriptions on the Admin customer account page.
Order
- Shoppers can now successfully re-order an existing order that contains a product with the combination of custom options of type file and type dropdown from both the storefront and Admin. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an error and did not process the re-order.
- Invoices for orders that are paid by store credit and that have fixed product taxes (FPT) applied now include the correct grand total.
- The Admin order detail page now loads as expected. Previously, ÃÛ¶¹ÊÓƵ Commerce threw the following error when loading the order detail page for orders with certain taxes:
Call to a member function getId() on array
.
- Administrators with restricted permissions that include order and shipping privileges can now view the order page as expected. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an error when an administrator with these permissions tried to view an order.
- Shoppers can now place an order that includes a child configurable product when a maximum quantity allowed limit is set.
Payment methods
- Shoppers can now use Braintree to place an order using a billing address without a set region in deployments with 3DS enabled. Previously, checkout froze when the shopper clicked Place order, and the purchase could not be completed.
- The Venmo payment option is now supported.
- PayPal can now track by BN code.
bin/magento setup:upgrade
now runs as expected when upgrading from ÃÛ¶¹ÊÓƵ Commerce 2.4.2-p1. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error:Unable to apply data patch Magento\Paypal\Setup\Patch\Data\UpdateBmltoPayLater for module Magento_Paypal
.
- The correct store ID is now used to retrieve saved credit cards during Admin order placement. Stored credit cards are now displayed during order placement according to the website scope configuration setting. Previously, when an administrator tried to create an order for a customer from the Admin and selected the Stored Credit Cards method, no options were available for stored cards.
- Anomalies with PayPal Credit display of gift card amounts have been resolved. Previously, when PayPal Credit was enabled and multiple gift card amounts were configured, if a shopper changed the amount for the value of a gift card, the storefront did not update the amount for installment payments. This was a known issue in ÃÛ¶¹ÊÓƵ Commerce 2.4.3.
PayPal
- ÃÛ¶¹ÊÓƵ Commerce no longer displays an error during checkout with the PayPal Express payment method. Previously, although the checkout process completed, ÃÛ¶¹ÊÓƵ Commerce displayed this error:
Something went wrong
.
- PayPal Express now works as expected from the shopping cart. Previously, when you clicked the PayPal button to start express checkout from the cart, ÃÛ¶¹ÊÓƵ Commerce threw this error:
To check out, please sign in with your email address
.
- PayPal Payflow Pro now performs delayed capture with correct parent transaction IDs in deployments where the PayPal Payflow Pro gateway with Payment Action is set to Authorization. A Sale transaction is sent to Payflow with a parent transaction ID of the vault token created at checkout as expected. Previously, a Delayed Capture transaction was created and sent to PayPal Payflow.
- Shoppers are now redirected to the success page as expected after payment with PayPal Payments Advanced payment completes. Previously, shoppers were not redirected to this page even though the payment was successfully processed and no errors were logged.
Performance
- Added an index to
magento_giftcardaccount.code
to improve performance.
- Module list load execution time has improved.
- The performance of the Popular Search Term cache has improved. Previously, the larger the
search_query
table, the longer a search query took to complete.
- ÃÛ¶¹ÊÓƵ Commerce by default resizes images synchronously during product save. Merchants can now resize images as a background asynchronous process by minor edits to a
di.xml
file.
- The performance of the Category Products indexer has been improved in multi-store deployments.
- The new in-memory cache for
glob()
system calls improves performance by reducing the number ofglob()
calls.
- Performance of the asynchronous order grid re-indexing process has been improved.
- Memory consumption during the product export has been optimized.
- Loading of product details pages with related products has been optimized. Related product conditions queries have also been optimized.
Pricing
- Price sorting now works as expected when product prices are close to or equal to zero and shared catalogs are enabled. Previously, zero tier prices were ignored during price re-indexing.
- ÃÛ¶¹ÊÓƵ Commerce no longer throws an error if the price filter on the Category page does not contain a second value. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an exception in the log file.
ProductAlert
- The new
product_alert
consumer improves the sending of customer alerts by creating queue messages, running the consumer, and improving execution time. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an out-of-memory exception when sending more than 100,000 product alerts. ÃÛ¶¹ÊÓƵ Commerce also took more than 20 hours to send all alerts.
Product video
- ÃÛ¶¹ÊÓƵ Commerce now enables the Save button and autocompletes fields when you enter an incomplete URL while adding a video (Admin Catalog > Products > Add Video). Previously, the Save button was disabled, and fields were not populated.
Return Merchandise Authorizations (RMA)
- The Admin Create Return Product grid now displays tax, including prices only for products that are configured to display tax with prices. Previously, ÃÛ¶¹ÊÓƵ Commerce did not check the configuration display settings on the
tax/calculation/price_includes_tax
flag.
Reviews
- The product list view now displays the correct starred rating for products.
- Reviews are now visible as expected when a shopper clicks Review on the storefront product page.
- The product star rating is now consistent across the Grid and List views on the storefront product list page. Previously, the same product could have different ratings in Grid and List view modes.
Rewards
- Reward Points Balance and Reward Points History now display the same balance. Expired points are now deducted correctly. Previously, the Reward Points Balance did not accurately reflect expired points.
- Expired reward points are now marked as Expired in the Reason section of the storefront Reward Points History grid.
Sales
- The performance of sales grid updates in asynchronous mode for tables with large data sets after upgrade to MariaDB 10.2.34 has been improved.
- ÃÛ¶¹ÊÓƵ Commerce now removes HTML tags as expected from the storefront Account > My Orders > View order page. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed HTML tags in the storefront customer order comment section.
- Automated test coverage to verify the existence of an index for
sales_shipment_grid.order_id
has been added.
POST V1/orders
calls now update extension attributes without error. Previously, an SQL syntax error occurred.
Search search-heading
- Layered Navigation options for price range now work as expected with custom price attributes. ÃÛ¶¹ÊÓƵ Commerce uses the configuration of the price navigation step when filtering custom price attributes. Previously, ÃÛ¶¹ÊÓƵ Commerce used the manual step configuration.
- The storefront now shows all sub-categories of the current category in layered navigation regardless of number of categories available in the catalog.
- Elasticsearch catalog searches are now diacritic-insensitive. Previously, searches for terms without an accent resulted in different results than searches on the same term with an accent.
- Search weight is now correctly set on SKU attributes that contain special characters.
category_name
has been added to the system-reserved product attribute codes. ÃÛ¶¹ÊÓƵ Commerce now shows an error if a user tries to create a product attribute with the attribute codecategory_name
. Previously, products were not listed in the expected category, and an Elasticsearch error was logged.
- Popular search terms now updated after each GraphQL search query.
- ÃÛ¶¹ÊÓƵ Commerce now adds correct price fields to the Elasticsearch price index mapping. Previously, incorrect price fields were added to the index with store ID instead of website ID.
Shipping
- Shipment email now includes the tracking number for the current shipment only. Previously, when an order included several shipments, each shipment’s email included the tracking numbers from all shipments related to the order.
- ÃÛ¶¹ÊÓƵ Commerce now updates the mini cart successfully when a shopper deletes a product from their cart while in multi-shipping mode, then switches to a single shipping address. Previously, product prices were not updated as expected.
- Import of table rates now works as expected when using the S3 storage adapter. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error:
File "https://[bucket].s3.eu-central-1.amazonaws.com/[prefix]/tmp/phpLjGmHf" not found
.
- You can now disable shipment update emails as expected from Stores > Configuration > Sales > Sales Emails.
- ÃÛ¶¹ÊÓƵ Commerce now displays free shipping cost (0) on Admin and storefront invoice page totals. Previously, when shipping was zero for an order, ÃÛ¶¹ÊÓƵ Commerce did not display the shipping amount in totals on the invoice page shipping total.
- Rate requests to online shipping carriers have been reduced from several requests to one. Package insurance and handling price per item/package are now calculated correctly. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed incorrect shipping rates for FedEx shipping methods.
- ÃÛ¶¹ÊÓƵ Commerce now displays UPS rates when creating shipping labels for shipping from Puerto Rico. Previously, ÃÛ¶¹ÊÓƵ Commerce did not display these UPS rates.
- The shipping street address is now cleared completely as expected after removal from the input box. Previously, the text box retained one or more characters after you deleted the address.
Staging
- Product scheduled update images and videos are now correctly saved. Previously, videos, URLs, titles, and descriptions were removed after creating a new scheduled update.
- ÃÛ¶¹ÊÓƵ Commerce now displays the Minimum Advertised Price attribute in the Schedule New Update form for the store views for which the attribute is enabled.
- ÃÛ¶¹ÊÓƵ Commerce now displays only one Images tab in the product Scheduled Update form as expected. Previously, ÃÛ¶¹ÊÓƵ Commerce duplicated this tab.
- Product stock status is now displayed correctly in Schedule Update previews. Previously, product status was displayed as out-of-stock when a previously disabled product was enabled during creation of the Schedule Update.
Store
- The Login as Customer feature now works as expected in deployments that contain multiple stores on different URLs. Previously, ÃÛ¶¹ÊÓƵ Commerce did not load the correct store, even when accessing the correct store domain.
Site Wide Analysis Tool
- Merchants can now access the Site Wide Analysis Tool as expected. Previously, broken key pairs prevented some merchants from accessing the tool.
Tax
- ÃÛ¶¹ÊÓƵ Commerce now correctly calculates the mini cart subtotal when a customer deletes an item after selecting shipping to multiple addresses.
- ÃÛ¶¹ÊÓƵ Commerce now shows the same tax rate on all checkout pages when the shopping cart contains only virtual products.
- Tier prices for configurable products now display accurate included and excluded tax values on the storefront. Previously, the same values were displayed for both included and excluded taxes.
Test
- WebAPI tests are now compatible with PHP 8.1.
- Integration tests are now compatible with PHP 8.1. ,
- Merchants can now test the shopper experience of the country in which the shopper is located, rather than the merchant’s location.
- Integration test memory consumption has been reduced, which improves test performance and reduces the time required for test completion.
- Added a test to verify custom date attribute format for storefront and Admin.
- Corrected errors with
StorefrontPOWorkflowVerifyApprovalFlowTabTest
.
- Functional tests have been stabilized for PHP 8.x compatibility. ,
- Fixed functional issues in WebAPI tests.
- Fixed errors that resulted in false positive static tests.
- Test coverage has been updated for
call_user_func_array
.
- The
Magento\GraphQl\CatalogGraphQl\ProductSearchTest
test no longer throws this error when run with AWS Elasticsearch:Magento\GraphQl\CatalogGraphQl\ProductSearchTest::testSearchSuggestions Failed asserting that an array is not empty. /var/www/html/dev/tests/api-functional/testsuite/Magento/GraphQl/CatalogGraphQl/ProductSearchTest.php:94 /var/www/html/dev/tests/api-functional/framework/Magento/TestFramework/TestCase/GraphQlAbstract.php:257
.
-
Fixed numerous non-critical unit test warnings by renaming all mock variables to include the
Mock
suffix and removing references to a deprecated Object Manager class. -
The
Magento\Framework\MessageQueue\TopologyTest
test is now compatible with the AWS MQ for RabbitMQ service. Previously, this test failed with this message:Invalid exchange configuration: magento-topic-based-exchange1 Failed asserting that two arrays are equal
.
- Unit tests are now compatible with PHP 8.1.
Unit tests
The following unit tests have been refactored to use PHPUnit
instead of AspectMock
:
AllureHelperTest
ObjectHandlerUtil
MockModuleResolverBuilder
MagentoTestCase
ModuleResolverTest
ParallelGroupSorterTest
SuiteGeneratorTest
OperationDataArrayResolverTest
Theme
- Notification messages are now displayed correctly when ÃÛ¶¹ÊÓƵ Commerce has a subpath configured in its base URL.
- Added an
aria-label
element to the storefront page template to indicate the page to which the shopper will navigate to when clicking a link. Previously, the same link text was used for links to different pages.
- ÃÛ¶¹ÊÓƵ Commerce no longer displays an error message when loading the homepage of a store with pre-existing custom theme. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this message:
The store will not work correctly in the case when cookies are disabled
.
Translations and locales
- The
UserExpiration
validator no longer fails withde_DE
anduk_UA
locales. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an error when an administrator tried to set an expiration date when creating a new user from the Admin with locales set tode_DE
oruk_UA
.
- Swiss region names are now consistently presented in English in the create or edit address forms.
- Updated
zip_codes.xml
patterns for Guernsey to support GY10 postcodes for the Island of Sark.
- Added Belarus regions to the
directory_country_region
table.
- Display anomalies with storefronts running the Filipino (Philippines) locales have been resolved.
- You can now successfully enter a customer date of birth when creating a new account in stores set to a Portuguese(Portugal) locale. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an error when you tried to create an account.
- The product detail page is now successfully displayed with the Arabic (Saudi Arabia) locale. Previously, this locale broke the product detail page.
UI
- Corrected errors with MFTF tests that use
maps.googleapis.com
.
- ÃÛ¶¹ÊÓƵ Commerce now trims the non-breaking space characters from the Contact Us form email input field. Previously, the form was submitted without removing the non-breaking space characters from the email input (if given), which caused errors in the log files. The Reply-To field was also missing from the generated contact email message to the store administrator.
- ÃÛ¶¹ÊÓƵ Commerce now displays related products, up-sell products, and cross-sell products according to their positions in the Admin.
.action-close
buttons now work as expected whenMultiselect
is used in a modal. Previously, theaction-close
button did not work because it inherited the CSS of the.action-close
button of the modal.
- The Offers rich snippet is now present on the main price field in Product view. Previously, this snippet was missing from this field in related products block in Product view, which resulted in Google search results displaying incorrect prices.
- Problems with modal height on devices running iOS have been resolved.
- Actions dropdown menus are now positioned correctly throughout the storefront.
- Accessibility errors with navigation on the cart and checkout pages have been resolved.
- Screen readers can now read all relevant form elements on product pages.
- Storefront catalog product widget sort order (Catalog > Category > Products) now matches the order configured in the Admin.
- The region selector now works as expected on the Create an Account page.
- The Admin customer grid now displays all customer data, including newly added
date
custom attributes, as expected. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an error and did not display the Admin customer grid correctly when thedate
attribute set was set as a column.
- Input labels on the Catalog > Product details page have been changed to accurately reflect the purpose of the input. Fields for which user input is not required no longer display labels with an asterisk.
- The rich text editor toolbar can now be accessed using the Tab key.
- The accessible name of the control now includes the text of its visible label for the number of items per page dropdown.
- The table controls on the Catalog > Product details page now have visible labels and an accessible name when the table is collapsed.
- Buttons throughout the storefront now have unique, descriptive accessible names. Previously, split buttons with a text button and an adjacent down arrow icon button had the same accessible name.
- Added a Today view option to the Admin Orders and Amounts dashboard charts to provide a summary of sales and orders throughout the day.
- The active (click) state of the multi-select Close button now works consistently.
- ÃÛ¶¹ÊÓƵ Commerce no longer displays this message after upgrade when Cookie Restriction Mode is disabled:
The store will not work correctly in the case when cookies are disabled
.
- Full-screen product images are now correctly displayed on themes with vertical thumbnail navigation direction on mobile devices. Previously, product images were incorrectly scaled or invisible on themes with vertical thumbnail navigation direction on mobile devices in full-screen mode.
- Error messages in the product details page no longer disappear quickly when the Synchronize widget products with backend storage configuration setting is enabled.
- Validation for negative values has been added to the Quantity To Return field on the Create New Return form.
- ÃÛ¶¹ÊÓƵ Commerce no longer displays duplicate addresses when a shopper clicks Change Address on the Review and Payments page in a deployment in which the Address Search configuration setting is enabled.
- The Add Products button is now enabled as expected for administrators with restricted permissions while while working in store-view scope on the Admin Category page.
- View breakpoints are now consistent across ÃÛ¶¹ÊÓƵ Commerce.
- ÃÛ¶¹ÊÓƵ Commerce now correctly displays custom customer date attributes with custom locales on the Admin customer page.
- Images added using Page Builder are no longer duplicated on the storefront when displayed with a browser window width of 768px. Previously, with this browser window width, ÃÛ¶¹ÊÓƵ Commerce duplicated images on the storefront by displaying both the mobile and desktop version of images.
URL rewrites
- URL rewrites are no longer re-generated for all store views during the creation of a new store view when executing
bin/magento setup:upgrade
.
Visual Merchandiser
- The Visual Merchandiser Move out of stock to bottom automatic sorting option now works as expected for configurable products when all simple products are out of stock.
- The Visual Merchandiser rule is no longer saved when no conditions have been added.
Web API framework
- Web API requests for self-authorized customer resources no longer throw authorization errors when persistent shopping cart is enabled.
- You can now create objects using the child classes of
\Magento\Framework\Api\AbstractSimpleObjectBuilder
on PHP 7.3. Previously,preg_match
threw this warning message when ÃÛ¶¹ÊÓƵ Commerce was hosted on Redhat with PHP 7.3:Warning: preg_match(): Compilation failed: unrecognized character follows...
.
- The totals retrieved by the
PUT /V1/guest-carts/:cartId/collect-totals
request are now updated by the correctshippingMethod
.
- Adding a new deserializer to the REST API no longer removes other deserializers. Previously, the REST API accepted a new content type, but CORE defined content types for APIs no longer worked and returned a 400 error.
- You can now remove an override for a parameter that is defined in a
webapi.xml
file.
- ÃÛ¶¹ÊÓƵ Commerce now generates a
customertoken
by GraphQL or REST API requests as expected after multiple consecutive failed login attempts. Previously, ÃÛ¶¹ÊÓƵ Commerce did not check whether the value oflock_expires_at
inoauth_token_request_log
was greater than the current date and time, and always returned the number of failed attempts, which prevented the customer from ever logging in.
- Adding a masked quote ID to
QuoteRepository::getList
no longer causes an infinite loop. Previously, using the payment processor that relied on the REST API to update orders triggered this behavior.
- The
/rest/all/V1/categories/<above_created_category_id>
PUT call now respects the values specified byavailable_sort_by
. Previously, the Available Product Listing Sort By drop down was selected with all possible options on the Category page, and the Use All checkbox was selected.
- The performance of REST API requests to create customer tokens has been improved.
- Corrected an error that occurred when Add Store Code to Urls is set to Yes and a REST call did not include a store code. Although the payload was valid, the call returned the following error:
Fatal error: Allowed memory size of bytes exhausted (tried to allocate **** bytes) in vendor/magento/module-store/Model/StoreRepository.php on line 75
.
- Partial invoices for the same order can now be created simultaneously using the REST API.
Wish list
- ÃÛ¶¹ÊÓƵ Commerce no longer renders a wish list in the category sidebar when the Show In Sidebar wish list option is disabled. Previously, ÃÛ¶¹ÊÓƵ Commerce ignored this option.
WYSIWYG
- PageBuilder now correctly renders custom widgets with the WYSIWYG editor.
Known issues
Issue: Merchants may notice package version downgrade notices during upgrade from ÃÛ¶¹ÊÓƵ Commerce 2.4.4 to ÃÛ¶¹ÊÓƵ Commerce 2.4.4-p1. These messages can be ignored. The discrepancy in package versions results from anomalies during package generation. No product functionality has been affected. See the Knowledge Base article for a discussion of affected scenarios and workarounds.
Issue: Merchants cannot submit partial refunds for orders paid with Apple Pay through Braintree. When a merchant tries to create a credit memo for a partial refund from the order invoice, the Qty to Refund field is not editable. Workaround: Apply patch braintree-disabled-partial-capture-for-applepay-googlepay.patch
. See the Knowledge Base article.
Issue: Shoppers cannot add a product to their cart when no options are selected in Admin Store > Configuration > General > Country Options > Allow Countries. ÃÛ¶¹ÊÓƵ Commerce instead displays this following console error: Failed to load resource: the server responded with a status of 400 (Bad Request)
.
Issue: The description of Dotdigital on Find Partners and Extensions > Magento Marketplace is outdated. Here is an updated description:
Dotdigital is a customer engagement platform that helps digital marketers and developers deliver communications across the customer journey. We harness the power of customer data, powering engagement, conversion, and loyalty for brands as they grow and scale. Customers love our easy-to-use platform that connects first party data across the systems, surfacing powerful insights and automating predictive cross-channel messages.
Dotdigital’s 350+ employees serve mid-market and enterprise companies around the world and across industries. We aspire to inspire responsible marketing and are committed to sustainability, privacy, and security. Dotdigital is proud to be the world’s first carbon-neutral marketing automation platform, certified for ISO 14001, ISO 27701, and ISO 27001.
See for purchase and download information.
Community contributions
We are grateful to the wider Magento Open Source community and would like to acknowledge their contributions to this release.
The Community Engineering team maintains a list of top contributing individuals and partners by month, quarter, and year. From that Contributors page, you can follow links to their merged PRs on GitHub.
Partner contributions
The following table highlights contributions made by Partners. This table lists the Partner who contributed the pull request, the external pull request number, and the GitHub issue number associated with it (if available).
Individual contributor contributions
The following table identifies contributions from our community members. This table lists the community member who contributed the pull request, the external pull request number, and the GitHub issue number associated with it (if available).
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.4 using Composer.
Migration tool kits
The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. Consider exploring or contributing to the .
The helps transfer existing Magento 1.x store extensions and customizations to Magento 2.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts.