Magento Open Source 2.4.0 Release Notes
Magento Commerce 2.4.0 introduces support for PHP 7.4, Elasticsearch 7.6.x, and MySQL 8.0. Substantial security changes include the enablement of two-factor authentication in the Admin by default.
With this release, the Authorize.Net, Braintree, eWay, CyberSource, and Worldpay payment method integrations have been removed from core code. Merchants should migrate to the official extensions that are available on the Magento Marketplace.
This release includes all the improvements to core quality that were included in Magento 2.3.5-p1, over 100 new fixes to core code, and 30 security enhancements. It includes the resolution of 226 GitHub issues by our community members. These community contributions range from minor clean-up of core code to significant enhancements in Inventory Management and GraphQL.
Quarterly releases may contain backward-incompatible changes (BIC). Magento 2.4.0 contains minor backward-incompatible changes. To review minor backward-incompatible changes, see BIC reference. (Major backward-incompatible issues are described in BIC highlights. Not all releases introduce major BICs.)
The package names of security-only releases are typically appended with -p1. However, we could not avoid deviating from these naming conventions with Magento 2.3.5, which in turn has had a temporary ripple effect on the subsequent security package names. Specifically, the full-feature Magento 2.3.5 release is Magento 2.3.5-p1. The security-only release that we will release when Magento 2.4.0 GAs will be Magento 2.3.5-p2. We hope to return to the usual naming conventions in future releases.
Security-only patch available
Merchants can now install time-sensitive security fixes without applying the hundreds of functional fixes and enhancements that a full quarterly release (for example, Magento 2.3.5-p2) provides. Patch 2.3.5.2 (Composer package 2.3.4-p2) is a security-only patch that provides fixes for vulnerabilities that have been identified in our previous quarterly release, Magento 2.3.5-p1. All hot fixes that were applied to the 2.3.5 release are included in this security-only patch. (A hot fix provides a fix to a released version of Magento that addresses a specific problem or bug.)
For general information about security-only patches, see the Magento DevBlog post Introducing the New Security-only Patch Release. For instructions on downloading and applying security-only patches (including patch 2.3.4-p2), see Install Magento using Composer. Security-only patches include security bug fixes only, not the additional security enhancements that are included in the full patch.
Other release information
Although code for these features is bundled with quarterly releases of the Magento core code, several of these projects (for example, Inventory Management 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.
Highlights
Look for the following highlights in this release:
Substantial security enhancements
This release includes over 30 security fixes and platform security improvements.
Over 30 security enhancements that help close remote code execution (RCE) and cross-site scripting (XSS) vulnerabilities
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, two-factor authentication, use of a VPN, the use of a unique location rather than /admin
, and good password hygiene. See Security updates available for Magento for a discussion of these fixed issues.
Additional security enhancements include:
This release includes over 30 security fixes and platform security improvements. Additional security enhancements include:
-
Two-factor authentication (2FA) is now enabled by default for the Magento Admin. Admin users must first configure their 2FA before logging into the Admin through either the UI or a web API. 2FA is enabled by default and cannot be disabled. This extra step of authentication makes it harder for malicious users to log in to the Admin without authorization. Additional implementations of 2FA are scheduled for release with Magento 2.4.0 General Availability, which is scheduled for late July. See Two-factor Authentication (2FA).
-
Template filter strict mode is now enabled by default. Magento components (including CMS pages and blocks) that use the template filter in legacy mode can be vulnerable to remote code execution (RCE). Enabling strict mode by default ensures that RCE attacks cannot be deliberately enabled.
-
Data rendering for UI data providers is now disabled by default. This removes an opportunity for malicious users to execute arbitrary JavaScript.
-
Content Security Policy (CSP) improvements.
SecureHtmlRenderer
has been added to the Magento Framework and is available in.phtml
templates to support the allowlisting of inlinestyle
andscript
tags. Inline scripts and styles are not typically permitted with the default CSP configuration. Although most core template files have been updated, some pages may display CSP violations. See Content Security Policies.
Starting with the release of Magento Commerce 2.3.2, Magento will assign and publish indexed Common Vulnerabilities and Exposures (CVE) numbers with each security bug reported to us by external parties. This allows users of Magento Commerce to more easily identify unaddressed vulnerabilities in their deployment. You can learn more about CVE identifiers at CVE.
Platform upgrades
The following platform upgrades help enhance website security and performance. Supported versions of PHP and PHPUnit, Elasticsearch, MySQL, and other dependencies are listed in Magento 2.4 technology stack requirements.
-
PHP 7.4 support introduced and PHP 7.1 and 7.2 deprecated. Magento 2.4.0 introduces support for PHP 7.4.
-
Support for PHPUnit 9.x and deprecation of PHPUnit 6.5. PHP 7.4 requires the use of the latest PHPUnit testing framework, which is PHPUnit 9.x. Magento Marketplace extension vendors must confirm that all new extension versions are compatible with PHP 7.4 and that all unit and integration tests have been configured to be run with PHPUnit 9.
-
Elasticsearch 7.6.x support. Elasticsearch 7.6.x is now the default catalog search engine for Magento Commerce and Open Source. You cannot install or upgrade to Magento 2.4.0 without also installing Elasticsearch 7.6.x. Elasticsearch version 2.x code has been removed. Elasticsearch versions 5.x and 6.x have been deprecated and are no longer supported. See Elasticsearch.
-
MySQL 8.0 support. Magento 2.4.x supports MySQL 8.x. (Magento 2.4.0 was tested with MySQL 8.0.20.) Merchants are encouraged to migrate their deployments to MySQL 8.x to take advantage of its improved performance, security, and reliability. Although MySQL 5.7 is still supported for Magento 2.4.x, MySQL 5.6 is no longer supported. You cannot host Magento 2.4.x with a MySQL 5.6 database. See MySQL.
-
Removal of the MySQL catalog search engine. The MySQL search engine has been removed from Magento 2.4.0 and replaced as the default search engine with Elasticsearch. Elasticsearch provides superior search capabilities as well as catalog performance optimizations. All merchants must have Elasticsearch to install and deploy Magento 2.4.0. See Check the catalog search engine.
-
MariaDB 10.4 support. Support for MySQL 8.0 provides the opportunity for merchants to deploy MariaDB 10.4 with Magento. Although merchants can still use MariaDB 10.2 with Magento 2.4.0, we recommend upgrading to MariaDB 10.4 for improved performance and reliability. MariaDB 10.0 and 10.1 are no longer supported (as a result of removing support for MySQL 5.6 in this release).
-
Migration of dependencies on Zend Framework to the Laminas project to reflect the transitioning of Zend Framework to the Linux Foundation’s Laminas Project. Zend Framework has been deprecated. See the Migration of Zend Framework to the Laminas Project DevBlog post.
-
Removal of the core integration of the Signifyd fraud protection code. This core feature is no longer supported. Merchants should migrate to the Signifyd Fraud & Chargeback Protection extension that is available on the Magento Marketplace.
-
The core Braintree module has been removed from the code base. The Braintree Payments module now provides the same feature set. See Braintree Payments.
Infrastructure improvements
This release contains enhancements to core quality, which improve the quality of the Framework and these modules: Customer Account, Catalog, CMS, Import, Cart and Checkout, and B2B.
-
Removal of core integration of third-party payment methods. With this release, the Authorize.Net, Braintree, eWay, CyberSource, and Worldpay payment method integrations have been removed from core code. Merchants should migrate to the official extensions that are available on the Magento Marketplace. See the Deprecation of Magento core payment integrations devblog post.
-
Support for partial-word search for Elasticsearch (new default search engine). Elasticsearch now supports the use of partial words in search terms for product names and SKUs when using quick search. This capability was supported by the MySQL search engine, which has been deprecated and replaced by Elasticsearch in this release.
-
PayPal JavaScript SDK upgrade. We’ve migrated the PayPal Express Checkout integration to the latest PayPal JavaScript SDK, an SDK that automatically collects and passes needed risk parameters to PayPal. The behavior of the PayPal Express Checkout payment method remains unchanged. However, upgrading this SDK to the latest version let merchants access the latest features and security enhancements.
-
Deprecation and removal of the Web Set Up Wizard. You must use the command line to install or upgrade Magento 2.4.0. See Install Magento.
-
Composer update plugin. Composer plugin streamlines the upgrade process by resolving changes that must be made to the root project
composer.json
file before updating to a new Magento product requirement. This plug-in protects against overwriting customizations. See Upgrade using the Magento composer root plugin.
Performance improvements
-
Improvements to customer data section invalidation logic. This release introduces a new way of invalidating all customer sections data that avoids a known issue with local storage when custom
sections.xml
invalidations are active. (Previously, private content (local storage) was not correctly populated when you had a custom etc/frontend/sections.xml with action invalidations.) See Private content. -
Multiple optimizations to Redis performance. The enhancements minimize the number of queries to Redis that are performed on each Magento request. These optimizations include:
-
Decrease in the size of network data transfers between Redis and Magento
-
Reduction in Redis’ consumption of CPU cycles by improving the adapter’s ability to automatically determine what needs to be loaded
-
Reduction in race conditions on Redis write operations
See Use Redis for the Magento page and default cache and Configure caching.
-
-
Improved caching of results of SQL queries to inventory tables. These enhancements include:
-
Caching of SQL queries to the
inventory_stock_sales_channel
table (1 query instead of 16) -
Caching of result of queries to the
inventory_stock
table (1 query instead of 16)
-
-
Improvement of up to 25-30% to Quick Order add-to-cart performance.
-
Merchants can now use lazy loading to load images. See Configure theme properties.
Adobe Stock Integration v2.0
Ability to license stock image previews from the Media Gallery. Merchants can now find any Adobe Stock preview image in the Media Gallery, which reduces the number of steps required to license stock preview image.
New Media Gallery
This replacement for the former Media Gallery offers a new, searchable interface for Magento media assets. Administrators can now search, filter, and sort images up to 30x faster than they could in the earlier version of this feature. Merchants can use this tool to evaluate storefront image usage. Extension developers should be aware that extensions that were developed for the Media Gallery will not work as expected with the new Media Gallery.
Inventory Management
Inventory Management enhancements for this release include support for in-store pickup and bundle product support. See Inventory Management release notes for a more detailed discussion of recent Inventory Management bug fixes.
GraphQL
GraphQL enhancements include:
pickupLocations
query supports the Inventory In-store pickup featurecategories
query returns a list of categories that match a specified filter. This query differs from thecategoryList
query in that it supports pagination.reorderItems
mutation allows a logged-in user to add all the products from a previous order into their cart.
See the GraphQL Developer Guide for details on this and other enhancements. See Release notes for a detailed discussion of recent GraphQL bug fixes.
PWA Studio
See Magento compatibility for a list of PWA Studio versions and their compatible Magento core versions. For information about enhancements and bug fixes, see PWA Studio releases.
Magento Functional Testing Framework (MFTF)
MFTF v3.0.0 includes these new features and includes support for PHP 7.4 and PHPUnit 9:
- MFTF helpers, which can create custom actions outside of the test framework
- schema updates for test entities
- sub-folders in test modules
- nested assertion syntax
- static check that checks and reports references to deprecated test entities
This release also removes deprecated actions and upgrades scripts that were added to upgrade tests to MFTF major version requirements.
Vendor-developed extension enhancements
This release of Magento includes extensions developed by third-party vendors. It introduces both quality and UX improvements to these extensions and an expansion of MFTF coverage.
Magento Marketplace extension vendors should confirm that their extensions are compatible with PHP 7.4 when publishing a new version of their extension for Magento 2.4.0.
dotdigital
This release includes these enhancements:
- Customer attribute values that are captured by any input type (for example, dropdown, multi-select) are now correctly synced as data fields.
- Cart insight data is now sent for all active quotes, even if they contain no items. This allows merchants to exit contacts from a program if they empty their cart.
- Merchants can now sync website name, store name, and store view name by individual data fields.
- Wishlist, Review, and Order syncs now look up the transactional data sync limit once only.
- Logging output from the Client class has been improved and is now consistent across all methods in the API wrapper.
- Configurable products now have a stock figure that is the sum of their child products.
- A new plugin detects stock updates that are performed by third-party code (outside the Magento Admin).
Amazon Pay
This release includes:
- Updates to CSP allowlists
- Ability to do multiple authorizations for a multi-item order
- Support for Japanese addresses
Braintree Payments
This extension replaces our core Braintree integration. It provides the same features as the Braintree core integration. See Braintree Payments.
Klarna
This release includes new on-site messaging options to help shoppers understand the available credit and financing options. It also includes improvements to:
- refunds
- API efficiency
- cookies and unit tests
- discounts
Vertex
This release of Vertex includes the following new feature and enhancements:
- Improvements to the Admin configuration user experience
- Replacement of installation and upgrade scripts with XML schema files and patches
- Removal of deprecated code (
ApiClient
andClientInterface
)
Yotpo
Yotpo Ratings and Reviews are integrated with Page Builder.
Fixed issues
We have fixed hundreds of issues in the Magento 2.4.0 core code.
Installation, upgrade, deployment
- You can now successfully remove a website along with the website’s scope-specific configuration settings in
app/etc/config.php
as expected. Previously, when you tried to remove the website, the operation failed, and Magento displayed this error:The website with code xxx that was requested wasn't found. Verify the website and try again
. Additionally, Magento displayed this error on the storefront:Config files have changed. Run app:config:import or setup:upgrade command to synchronize configuration
. GitHub-24061
- Configuration settings that are disabled in
index.php
are no longer editable from the Admin.
- Magento installation now completes successfully, and stores are created as expected, when store configuration is pre-defined in
config.php
.
\Magento\Store\App\Config\Source\RuntimeConfigSource::getEntities
has been refactored to decrease the number ofSHOW TABLE STATUS
queries it makes. (This change reverts to the behavior this function displayed in Magento 2.3.3.)
- Data scripts are no longer re-run whenever you attempt to upgrade the database by running
bin/magento setup:upgrade
. Previously, upgrade scripts were re-run unnecessarily, which affected performance. GitHub-19469
-
Magento now displays the following behaviors when your connection to Redis is interrupted. Previously, Magento did not reload the current page and displayed this error: An error has happened during application run. See exception log for details.
- Admin and storefront sessions expire
- Admin and storefront users must log in again
- Session data is saved to
var/session/
- No error or exceptions are logged.
- Composer dependencies have been updated to implement Redis key expiry, which has improved Redis performance. Fix submitted by toxix in pull request 25488. GitHub-25487
Adobe Stock Integration
- CSS styles have been added to the Adobe Stock image display to support highlighting the selected image. Fix submitted by Serhiy Zhovnir in pull request 25864. GitHub-761
Backend
- Email templates (Admin > Marketing > Communications > Email Templates) can now be previewed from the Admin when JavaScript minification is enabled. Previously, when you tried to preview an email template, the Email Preview popup window was empty. GitHub-25068
-
Administrators can now log into the Admin as expected after an admin account with limited privileges has been created. Previously, the Admin was not accessible. Instead, users were redirected to the storefront with a 404 error. Fix submitted by Eden Duong in pull request 25909. GitHub-25881
-
Magento no longer throws an error when you delete an image from a page while creating it from Admin > Content > Pages > Add New Page. Previously, Magento threw this error in the developer console:
"500 (Internal Server Error)”
. Fix submitted by Eden Duong in pull request 25924. GitHub-25893
Bundle products
- The performance of the
catalog_product_price
re-index operation for bundle products has been improved.
- Administrators can no longer manually enter a tax class in the Admin for a bundle product when the bundle product’s Tax Class and Dynamic Price settings are disabled for the default store view. Previously, when an administrator unchecked the Use Default Value option next to Tax Class, Magento enabled the option, permitting an administrator to enter another value and save the product.
- Bundle product prices are now calculated correctly on product pages.
- You can now add any number of bundle products to your shopping cart without error. Previously, when you added a bundle product to your cart, then navigated to the cart, Magento displayed this error:
Please correct the quantity for some products
.
- Magento now applies Cart Price Rules to only the bundle product child products that match the rule criteria. Previously, Magento applied the Cart Price Rule to all child products that belonged to the bundle product.
Cache
health_check.php
no longer fails if a database cache engine is configured in your Magento deployment. Fix submitted by Andrii Beziazychnyi in pull request 25722. GitHub-25669
Cart and checkout
- Magento no longer throws an error during checkout when the Synchronize with Backend configuration setting is enabled. GitHub-23833
- Radio buttons for shipping methods are now enabled as expected in the checkout workflow.
- The order review page in the checkout workflow now loads successfully for an order being shipped to multiple addresses when Terms and conditions with the Applied Manually setting is enabled. Previously, the Review page did not pass validation, and Magento displayed a 404 error.
- Magento now displays the waiting/spinning icon while prices are updated on the cart.
- Magento now displays an informative message when a product in the mini cart becomes out-of-stock before checkout. Once you’ve removed the out-of-stock item, Magento displays the Proceed to Checkout button. Previously, Magento did not display this button.
- Magento now displays an informative error message when you try to add a product by clicking Order by SKU when the file for upload is corrupt. Previously, Magento displayed a blank page.
- The promotion region of the mini cart is now rendered as expected. Fix submitted by Matti Vapa in pull request 25375. GitHub-25373
Cart Price Rule
- Cart Price Rules that are based on payment methods are now applied during the checkout workflow. GitHub-24206
- Corrected the behavior of the Datepicker page element on Admin > Marketing > Promotions > Catalog Price Rule. Fix submitted by Hitesh in pull request 26290. GitHub-26289
Catalog
- Magento now disables the ability of a restricted administrator to change a product’s quantity attribute and disables advanced inventory as expected. Previously, only the visual display of the quantity attribute was affected, and Magento changed the quantity value in the database after the product was saved.
- Magento no longer throws an error when you change the name of a tiered product that is included in a scheduled update. Previously, when you tried to save the product with a new name, Magento displayed this error:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3-0-0-2.0000-0' for key 'UNQ_EBC6A54F44DFA66FA9024CAD97FED6C7', query was: INSERT INTO catalog_product_entity_tier_price (all_groups, customer_group_id, qty, value, website_id, percentage_value, row_id) VALUES (?, ?, ?, ?, ?, ?, ?)
- Custom attribute values can now be saved as expected from the Admin.
- The Recently View Products feature now shows products associated only with the current store view in multi-store deployments when Stores > Configurations > Catalog > Recently Viewed/Compared Products > Show for Current is set to store view. Previously, Magento displayed recently viewed products from all websites, no matter which website the product was assigned to.
- Magento now displays product images in the mini cart without distortion. Previously, Magento stretched the image in the mini cart to fill the entire width and height of the image container.
- The
getBasePrice
function now returns a float value as expected rather than a string.
- The product compare feature now works as expected. It displays only products in the current user’s compare list.
- You can now assign a default watermark to a theme. Previously, after assigning the watermark, Magento threw a fatal error.
- You can now successfully edit a configurable product with many variants (approximately 5,000) from the Admin. Previously, when you tried to edit a configurable product with many subproducts, Magento displayed this error:
Warning: DOMDocumentFragment::appendXML(): Entity: line 1: parser error : CData section too big found in /vendor/magento/framework/View/TemplateEngine/Xhtml/Template.php on line 60
- Sorting on attribute sets on Admin > Catalog > Products is now based on alphabetical order as expected.
- The Recently Viewed Products feature now works as expected in multi-store deployments.
- Administrators with restricted permissions to Catalog can now create a downloadable product. Previously, administrators could not create a downloadable product, and Magento threw an error.
- The Product in Websites checkbox of the new product page is now enabled by default for restricted administrators in multi-site deployments. Previously, the checkbox for the non-default website was not preselected, and if the administrator left the checkbox unselected, Magento displayed an error message.
addToCart
events are now tracked as expected in the data layer. Previously, after changing the configurable options for a product, then clicking Add to cart, the newaddToCart
event was not added to the data layer.
- The mini cart and Admin shopping cart (Admin > Customers > Manage Shopping Cart) now display correct product prices when a Catalog Price Rule is applied. Previously, the storefront shopping cart displayed the correct product price, but the mini cart and Admin shopping cart displayed the original product price.
- The Recently Viewed Products widget now works correctly when Stores > Configuration > Catalog > Catalog > Recently Viewed/Compared > Synchronize widget products with backend storage is set to Yes.
- Filtering on the Admin product grid website column now works as expected. Previously, filter results did not display the correct number of products, but consistently displayed the total number of products as 1.
- The Admin catalog and product lists now display currency symbols in the MSRP, Cost, and Special Price columns. Fix submitted by Sergiy Vasiutynskyi in pull request 27261. GitHub-21910, GitHub-20906, GitHub-20472
- The sample description that is provided for a newly product’s description and title no longer contains double quotation marks. Fix submitted by Nathan Morgan in pull request 25655. GitHub-25654
- Corrected the return type to
string|null
for thegetSourceModel
method in theEav\Attribute.php
class. Fix submitted by Mychailo in pull request 25333. GitHub-25278
- Saving a new (duplicated) product no longer results in the duplication of the product’s images hundreds of times. Fix submitted by Jeroen in pull request 25875. GitHub-9466
- Magento no longer throws a JavaScript error when you delete a product with a custom option of type
file
during creation of an order from the Admin. Fix submitted by adrian-martinez-interactiv4 in pull request 24843. GitHub-24842
- Creating a product with no image by using
product_page_image_large
in your layout results in a placeholder image being displayed as expected. Previously, Magento threw this error:Fatal error: PHP Fatal error: Uncaught TypeError: Argument 1 passed to Magento\Catalog\Block\Product\ImageFactory::getRatio() must be of the type integer, null given
. Fix submitted by Lukasz Bajsarowicz in pull request 26974. GitHub-26973
- You can use the
POST /V1/:sku/links
endpoint to set product links with an empty array of products when the product has existing links. Previously, Magento threw an error. Fix submitted by Sathish Subramanian in pull request 26979. GitHub-26800
- Magento now provides This item has weight and This item has no weight options in the Actions drop-down menu that is accessible when you update a product’s attributes. Fix submitted by Bartomiej Szubert in pull request 26075. GitHub-6310
Catalog widget
- The
CatalogWidget
products list now works as expected with anchor categories, and products from anchor categories are now matched and displayed. Previously, when you selected a parent category that was an anchor, but that did not contain assigned products, products were not visible in the widget.
- Magento now displays all children of a selected parent category as expected. Previously, if you selected a parent category that is an anchor, but which did not have assigned products by itself, Magento did not display all nested products.
- The Add for Customer Group Price pop-up window (Admin > Catalog > Products > New Product > Advanced pricing) now closes as expected when you click the close icon. Fix submitted by Ashna-Jahan in pull request 25759. GitHub-25433
Cleanup
- Removed an extra closing tag from module XML. Fix submitted by Tejash Kumbhare in pull request 26339. GitHub-26338
- Corrected misalignment of the calendar icon on the Add Design Change page. Fix submitted by Eduard Chitoraga in pull request 26063. GitHub-20379
- Corrected misalignment of the tax rate zip/post code range and checkbox on the Add New Tax Rate/Zip Code page (Admin > Store > Taxes > Tax Zones and Rates). Fix submitted by Sathish Subramanian in pull request 26932. GitHub-26917
- Sorting has been disabled on the status column of the Cache Management grid in the Admin. Fix submitted by Sathish Subramanian in pull request 26215. GitHub-26208
- Corrected misalignment of page elements on the Admin Stores > Attributes > Ratings > Add new ratings dialog. Fix submitted by Sathish Subramanian in pull request 27014. GitHub-26992
- Removed unnecessary space in submenu display on the home page hover menu. Fix submitted by Hitesh in pull request 25973. GitHub-25972
- Corrected misalignment of the price labels on the storefront product details page. Fix submitted by divyajyothi5321 in pull request 26237. GitHub-25936
- Corrected misalignment of the out-of-stock text in relation to the Add to cart button on the product list page in mobile view. Fix submitted by divyajyothi5321 in pull request 26183. GitHub-26181
CMS content
- You can now save and duplicate all CMS pages. Previously, Magento threw this exception when you tried to duplicate certain pages:
Unique constraint violation found
.
- Magento now lets you create CMS blocks with identical names if the blocks are assigned to different store views.
- Select from Gallery image thumbnails are now cached as expected. Previously, these images were resized on the fly.
- Magento no longer throws an error when you save a CMS page that has been assigned to multiple stores. Previously, when you created or edited a CMS page, Magento saved the page but also threw this error:
Item (Magento\VersionsCms\Model\Hierarchy\Node) with the same ID "PAGE_ID" already exists
.
- New CMS pages were not being added to a website’s store page hierarchy.
Cookies
- The
setRedirectCookie
andclearRedirectCookie
functions now work as expected. Previously, these functions sent cookies to the browser, but all cookie parameters were missing. GitHub-24547
- Google Tag Manager tags are no longer triggered when a customer navigates to a new store without accepting the Google Tag Manager cookie.
Configurable products
- Child products of a configurable product can now be successfully disabled through the API.
- Cart Price rules with a condition set as Category (Parent only) now work as expected consistently.
- You can now add a configurable product to the cart from the Cross-Sells tab. When you select a product and click Add to Cart from this tab, you are now taken to the product’s details page, where you can select specific product options. Previously, Magento redirected you to a 404 error page.
- Magento no longer links a simple product to a configurable product when the API call to link these products fails.
- Corrected the rendering of SKUs in the Current Variations list for a configurable product. Fix submitted by KaushikChavda in pull request 26007. GitHub-25591
Custom customer attributes
- Magento now displays custom customer address attribute values as expected in the address section of the checkout workflow. Previously, Magento displayed the custom customer address attribute code instead of the value, and a JavaScript error was triggered.
- Magento no longer throws an error when you include an empty customer attribute field in the Forms to Use In field while creating a Company account on the storefront. Previously, Magento threw this error:
PHP Fatal error: Uncaught TypeError: Argument 2 passed to Magento\Eav\Model\Attribute\Data\Text::validateLength() must be of the type string, null given
.
- Magento now saves custom customer address attributes and implements them in registration forms as expected. Previously, when you created a new custom customer address attribute while creating an account from the cart, Magento did not save the attribute information.
Customer
- Customers who are subscribed to newsletters as a guest are no longer unsubscribed after registering for a new account.
- Magento now uses a new PHPSession for each change of password.
- You can now successfully create a customer and associate it with a particular website using the Associate to Website dropdown menu on Customers > All Customers > Add new Customer. Previously, when you tried to associate a new customer with the non-default website in a multi-site deployment, Magento displayed this error:
The store view is not in the associated website
.
- Magento now saves the information a customer enters in the default billing and shipping fields during checkout when the transaction is initially declined due to an invalid credit card but later completed successfully. Previously, although Magento created the order when the customer entered valid payment information, it did not update the default billing or shipping addresses in the My Account section of the checkout workflow.
- Magento now honors the customer group settings when you create a new customer from the Admin in a multi-site deployment.
- Magento now successfully imports customer data using the Customer and Addresses (single file) option when
cron
is enabled and the Customer Grid Indexer is set to Update By Schedule. Aftercron
executes, the imported customer information is available in the Admin as expected. Previously, Magento imported the customer data, but did not update the customer grid with the newly imported customer records.
- You can now create a new customer from the storefront when the date of birth is required. Previously, you could not create a new customer when this field was required, even when you entered valid DOB values. GitHub-26700
- Customer creation from the Admin now honors the default customer group setting as expected.
- The
PHPSessionId
is now changed as expected after a customer logs out and then logs back in.
- The Admin view of a customer cart now displays all the products that were added to the cart from multiple websites in a multi-website deployment. Previously, when a customer added a product to their cart from a non-default website, the product was not displayed in the Admin even when Share customer account is set to Global.
- Magento now displays only the products that the customer has placed in their cart when the cart is viewed from the Admin. Previously, a customer’s shopping cart displayed all the products in the catalog when viewed from the Admin. Fix submitted by Ravinder in pull request 26489. GitHub-26437
Directory
- The Default State dropdown menu is now populated by data that is based on the allowed countries that have been assigned to the selected website when you configure a value for the Default Tax Destination Calculation field. Previously, this dropdown listed the countries that were assigned to the default website.
Downloadable
- You can now use an import file to update downloadable products in bulk by SKU and description. Previously, validation errors occurred, and import failed.
EAV
- Magento now respects store-specific settings that determine whether the telephone number field of the checkout workflow is required in a multi-site deployment. Previously, in deployments where one store required this field in the checkout workflow and another store did not, customers who did not complete this field while checking out on the store that did not require it encountered this error:
Please check the shipping address information. "telephone" is required. Enter and try again
.
- The authorization emails that are sent to a customer when they request a return now contain the RMA status as expected. Previously, this email displayed an empty string instead of return status.
- Customers are no longer redirected away from the current website when they report a forgotten password in multi-site deployments where customer accounts are shared globally. Previously, customers were redirected to the website on which the account was created.
- Order confirmation emails sent to customers now include the list of ordered items as expected. Previously, when you created an email template in the Admin by loading and saving the default template, emails generated from this template did not include the list of ordered items. GitHub-26882
Frameworks
- Dependencies on Zend Framework have been migrated to the Laminas project to reflect the transitioning of Zend Framework to the Linux Foundation’s Laminas Project. Zend Framework has been deprecated.
- Special price range settings (from/to dates) now work correctly for administrator accounts using a Dutch locale.
php bin/magento cron:run
no longer processes items from the change log table multiple times. Previously, when you had more than 100000 new versions in the change log table, actions could be called several times for the sameentity id
.
- The Update Attribute action now correctly updates the timestamp of a product’s
updated_at column
fromcatalog_product_entity
when you update the product from the Admin edit product page.
- Setting
'persistent' => '1'
inenv.php
no longer throws an error when you runsetup:upgrade
.
- The Invalid Form Key. Please refresh the page text string on the login page is now translated as expected.
- We’ve improved the performance of the
Magento\Framework\App\DeploymentConfig\Reader::load
function. Previously, when a request was made to Magento, this function was called repetitively, which resulted inconfig.php
andenv.php config
files being loaded each time the method was called.
- Magento no longer downloads a
blank.html
page when an administrator clicks on a product while creating an order from the Admin.
- Non-cacheable blocks are no longer added to default layout handles. Adding non-cacheable blocks to default layout handlers renders all Magento pages non-cacheable. This results from the layout generation process: During layout generation, Magento collects all available layout handles for a particular page and merges instructions from them into the page’s final layout structure. The default layout handle is used as a basic handle for every page. As a result, layout updates that are declared for the default handler appear on every Magento page. GitHub-9041
- The MySQL lock manager is now the primary lock manager. As a result, the minimal required version of MySQL is 5.7.9.
General fixes
- The Customer module no longer has a dependency on the Review module. Previously, you could not disable the Review module due to this dependency.
- The product edit page now loads successfully when the default attribute set for the page contains a dropdown attribute with the select label.
- The graphical orders chart accessible from the Orders tab on the Admin now accurately reflects order quantity.
- A store’s Admin URL no longer redirects to the storefront URL when these two URLs differ.
- URL rewrite generation for subcategories now works correctly when using the performance toolkit profile with more than one website.
- You can now delete an empty user model without deleting the Administrators role to which it is assigned.
- The TinyMCE4 editor now supports all HTML tags.
- Clicking the Refund Offline button in the create a credit memo workflow now generates a credit memo as expected. Previously, a JavaScript error disabled this button, and Magento did not create a credit memo.
- Merchants can now create a product attribute of type
Decimal
. Previously, due an earlier bug fix, Magento did not display the product attribute typePrice
. GitHub-26949
- Magento no longer returns a 500 error when you try to open a Category page on the storefront when Layout = Product – Full Width has been set from the Design tab of the Category page.
- Corrected a bug in
AbstractSimpleObjectBuilder.php
.
- MAP (minimum advertised price) now works as expected for group products.
- You can now add a child product of a grouped product to your cart when one of the grouped product’s other child products is out-of-stock. Previously, when one child product was out-of-stock, you could not add any other child products to the cart.
- Magento now redirects you to the home page of the appropriate store view when you change language on CMS pages in a multi store deployment. Previously, Magento displayed a 404 page when you changed language on certain CMS pages.
- Order queries (
SalesOrderIndexGridAsyncInsertCron
) have been refactored to reduce the size of the data set returned and the frequency of the queries.
- You can now successfully create a CMS page and assign it to the website root category in the CMS hierarchy.
- Guests can now display a product price or add a product to the cart when category permissions are enabled (for example, when the Not logged in customer group has been granted these privileges).
- Product rules now apply to out-of-stock products as expected. Previously, Magento did not display out-of-stock products in the related products list even when the rule was configured to display out-of-stock products.
- Clicking the Track shipping button for an order from the Admin now results in tracking information being displayed in a pop-up window as expected. Previously, this link took the administrator to the Log in page.
- Magento now displays an informative error message and continues to display the registration form as expected if an error occurs when a customer tries to complete a registration form that contains a multi-select customer attribute. Previously, Magento displayed a 500 error.
- Magento now displays the Credit memo button after the partial refund of an order. Previously, Magento did not display this button after you created a partial refund, and you could not create a credit memo for the rest of the order.
- Bulk order updates through REST now modify the order status as expected. Previously, Magento threw this error:
report.ERROR: Property "AdditionalInformation" does not have accessor method "setAdditionalInformation" in class "Magento\Sales\Api\Data\OrderPaymentInterface".
- Attribute filters are now displayed as expected in the Shopping Options block of the Category page.
- Customer billing and shipping addresses are now displayed as expected under the Addresses tab on the Admin Customer Edit page when displayed in Internet Explorer. Fix submitted by Vasilii Burlacu in pull request 27383. GitHub-27370
- All bookmark views now remain editable when you delete one. Previously, all bookmark views became uneditable after you deleted the first view for accounts with multiple bookmark views. Fix submitted by Bartomiej Szubert in pull request 26263. GitHub-14913
- Layered navigation no longer breaks HTML5 validation of the swatch module. Previously, HTML validation errors occurred for attributes that were not defined in the W3C markup validation service, but those attributes have been changed to data attributes. Fix submitted by Nirav Patel in pull request 26055. GitHub-22363
Gift cards
- The GET
V1/orders/:orderId
call returns gift card codes as expected.
GraphQL
- Magento now returns the GraphQL message
The cart isn't active
instead ofCurrent user does not have an active cart
under certain circumstances when a cart becomes inactive and a new cart ID is created. Fix submitted by Vadim Malesh in pull request 27187. GitHub-26117
- Removed code that caused an error when using GraphQL to add products to a cart when a previously added product became out-of-stock. Fix submitted by AleksLi in pull request 27015. GitHub-26683
- Corrected a problem in GraphQL in which Magento did not return all the required information while using fragments on products query. Fix submitted by Riccardo Tempesta in pull request 26218. GitHub-26217
Images
- Images are now saved in
pub/media/catalog/category
as expected when you save category images. Previously, Magento saved these images inpub/media/catalog/tmp/category
.
- Watermark images no longer obscure the product image that they overlay. Previously, when the watermark image was larger than the product image it was applied to, the product image was not visible.
- You can now successfully save an image to a category from the Admin. Previously, after you saved the image, part of the part of the URL was missing, and you couldn’t re-open the image.
- Magento now displays
.png
images as expected after upload.
- Using REST to add or update an image now creates an image thumbnail as expected. Fix submitted by Sergiy Vasiutynskyi in pull request 27170. GitHub-26825
Import/export
- Magento no longer throws an error during import when imported data includes a
swatch_image
store-view key has a value ofno_selection
. Previously, Magento threw this error:Imported resource (image) could not be downloaded from external resource due to timeout or access permissions in row(s): 1
. GitHub-25026
- Magento now updates images as expected when you use the
hide_from_product_page
setting when importing products in deployments with multiple store views.
- Customizable options are now imported as expected when
row_id
is not equal to a product’sentity_id
. Previously, Magento did not import customizable options whenrow_id
was not equal to a product’sentity_id
, which resulted in certain products not being imported.
- Images associated with configurable products are now properly uploaded during import and available for viewing as expected from the product edit page.
- Exported
.csv
files now reflect filter settings for including in-stock or out-of-stock products. Previously, Magento exported all products, no matter which stock setting you selected.
- You can now successfully import or update customers using the Customer and addresses single file option of the import workflow. Previously, when you selected this option, Magento did not import the customer data and displayed this error:
Invalid data for insert
.
- The Stock Indexer is now triggered as expected after import and updates product status. Previously, the Stock Indexer did not index the changed product inventory data.
- Magento now successfully imports all custom options for a configurable product’s child products when
store_view_code
is specified. This works whether you choose to import configurable products individually or collectively. Previously, Magento did not successfully import all custom options when the import file contained more than one item andstore_view_code
was specified.
- Magento now provides a message during product import that identifies which products in the imported
.csv
file have duplicated keys. Merchants can use this information to resolve conflicts. Previously, Magento displayed this error:Notice: Undefined index: name in /var/www/html/ee233dev/app/code/Magento/CatalogImportExport/Model/Import/Product.php on line 2524
- Magento now displays a more informative error message, and does not display a download link, when you try to delete a directory from the System > Export list. Previously, when you tried to delete a directory from this list, Magento continued to display a download link for files that could not be downloaded, and displayed an uninformative error message.
- The
.csv
file used during import now contains the correct links for downloadable products and is now correctly formatted to support importing and updating downloadable products.
- Magento now successfully exports a
.csv
file when you set import behavior for Replace, select a previously exported.csv
file, and click Check data. Previously, Magento displayed this error:Data validation failed. Please fix the following errors and upload the file again
andFollowing Error(s) has been occurred during importing process
.
- The Stock Indexer is now triggered as expected after import and updates product status. Previously, the Stock Indexer did not index the changed product inventory data.
- CSV files generated during product import now contain group titles for downloadable products as expected. Previously, unnecessary validation of
group_title
during import prevented the display of group titles for downloadable products.
- When
cron
is enabled and you perform a customer import using the (Customer and Addresses (single file) option, Magento populates data to the Admin customer grid as expected. The customer grid displays the customers once manual re-indexing completes forcustomer_grid indexer
. Previously, Magento did not update the customer grid with newly imported customer addresses.
- Magento now displays the customer list as expected after automatic re-indexing. Previously, although manually running
bin/magento index:reindex
worked, the customer grid did not display customer information after automatic re-indexing.
- Magento now deletes temporary files from
<Magento_home>/var
as expected after product import has completed.
- Magento no longer creates duplicate SKUs in the Admin when products are imported by
.csv
file.
- Magento now displays bundle products on the storefront as expected after you update a product by importing a
.csv
file. Fix submitted by Pavel Bystritsky in pull request 25664. GitHub-25540
Index
- We have improved the performance of
indexer_update_all_views
. Indexing is now faster, inactive rules are no longer processed, and caches are cleared of entries for only changed products.
- Product prices on the storefront now accurately reflect the application of a scheduled Catalog Price Rule update. Previously, prices did not reflect the scheduled cart price rule until you manually re-indexed (
php bin/magento indexer:reindex catalogrule_rule
).
- You can now successfully re-index the product database after adding an attribute that is unsearchable (that is, the
is_searchable
,is_filterable
,is_visible_in_advanced_search
attributes are disabled).
Infrastructure
- The validation logic associated with the Date of Birth field of the Customer Registration form no longer triggers a JavaScript error.
- Enabling the Block all cookies setting in Safari no longer results in JavaScript errors, and Magento displays the
cookies disabled
message as expected. Previously, Magento displayed multipleSecurityError (DOM Exception 18): The operation is insecure
errors in the console. Fix submitted by Ra̼l Verdugo Lorenzo in pull request 25324. GitHub-13865
Layered navigation
- Magento now renders the Yes/No attribute on the Category page when Use in Layered Navigation: Filterable (with results) for storefront properties is enabled.
Media Gallery
- Clicking Enter after naming a new folder in the Media Gallery now saves all changes you’ve made. Previously, clicking Enter instead of using the mouse to select OK resulted in all changes being lost. Fix submitted by Sergiy Vasiutynskyi in pull request 27029. GitHub-26847
Media Storage
var/resource_config.json
is no longer regenerated whenever an image is requested byget.php
. Previously, this file was rewritten on each call toget.php
.
Newsletter
- Customers can now subscribe as expected to newsletters. Previously, when a customer tried to confirm their subscription, Magento displayed this error:
This is an invalid subscription confirmation code
.
Orders
- Order summary subtotals no longer display excluded taxes when the website display settings specify that taxes should be excluded. Previously, when multiple websites were configured with different display settings, the setting defined in the server variable was used for the store despite the store-level configurations.
Payment methods
- The integration of third-party payment methods Authorize.Net, eWay, CyberSource, Braintree, and Worldpay into the core Magento code have been removed. Merchants should migrate to the official extensions that are available on the Magento Marketplace.
- The core implementation of Signifyd fraud protection is no longer supported. Merchants should migrate to the Signifyd Fraud & Chargeback Protection extension that is available on Magento Marketplace.
- You can now create an order from the Admin using Authorize.net as the payment method. Previously, Magento did not create the order, and displayed this error:
Transaction has been declined. Please try again later
. GitHub-23934
- Magento now displays an informative error message each time a customer clicks Pay with PayPal after entering an invalid shipping address in the checkout workflow. Previously, Magento displayed an error message only when the customer first clicked the button, not for subsequent clicks.
- Magento no longer changes an order’s status to processing in the Payment Review section of the checkout workflow when a payment with PayPal fails.
- You can now successfully complete an order using the Payflow Link payment method. Previously, the Payflow Link payment method always rejected payment because the order status remained in the
Pending
payment state, even though the order status in the payment method logs wasApproved
.
- The OK button is now clickable when you try to correct Braintree payment details for an order.
- You can now successfully complete an order and return to the merchant’s home page when Website Payments Pro Hosted Solution is configured. Previously, when you clicked Return to merchant, Magento threw this error:
Invalid Form Key. Please refresh the page
.
- Orders that are placed using PayPal Payflow Pro are now set to Suspected Fraud status when fraud filters are triggered.
- You can now use PayPal Express Checkout with any supported credit card. Previously, when you clicked on a credit card button while using PayPal Express Checkout to complete an order, Magento hung, and you could not enter any credit card information.
- Orders placed within PayPal Payflow Pro are now set to Suspected Fraud status when fraud filters are triggered. Previously, payment transaction status on PayPal was not validated before payment approval occurred on the Magento side.
- Payflow Pro now works as expected when Website Restrictions are enabled.
- The Place order button on the checkout workflow is now disabled as expected until the customer updates the billing address when paying with Braintree. Previously, when secure 3D was enabled and the customer was paying with Braintree, Magento did not correctly validate the shipping address and displayed this JavaScript error:
TypeError: Cannot read property 'firstname' of null
.
- Magento now successfully processes orders placed with PayPal Express Checkout where the order’s shipping address specifies a country region that the customer has manually entered into the text field rather than selected from the drop-down menu on the Shipping page. Previously, Magento displayed this error on the order review page:
Error 500: NOTICE: PHP message: PHP Fatal error: Uncaught Error: Call to a member function getId() on null in httpdocs/vendor/magento/module-paypal/Model/Api/Nvp.php:1527
. GitHub-26698
- The PayPal Pro payment method now works as expected in the Chrome 80 browser. This payment method previously invoked a Magento callback endpoint that needed access to the customer’s session — access that the new default Chrome SameSite cookie functionality does not permit. GitHub-26840
- You can now successfully use PayPal Express to pay for an order when persistent checkout cart has been enabled and the Clear Persistence on Sign Out setting is set to no. Previously, Magento redirected you to the Login page.
- Switching billing address no longer causes JavaScript function text to render in the payment section of the storefront checkout workflow. Fix submitted by Chris Pook in pull request 26378. GitHub-26375
Performance
- Customer data section invalidation logic has been improved. This release introduces a new way of invalidating all customer sections data that avoids a known issue with local storage when custom
sections.xml
invalidations are active. (Previously, private content (local storage) was not correctly populated when you had a custom etc/frontend/sections.xml with action invalidations). See Private content.
- The import of customer accounts has been refactored to improve import speed.
- Merchants can now use lazy loading to load images. See Configure theme properties. Fix submitted by Timon de Groot in pull request 27033. GitHub-27032
Pricing
- Magento now saves and displays the correct price for tiered products even after you’ve edited products multiple times. Previously, Magento did not save the last edits made to product price. Fix submitted by Ravi Chandra in pull request 26162. GitHub-25195
Product alert
- The stock alert email sent to customers about the re-stocking of a configurable product now contains the correct product price. Previously, this email contained a product price of 0.
- Product stock alert unsubscribe now works when a user’s session has expired. Previously, when you clicked on the Click here to stop alerts for this product link, Magento displayed a 404 error.
- Unsubscribe actions for product alerts now work as expected. Previously, when a customer clicked on the Click here to stop alerts for this product link, Magento displayed a 404 error.
Product video
- You can now use REST to update YouTube videos (PUT
rest/V1/products/{SKU}
). Previously, Magento displayed a thumbnail for the video, but the video player did not load when you clicked the Play button. GitHub-23194
Reports
- Product lists now order configurable products by SKU, which groups configurable products by variations. Previously, the report grouped products by product_id. Fix submitted by Lukasz Bajsarowicz in pull request 25858. GitHub-25856
Reviews
- Magento now disables the Submit Review button after the user clicks the button once. Previously, Magento did not disable this button after the first click and created multiple reviews when the user clicked the Submit Review button multiple times.
- The Admin > Reports > Reviews > By Products filter list now displays results as expected. Previously, when you tried to filter this list, Magento did not display any results.
Sales
- Completed orders now appear in both the payment system and Magento. Previously, orders appeared in the payment system but not in Magento. GitHub-25862
- Magento now honors a customer’s default shipping address. Previously, Magento did not honor the default billing and default shipping addresses according to the settings, and the Same As Billing Address setting was not enabled automatically.
- Magento now correctly calculates refunds for orders that include discounts. Previously, Magento incorrectly calculated the shipping tax and shipping discount, and the refunded total did not match the total paid.
- Magento now assigns the correct Group ID when a new customer creates an order in multi-site deployments. Previously, Magento applied the settings from the default customer group.
- Adminstrators with restricted permissions that include view permission for credit memos, invoices, and shipments can now view invoices and shipments from the Orders page as expected. Previously, when a restricted administrator tried to view an order, Magento displayed this error:
Something went wrong with processing the default view and we have restored the filter to its original state
.
- Magento no longer displays an error when a customer adds a quantity of a product to their cart that exceeds half of the existing product stock but does not exceed the total stock. Previously, under these circumstances, Magento displayed this error:
The requested qty is not available
. Github-24365
- You can now successfully add a product to the cart from the Admin when the stock quantity is 1. Previously, Magento didn’t add the product to the cart and displayed this message:
The requested qty is not available
. Fix submitted by Serhii Petrychenko in pull request 26650. GitHub-25675
- The layout of the Sales order address information edit form has been refactored to match Admin form library conventions. Fix submitted by Alexey Rakitin in pull request 25699. GitHub-19805
Sales Rule
quote_item.applied_rule_ids
is now updated as expected after a cart price rule is disabled. GitHub-24526
- Magento now displays category trees as expected when you try to create or edit a Cart Price rule. Previously, selecting a category in the Condition section while creating or editing a rule resulted in JavaScript errors.
Search
- Elasticsearch 7.6.x is now the default catalog search engine for Magento Commerce and Open Source. You cannot install or upgrade to Magento 2.4.0 without also installing Elasticsearch 7.6.x. Elasticsearch version 2.x code has been removed. Elasticsearch versions 5.x and 6.x have been deprecated and are no longer supported. See Elasticsearch.
- Magento now renders the < and > symbols correctly in storefront catalog search strings.
- Products now show as expected in categories after running
cron:run
in deployments implementing Elasticsearch.
- Magento no longer requires a full search re-index in order for a new product attribute to be searchable on the storefront.
- Elasticsearch now works as expected when you sort a product list that contains bundle products by alphabetized product names.
- Filtering results no longer include out-of-stock options when you filter configurable products in a category.
- Selecting all products from the products list page using Elasticsearch now displays all products in the search results as expected. Previously, Magento displayed no search results.
- Elasticsearch now correctly displays results from category pages when you change the number of search results viewed per page. Previously, when you changed how many search results should be displayed on the search results page, Magento displayed a blank page and this error:
"0":"SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near'
- Price sorting now works correctly for out-of-stock configurable products.
- Magento no longer throws an exception when a customer uses the storefront quick search in multi-website deployments.
Shipping
- Magento now applies fixed-amount, whole-cart discounts correctly for orders being shipped to multiple addresses. Previously, this type of discount was applied multiple times when a customer checked out an order using Check Out with Multiple Addresses. GitHub-25834
- The drop-down list that is available for selecting shipping methods during the process of creating a Cart Price Rule now contains only valid values. Previously, this dropdown list contained empty or extra values.
- Magento now prints shipping labels as a
.pdf
file as expected when you select Print Shipping Label from the Action drop-down list from an order in the order archive list. Previously, Magento displayed a 404 error.
- Free Shipping Price rules now affect only the relevant products when a shopping cart contains products from categories that are included by the Free Shipping Price rule as well as products from categories not included in the rule. Previously, when a shopping cart included products from both the free shipping categories as well as other categories not included in the price rule, then free shipping was not applied to any products.
Sitemap
- Magento now uses the project base URL as expected when you generate a sitemap.
Store
- Customer sessions now persist as expected when a customer logs in to one store, adds products to the shopping cart, and then switches to a new store in a multi-store deployment. Previously, when the customer navigated to the second store, Magento logged out the customer and emptied the shopping cart.
Swatches
- Merchants can now successfully add color swatch attributes to products using the Visual Swatch option on Stores > Attributes > Product > New Attribute. Previously, a JavaScript error was triggered when you tried to open the newly created swatch attribute.
- Corrected issues with the behavior of the drop-down menu in the Manage Swatch (Values of Your Attribute) area of the New Product Attribute page. Fix submitted by Oleh Usik in pull request 26090. GitHub-25910
TargetRule
- The related product block that is displayed for a product on the storefront now displays the products that have met the criteria defined in the Related Product Rule. Previously, Magento did not display any related products.
Tax
- Magento now updates shipping rates and prices as expected when a customer changes the destination country for an order during checkout.
- Free shipping is now applied as expected based on the applicable cart price rule. Previously, cart price rules did not take into account taxes when calculating whether an order meets criteria for free shipping.
- Magento no longer throws an error when you edit and save the
NOT LOGGED IN
customer group when B2B is installed.
Test
- Added an integration test to cover
$storeId
for the Category Repositoryget()
method. Fix submitted by Lukasz Bajsarowicz in pull request 27048. GitHub-27044
Theme
- We’ve resolved a bug in
JsFooterPlugin.php
that affected the display of dynamic blocks. Previously, Magento displayed this error when you directly accessed/banner/ajax/load/url
:Uncaught TypeError: strpos() expects parameter 1 to be string, null given in
.
Translation and locales
- Inline translation now works as expected on the storefront when Admin > Stores > Configuration > Advanced > Developer > Translate Inline > Enabled for Storefront is set.
- Inline translation now works as expected when enabled for a storefront.
- The
es_US Spanish (United States)
locale is now supported. Fix submitted by Vinh Le in pull request 26857. GitHub-26843
UI
- You can now use Page Builder to add a product as a button link (Edit Content > Button Link). Previously, Magento threw this error when you tried to select the product:
Product with ID: XXXX doesn't exist
.
- The link from the Setup Wizard to the Admin now works as expected. Fix submitted by Oleh Usik in pull request 26100. GitHub-24990
- The layout of the Admin Billing Address/Shipping Address page has been refactored to meet Magento Admin form display conventions. Fix submitted by Alexey Rakitin in pull request 25699. GitHub-23481, GitHub-19805
- Clicking on Theme Title on Admin > Content > Themes no longer results in duplicate records. Fix submitted by Eden Duong in pull request 25926. GitHub-25925
- The Add to Compare link on the product detail page now renders correctly in mobile view on displays with less than 640px resolution. Fix submitted by Pawe Tylek in pull request 26424 and Tejash Kumbhare in pull request 26365. GitHub-26364
- The Sort By label no longer overlaps with the Shop By button on the category page in mobile view. Fix submitted by Andrii Kartavtsev in pull request 26381. GitHub-25300
- You can now scroll through gallery thumbnail images on the product page in mobile view as expected. Fix submitted by iGerchak in pull request 25839. GitHub-21014
- Scrolling of product pages now works as expected in mobile view. Fix submitted by Mateusz Krzeszowiak in pull request 25385. GitHub-10518, GitHub-21717
- The Compare Products section of the Catalog page is now displayed as expected in mobile view on displays with less than 767px. Fix submitted by Hitesh in pull request 26418. GitHub-26416
URL rewrites
- Customers who change language on a CMS page can now successfully navigate to the store view they’ve selected. Previously, Magento displayed a 404 error.
- We’ve added a check to prevent URL redirects if the request path is the same as the target path. Fix submitted by Bartłomiej Szubert in pull request 26902. GitHub-20309
VAT
- Corrected the VAT Validation URL for EU Vat numbers. Fix submitted by Shikha Mishra in pull request 27886. GitHub-27874
Vault
- The Place Order button on the shipping workflow is now enabled as expected when you select Braintree as the payment method and the My billing and shipping address are the same setting is disabled.
Web API framework
- Corrected issues with the POST
/rest/default/async/bulk/V1/orders
calls.
- Corrected issues with the POST
/rest/default/async/bulk/V1/products
calls.
- The
getList
method has been refactored to retrieve theis_subscribed
extension attribute. Previously, you could not retrieve this attribute when fetching a customer entity through the API. Fix submitted by enriquei4 in pull request 25311. GitHub-13252
!— ENGCOM-6920–>
- Nullable getters in service contracts no longer throw reflection errors when used in the web API. Methods that can return null and a valid type now working correctly regardless of order, too. Fix submitted by Marco K̦pcke in pull request 25806. GitHub-25656
- You can now use POST
/V1/guest-carts/:cartId/items
to add products to a specific cart. Previously, when you used this call, Magento ignored the value ofcartId
. Fix submitted by Vadim Malesh in pull request 27172. GitHub-14086
- You can now use the
PUT /V1/cmsPage/:id
endpoint to save a CMS page title without changing the values of other fields. Fix submitted by Vadim Malesh in pull request 27237. GitHub-24704
Wishlist
- A wishlist now works as expected when it is enabled at the store-view level and disabled at the global level. Previously, when these settings were in place, adding a product to a wishlist resulted in a 404 error.
WYSIWYG
- The WYSIWYG image uploader now uses
pub/media/wysiwyg
as the storage root. Previously, the uploaded usedpub/media
as its storage root, which made those uploaded images inaccessible after recent changes to image uploader code. Fix submitted by Pieter Hoste in pull request 24878. GitHub-22609
Known issues
Issue: Anomalies in storefront error messages occur in deployments where PHP 7.4.2 is installed. When Magento 2.4.0 is deployed with PHP 7.4.2, the space symbols in storefront error messages are replaced with plus (+) characters. This bug is native to PHP 7.4.2 and cannot be corrected by Magento.
Community contributions
We are grateful to the wider Magento community and would like to acknowledge their contributions to this release. Check out the following ways you can learn about the community contributions to our current releases:
-
If a community member has provided a fix for this release, we identify the fix in the Fixed Issue section of these notes with the phrase, “Fix provided by community member @member_name”.
-
The Magento Community Engineering team Magento Contributors 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, 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 external pull requests, the GitHub issue number associated with it (if available), and the community member who contributed the pull request.
Contributing community member | Pull Requests | Related GitHub Issues | |
---|---|---|---|
Eden Duong | #25905 | N/A | |
Ajith | #25808 | N/A | |
Marco Köpcke | #25790 | 24229 | |
Eduard Chitoraga | #25774 | N/A | |
Edward Simpson | #25604 | N/A | |
Mateusz Krzeszowiak | #25541 | 22416 | |
Eden Duong | #25939 | N/A | |
Eden Duong | #25928 | N/A | |
Eduard Chitoraga | #25913 | N/A | |
Lukasz Bajsarowicz | #25822 | N/A | |
Lukasz Bajsarowicz | #25812 | N/A | |
Lukasz Bajsarowicz | #25803 | N/A | |
Lukasz Bajsarowicz | #25791 | N/A | |
Lukasz Bajsarowicz | #25792 | N/A | |
Andrii Beziazychnyi | #25765 | 25739 | |
Nathan Morgan | #25655 | 25654 | |
Eden Duong | #25952 | 25731 | |
Eden Duong | #25942 | 25935 | |
Eden Duong | #25932 | 25931 | |
Eden Duong | #25926 | 25925 | |
Eduard Chitoraga | #25918 | 25917 | |
Ihor Sviziev | #25912 | 25911 | |
Adam Mellen | #25995 | N/A | |
Eden Duong | #25984 | N/A | |
Eden Duong | #25982 | N/A | |
Lukasz Bajsarowicz | #25954 | N/A | |
Eden Duong | #25924 | 25893 | |
Eden Duong | #25904 | 25896 | |
Bartłomiej Szubert | #25723 | 24713 | |
Alexey Rakitin | #25699 | 19805, 23481 | |
Phil | #25262 | N/A | |
Eden Duong | #26016 | N/A | |
Eden Duong | #25997 | N/A | |
Eden Duong | #25993 | N/A | |
Nazar Klovanych | #25992 | N/A | |
Hitesh | #25973 | 25972 | |
maslii | #25975 | N/A | |
Dan Wallis | #25624 | N/A | |
Namrata | #25114 | N/A | |
Mateusz Krzeszowiak | #25587 | 25586 | |
Eduard Chitoraga | #26069 | N/A | |
Eden Duong | #26067 | N/A | |
Eduard Chitoraga | #26063 | 20379 | |
Sathish Subramanian | #26057 | N/A | |
Sathish Subramanian | #26050 | N/A | |
Giancarlo Peris | #26044 | N/A | |
Eden Duong | #26045 | N/A | |
Eden Duong | #26042 | N/A | |
Eden Duong | #26043 | N/A | |
Krzysztof Daniel | #26037 | N/A | |
Paweł Tylek | #26034 | 18687 | |
Eden Duong | #26003 | N/A | |
Łukasz Lewandowski | #26001 | 24025 | |
Sergey Dovbenko | #25940 | 100 | |
Eduard Chitoraga | #25697 | N/A | |
Rafael Corrêa Gomes | #25523 | N/A | |
Tan Sezer | #24360 | 24357 | |
Eden Duong | #26060 | N/A | |
Eden Duong | #26059 | N/A | |
Matheus Gontijo | #26058 | N/A | |
divyajyothi5321 | #26011 | 25930 | |
Eden Duong | #26004 | N/A | |
Sathish Subramanian | #25920 | N/A | |
Eden Duong | #26082 | N/A | |
Eden Duong | #26076 | N/A | |
Sathish Subramanian | #26068 | N/A | |
Lukasz Bajsarowicz | #26009 | N/A | |
Ashna-Jahan | #25759 | 25433 | |
Lukasz Bajsarowicz | #25854 | N/A | |
Lukasz Bajsarowicz | #25846 | N/A | |
Lukasz Bajsarowicz | #25845 | N/A | |
Lukasz Bajsarowicz | #25844 | N/A | |
Lukasz Bajsarowicz | #25842 | N/A | |
Lukasz Bajsarowicz | #25841 | N/A | |
Lukasz Bajsarowicz | #25831 | N/A | |
Lukasz Bajsarowicz | #25836 | N/A | |
Lukasz Bajsarowicz | #25830 | N/A | |
Lukasz Bajsarowicz | #25829 | N/A | |
Lukasz Bajsarowicz | #25825 | N/A | |
Lukasz Bajsarowicz | #25823 | N/A | |
Lukasz Bajsarowicz | #25821 | N/A | |
Lukasz Bajsarowicz | #25819 | N/A | |
Lukasz Bajsarowicz | #25820 | N/A | |
Lukasz Bajsarowicz | #25818 | N/A | |
Lukasz Bajsarowicz | #25817 | N/A | |
Lukasz Bajsarowicz | #25816 | N/A | |
Lukasz Bajsarowicz | #25815 | N/A | |
Lukasz Bajsarowicz | #25813 | N/A | |
Lukasz Bajsarowicz | #25811 | N/A | |
Lukasz Bajsarowicz | #25807 | N/A | |
Lukasz Bajsarowicz | #25804 | N/A | |
Lukasz Bajsarowicz | #25802 | N/A | |
Lukasz Bajsarowicz | #25800 | N/A | |
Lukasz Bajsarowicz | #25799 | N/A | |
Lukasz Bajsarowicz | #25797 | N/A | |
Lukasz Bajsarowicz | #25794 | N/A | |
Lukasz Bajsarowicz | #25793 | N/A | |
Lukasz Bajsarowicz | #25788 | N/A | |
Lukasz Bajsarowicz | #25787 | N/A | |
Lukasz Bajsarowicz | #25784 | N/A | |
Lukasz Bajsarowicz | #25783 | N/A | |
Gihovani Filipp Pereira Demétrio | #26157 | N/A | |
Ravi Chandra | #26160 | 26155 | |
Eduard Chitoraga | #26154 | N/A | |
Eduard Chitoraga | #26150 | #26148 | |
Eden Duong | #26140 | N/A | |
Sathish Subramanian | #26136 | N/A | |
Lukasz Bajsarowicz | #26128 | N/A | |
Eden Duong | #26127 | N/A | |
Eduard Chitoraga | #26096 | N/A | |
Andrii Beziazychnyi | #26028 | N/A | |
Serhiy Zhovnir | #25864 | 761 | |
Daniel Ruf | #24849 | N/A | |
Lukasz Bajsarowicz | #26131 | N/A | |
Lukasz Bajsarowicz | #26129 | N/A | |
Lukasz Bajsarowicz | #26125 | N/A | |
Grzegorz Bogusz | #26033 | 25974 | |
Pavel Bystritsky | #25915 | N/A | |
Andreas Mautz | #25838 | 25674 | |
Marc Rodriguez | #25315 | 13136 | |
Lukasz Bajsarowicz | #25957 | 22047 | |
David Lambauer | #24103 | N/A | |
divyajyothi5321 | #26173 | 26164 | |
Ravi Chandra | #26170 | 24972 | |
azambon | #25876 | 25659 | |
Adarsh Manickam | #25428 | N/A | |
Andrey Legayev | #25125 | N/A | |
Lukasz Bajsarowicz | #26225 | N/A | |
Alexey Arendarenko | #25603 | 18717 | |
divyajyothi5321 | #26182 | 26176 | |
Bartłomiej Szubert | #26130 | 25390 | |
Marco Oliveira | #26084 | 26083 | |
divyajyothi5321 | #26066 | 26064 | |
MaxRomanov4669 | #25958 | 14663 | |
Anton Kaplya | #25479 | N/A | |
Torben Höhn | #25640 | N/A | |
Edward Simpson | #25478 | N/A | |
Behnam Shayani | #25452 | 20966 | |
Bartłomiej Szubert | #24815 | 21684 | |
Eden Duong | #24471 | 24468 | |
Pavel Bystritsky | #22917 | 22856 | |
Lukasz Bajsarowicz | #26274 | N/A | |
Lukasz Bajsarowicz | #26273 | N/A | |
Bartłomiej Szubert | #26268 | 14001 | |
aleromano89 | #26264 | 23521 | |
Lukasz Bajsarowicz | #26259 | N/A | |
divyajyothi5321 | #26237 | 25936 | |
Hitesh | #26234 | 26227 | |
Sathish Subramanian | #26215 | 26208 | |
Lukasz Bajsarowicz | #26207 | 26206 | |
divyajyothi5321 | #26183 | 26181 | |
divyajyothi5321 | #26169 | 26168 | |
Yaroslav Rogoza | #26029 | N/A | |
Laura Folco | #25946 | 19093 | |
miszyman | #25250 | 23350 | |
Hitesh | #26290 | 26289 | |
Marco Oliveira | #26270 | 22964 | |
Bartłomiej Szubert | #26263 | 14913 | |
Eduard Chitoraga | #26251 | N/A | |
Riccardo Tempesta | #26218 | 26217 | |
Pawan Kumar Parmar | #26048 | N/A | |
Andrii Chorniy | #25985 | 23899 | |
Douglas Radburn | #25337 | 14971 | |
Denis Kopylov | #22990 | 22988 | |
Bartłomiej Szubert | #26360 | N/A | |
Patrick McLain | #26359 | N/A | |
Bartłomiej Szubert | #26354 | N/A | |
Alexander Taranovsky | #26312 | N/A | |
Eduard Chitoraga | #26311 | N/A | |
Eduard Chitoraga) | #26305 | N/A | |
Bartłomiej Szubert | #26269 | 7065 | |
MaxRomanov4669 | #26258 | 11209 | |
Hitesh | #26238 | 26235 | |
Patrick McLain | #26185 | N/A | |
Eden Duong | #26051 | 25130 | |
Eden Duong | #25909 | 25881 | |
Benjamin Rosenberger | #25718 | N/A | |
Benjamin Rosenberger | #25716 | N/A | |
Matti Vapa | #25375 | 25373 | |
Mychailo | #25333 | 25278 | |
dhoang89 | #25194 | 25188 | |
Thomas Klein | #25083 | N/A | |
Gihovani Filipp Pereira Demétrio | #24955 | 22304 | |
John Hughes | #23313 | 22909 | |
Lukasz Bajsarowicz | #26407 | 26396 | |
Lukasz Bajsarowicz | #26395 | 26396 | |
Lukasz Bajsarowicz | #26323 | 26331 | |
Lukasz Bajsarowicz | #26321 | 26331 | |
Lukasz Bajsarowicz | #26320 | 26331 | |
Lukasz Bajsarowicz | #26319 | 26331 | |
Paweł Tylek | #26424 | 26364 | |
Alexander Taranovsky | #26402 | N/A | |
Tejash Kumbhare | #26365 | 26364 | |
Andrii Chorniy | #26313 | 25968 | |
Timon de Groot | #26495 | N/A | |
Alexander Taranovsky | #26464 | N/A | |
Alexander Taranovsky | #26452 | N/A | |
Lukasz Bajsarowicz | #26322 | 26331 | |
Lukasz Bajsarowicz | #26391 | N/A | |
Vikalp Saxena | #26628 | N/A | |
Lukasz Bajsarowicz | #26614 | 26612 | |
Eduard Chitoraga | #26558 | N/A | |
Ajith | #26540 | N/A | |
Ajith | #26537 | N/A | |
Fred Orosko Dias | #26512 | N/A | |
Fred Orosko Dias | #26511 | N/A | |
Fred Orosko Dias | #26509 | N/A | |
Andrii Chorniy | #26490 | N/A | |
Ravinder | #26489 | 26437 | |
Lukasz Bajsarowicz | #26480 | 26479 | |
Karyna Tsymbal | #26478 | N/A | |
Oleh Usik | #26455 | 25162 | |
deepaksnair | #26445 | 25761 | |
Sergiy Vasiutynskyi | #26435 | 18012 | |
Tjitse | #26434 | N/A | |
Andrii Kartavtsev | #26381 | 25300 | |
iGerchak | #26327 | N/A | |
Daniel Ruf | #26285 | 26275 | |
Stanislav Ilnytskyi | #26071 | 26065 | |
Fred Orosko Dias | #25994 | N/A | |
iGerchak | #25839 | 21014 | |
Mateusz Krzeszowiak | #25385 | 10518, 21717 | |
Lukasz Bajsarowicz | #26355 | N/A | |
Manuel Eduardo Cánepa Cihuelo | #26296 | N/A | |
Alexander Taranovsky | #26000 | N/A | |
Hitesh | #25966 | 25962 | |
Jeroen | #25875 | 9466 | |
Mateusz Krzeszowiak | #25764 | 17125 | |
Vinai Kopp | #24460 | N/A | |
Namrata | #26634 | N/A | |
Lukasz Bajsarowicz | #26611 | 26610 | |
Sathish Subramanian | #26549 | N/A | |
Karyna Tsymbal | #26525 | N/A | |
Karyna Tsymbal | #26487 | N/A | |
Alexander Taranovsky | #26439 | N/A | |
Alexander Taranovsky | #26429 | N/A | |
Sergiy Vasiutynskyi | #26241 | 26240 | |
Risha Tiwari | #26641 | N/A | |
Karyna Tsymbal | #26579 | N/A | |
Dmitry Tsymbal | #26574 | N/A | |
Oleh Usik | #26569 | 17847 | |
Ajith | #26568 | N/A | |
Mayank Zalavadia | #26542 | N/A | |
Yevhen Sentiabov | #26533 | 21555, 26532 | |
Eduard Chitoraga | #26496 | N/A | |
Alexander Taranovsky | #26476 | N/A | |
Erfan Shamabadi | #26462 | N/A | |
Michele Fantetti | #26451 | N/A | |
Karyna Tsymbal | #26430 | N/A | |
Karyna Tsymbal | #26399 | 26332 | |
Paavo Pokkinen | #26213 | N/A | |
KaushikChavda | #26007 | 25591 | |
Dan Wallis | #25860 | N/A | |
Willem Wigman | #25851 | N/A | |
jimuld | #25742 | N/A | |
Raúl Verdugo Lorenzo | #25324 | 13865 | |
George Babarus | #24648 | N/A | |
Andreas von Studnitz | #24485 | N/A | |
Chris Pook | #26378 | 26375 | |
Paweł Tylek | #25641 | 25032 | |
Andrey Nikolaev | #25285 | N/A | |
Sergiy Vasiutynskyi | #26420 | 8691 | |
Raul E Watson | #26413 | N/A | |
Ravi Chandra | #26162 | 25195 | |
Lachlan Turner | #26623 | 26622 | |
Lukasz Bajsarowicz | #26621 | N/A | |
Hitesh | #26546 | 26543 | |
Fanis Strezos | #26423 | 25268 | |
Tejash Kumbhare | #26339 | 26338 | |
Jens Scherbl | #24691 | N/A | |
Ajith | #26782 | N/A | |
Matthew O’Loughlin | #26781 | N/A | |
Karyna Tsymbal | #26770 | N/A | |
Sathish Subramanian | #26764 | 26760 | |
Adarsh Manickam | #26714 | 14885 | |
Karyna Tsymbal | #26715 | N/A | |
Shankar Konar | #26502 | 863 | |
Yurii Tvardyi | #26279 | 26276 | |
Alexander Taranovsky | #26246 | 26245 | |
Andrea Parmeggiani | #26142 | 26141 | |
toxix | #25488 | 25487 | |
Nikita Sarychev | #25249 | N/A | |
vishal-webkul | #25246 | 25245 | |
adrian-martinez-interactiv4 | #24843 | 24842 | |
Sathish Subramanian | #26820 | N/A | |
Karyna Tsymbal | #26816 | N/A | |
Ajith | #26771 | N/A | |
Bartłomiej Szubert | #26684 | N/A | |
Pratik Mehta | #26674 | N/A | |
Tejash Kumbhare | #26342 | N/A | |
Adarsh Manickam | #25991 | 847 | |
Vinh Le | #26857 | 26843 | |
Alexander Taranovsky | #26846 | N/A | |
Karyna Tsymbal | #26844 | N/A | |
Karyna Tsymbal | #26835 | N/A | |
Karyna Tsymbal | #26839 | N/A | |
Karyna Tsymbal | #26769 | N/A | |
Ajith | #26768 | N/A | |
Karyna Tsymbal | #26712 | N/A | |
Vova Yatsyuk | #26688 | N/A | |
Dasharth Patel | #26659 | 26054 | |
Bartłomiej Szubert | #26398 | N/A | |
Sergiy Vasiutynskyi | #26317 | 26240, 26314 | |
Alexander Lukyanov | #24612 | 24547 | |
Eduard Chitoraga | #26904 | N/A | |
Karyna Tsymbal | #26899 | N/A | |
Stanislav Ilnytskyi | #26897 | N/A | |
Karyna Tsymbal | #26894 | N/A | |
Eduard Chitoraga | #26878 | N/A | |
Vladimir Fishchenko | #26869 | N/A | |
Vladimir Fishchenko | #26868 | N/A | |
Milan Osztromok | #26863 | N/A | |
Stanislav Ilnytskyi | #26790 | N/A | |
Sathish Subramanian | #26761 | N/A | |
Eduard Chitoraga | #26710 | N/A | |
Eden Duong | #26701 | 26675 | |
Serhii Petrychenko | #26650 | 25675 | |
Karyna Tsymbal | #26617 | N/A | |
Sathish Subramanian | #26584 | 26583 | |
Maksym Novik | #26523 | 25963 | |
Hitesh | #26418 | 26416 | |
Marco Köpcke | #25806 | 25656 | |
Benjamin Rosenberger | #25626 | N/A | |
Brice | #25426 | N/A | |
Rafael Corrêa Gomes | #25417 | N/A | |
Rafael Corrêa Gomes | #25321 | N/A | |
Artem Voloznov | #24976 | 24971 | |
Bartłomiej Szubert | #22296 | 14958 | |
Alexander Taranovsky | #26833 | N/A | |
Lukasz Bajsarowicz | #26608 | 26607 | |
Grayson | #26772 | N/A | |
Lukasz Bajsarowicz | #25858 | 25856 | |
Denis Kopylov | #23570 | N/A | |
Petar Borisovski | #26995 | N/A | |
Bartłomiej Szubert | #26982 | N/A | |
Lukasz Bajsarowicz | #26974 | 26973 | |
Max Mezhensky | #26947 | N/A | |
Max Mezhensky | #26944 | N/A | |
Sathish Subramanian | #26932 | 26917 | |
Nandhini Nagaraj | #26928 | N/A | |
Andrii Kasian | #26916 | N/A | |
Max Mezhensky | #26912 | N/A | |
Mohamed-Asar | #26862 | 26838 | |
Vladimir Fishchenko | #26821 | N/A | |
Oleh Usik | #26755 | N/A | |
Vladimir Fishchenko | #26697 | N/A | |
Fred Orosko Dias | #26586 | N/A | |
Ravinder | #26230 | 26229 | |
Oleh Usik | #26090 | 25910 | |
Andrii Chorniy | #25895 | 13269, 25738 | |
Shankar Konar | #25349 | 572 | |
Chris Frewin | #25161 | N/A | |
Sathish Subramanian | #26979 | 26800 | |
Max Mezhensky | #26842 | N/A | |
Alastair Mucklow | #26615 | N/A | |
Lukasz Bajsarowicz | #25828 | 26331 | |
enriquei4 | #25311 | 13252 | |
Bartłomiej Szubert | #27054 | N/A | |
Lukasz Bajsarowicz | #27048 | 27044 | |
Sean van Zuidam | #27041 | 27040 | |
Karyna Tsymbal | #27021 | N/A | |
Max Mezhensky | #27010 | N/A | |
Lukasz Bajsarowicz | #26779 | N/A | |
Bartłomiej Szubert | #26765 | 17933 | |
Tobias Nilsson | #26548 | 23755, 26384 | |
Lukasz Bajsarowicz | #26329 | 26331 | |
korostii | #25359 | 25243 | |
Pieter Hoste | #24003 | 23619 | |
Alexander Taranovsky | #27114 | N/A | |
Oleh Usik | #27057 | N/A | |
Timon de Groot | #27033 | 27032 | |
Dominic Fernando | #26907 | N/A | |
Tu Nguyen | #26619 | N/A | |
Lukasz Bajsarowicz | #26778 | N/A | |
Lukasz Bajsarowicz | #26990 | 26989 | |
Raul E Watson | #27196 | N/A | |
Sergiy Vasiutynskyi | #27149 | 27027 | |
Adarsh Manickam | #27138 | 973 | |
Sergiy Vasiutynskyi | #27131 | 26758 | |
Bartłomiej Szubert | #27084 | N/A | |
Bartłomiej Szubert | #27083 | N/A | |
Bartłomiej Szubert | #27082 | N/A | |
Bartłomiej Szubert | #27080 | N/A | |
Sergiy Vasiutynskyi | #27029 | 26847 | |
Vinh Le | #27026 | 27009 | |
Sathish Subramanian | #27014 | 26992 | |
Bartłomiej Szubert | #26964 | N/A | |
Ihor Sviziev | #26939 | N/A | |
Bartłomiej Szubert | #26902 | 20309 | |
Tejash Kumbhare | #26649 | 26648 | |
princeCB | #26642 | 26590 | |
Alexander Taranovsky | #26563 | N/A | |
Hirokazu Nishi | #25454 | 24637 | |
Pieter Hoste | #24878 | 22609 | |
Dmitriy | #24743 | 24735 | |
Francis | #23742 | N/A | |
wardcapp | #22442 | N/A | |
Vadim Malesh | #27172 | 14086 | |
Franciszek Wawrzak | #27179 | N/A | |
Bartłomiej Szubert | #27145 | N/A | |
alexander-aleman | #26959 | 25219 | |
DanieliMi | #26506 | 26499 | |
Andrii Beziazychnyi | #25722 | 25669 | |
Ihor Sviziev | #27284 | N/A | |
Lukasz Bajsarowicz | #27281 | N/A | |
Lukasz Bajsarowicz | #27277 | N/A | |
Lukasz Bajsarowicz | #27274 | N/A | |
Sergiy Vasiutynskyi | #27261 | 20472, 20906, 21910 | |
Navarr Barnier | #27249 | N/A | |
Pieter Hoste | #26784 | 4112, 11615, 11616, 25124, 26393 | |
Piotr Markiewicz | #26746 | N/A | |
Mudit Shukla | #26348 | 26345 | |
Vadim Malesh | #27187 | 26117 | |
Sergiy Vasiutynskyi | #27170 | 26825 | |
Eden Duong | #25733 | N/A | |
Lukasz Bajsarowicz | #27118 | 27117 | |
Dmitry Tsymbal | #27266 | N/A | |
Lukasz Bajsarowicz | #27255 | N/A | |
Vasilii Burlacu | #27165 | N/A | |
AleksLi | #27015 | 26683 | |
Tu Nguyen | #26987 | 26963 | |
Sergiy Vasiutynskyi | #26560 | 26473, 26856, 26858 | |
Dan Wallis | #25297 | N/A | |
solwininfotech | #24479 | 22251 | |
Lukasz Bajsarowicz | #27273 | N/A | |
Vadim Malesh | #27237 | 24704 | |
Bartłomiej Szubert | #27215 | N/A | |
Sergiy Vasiutynskyi | #27191 | 26827 | |
Michael Bottens | #27125 | 27124 | |
Yaroslav Rogoza | #26015 | N/A | |
Mr. Lewis | #25734 | N/A | |
Alexander Menk | #23191 | N/A | |
Abrar Pathan | #27336 | 27335 | |
Sergiy Vasiutynskyi | #27304 | 14080 | |
Lukasz Bajsarowicz | #27298 | N/A | |
Lukasz Bajsarowicz | #27292 | N/A | |
Vasilii Burlacu | #27263 | 26708 | |
Lukasz Bajsarowicz | #27214 | N/A | |
Michele Fantetti | #27116 | N/A | |
Antonino Bonumore | #26748 | 26745 | |
Bartłomiej Szubert | #26923 | 186 | |
Andrii Beziazychnyi | #27390 | N/A | |
Fil Maj | #27375 | N/A | |
Oleh Usik | #27353 | N/A | |
Dmitry Tsymbal | #27334 | N/A | |
Bartłomiej Szubert | #27319 | N/A | |
Andrii Beziazychnyi | #27307 | 26224 | |
Lukasz Bajsarowicz | #27276 | N/A | |
Lukasz Bajsarowicz | #27000 | N/A | |
Tjitse | #26538 | N/A | |
Pavel Bystritsky | #25664 | 25540 | |
Alexander Taranovsky | #22011 | 22010 | |
Lukasz Bajsarowicz | #27378 | N/A | |
Nirav Patel | #26055 | 22363 | |
Sergiy Vasiutynskyi | #27412 | 13689 | |
Bartłomiej Szubert | #27393 | N/A | |
Bartłomiej Szubert | #27385 | N/A | |
Bartłomiej Szubert | #27384 | N/A | |
Vasilii Burlacu | #27383 | 27370 | |
Lukasz Bajsarowicz | #27381 | N/A | |
Mateusz Krzeszowiak | #27360 | N/A | |
Priya-V-Panchal | #27088 | 27086 | |
Laura Folco | #22837 | 22833 | |
Bartłomiej Szubert | #26075 | 6310 | |
Shankar Konar) | #27388 | N/A | |
Graham Wharton | #26999 | N/A | |
Vasilii Burlacu | #27371 | N/A | |
Vadim Malesh | #27509 | N/A | |
Bartłomiej Szubert | #27462 | N/A | |
Lukasz Bajsarowicz | #27427 | N/A | |
Lukasz Bajsarowicz | #27425 | N/A | |
Nazar Klovanych | #27413 | N/A | |
Abel Truong | #27365 | 16315 | |
Lyzun Oleksandr | #27257 | N/A | |
Daniel Ruf | #26763 | 26762 | |
Shankar Konar | #26736 | N/A | |
Tu Nguyen | #26618 | N/A | |
Stanislav Ilnytskyi | #26417 | N/A | |
Vasilii Burlacu | #27493 | 26652 | |
Andrii Beziazychnyi | #27492 | N/A | |
Serhiy Zhovnir | #27399 | 1002 | |
Bartłomiej Szubert | #26397 | N/A | |
Oleh Usik | #26100 | 24990 | |
Simon Sprankel | #27545 | N/A | |
Tu Nguyen | #27544 | N/A | |
Oleh Usik | #27526 | N/A | |
Ihor Sviziev | #27521 | 27500 | |
Vasilii Burlacu | #27497 | 27496 | |
Vasilii Burlacu | #27495 | N/A | |
Bartłomiej Szubert | #27463 | N/A | |
Abel Truong | #27295 | 27169 | |
Mark Shust | #26900 | N/A | |
Pieter Hoste | #26801 | N/A | |
Ihor Sviziev | #27519 | 27500 | |
Lukasz Bajsarowicz | #27322 | 27320 | |
Lukasz Bajsarowicz | #27321 | 27320 | |
Nazar Klovanych | #27652 | N/A | |
Cristiano Pacheco | #27627 | 27500 | |
Lukasz Bajsarowicz | #27597 | 171 | |
Oleh Usik | #27563 | N/A | |
Bartłomiej Szubert | #27491 | N/A | |
Sergiy Vasiutynskyi | #27343 | 13851 | |
Lukasz Bajsarowicz | #26988 | 26986 | |
Tu Nguyen | #26926 | N/A | |
Krzysztof Daniel | #26036 | N/A | |
Oleh Usik | #27671 | N/A | |
Lukasz Bajsarowicz | #27552 | N/A | |
Marcus Pettersen Irgens | #27547 | N/A | |
Oleh Usik | #27676 | N/A | |
Ihor Sviziev | #27522 | 27500 | |
Eino Keskitalo | #27448 | N/A | |
Lukasz Bajsarowicz | #27701 | 27638 | |
Oleh Usik | #27689 | N/A | |
Bartosz Górski | #27685 | N/A | |
Oleh Usik | #27677 | N/A | |
Paweł Tylek | #27603 | 27506 | |
Lukasz Bajsarowicz | #27325 | N/A | |
Oleh Usik | #27843 | N/A | |
Oleh Usik | #27841 | N/A | |
Oleh Usik | #27692 | N/A | |
Lukasz Bajsarowicz | #27606 | 27607 | |
Matheus Gontijo | #26293 | N/A | |
Oleh Usik | #27846 | N/A | |
Lukasz Bajsarowicz | #27300 | 27299 | |
Sergii Ivashchenko | #27499 | N/A | |
Sergii Ivashchenko | #27536 | N/A | |
Nazar Klovanych | #27566 | N/A | |
Nazar Klovanych | #27966 | N/A | |
Pieter Hoste | #27926 | 27920 | |
Pieter Hoste | #27892 | N/A | |
Ihor Sviziev | #27887 | 25769 | |
Shikha Mishra | #27886 | 27874 | |
Ajith | #27740 | N/A | |
Oleksandr Kravchuk | #27578 | N/A | |
Lukasz Bajsarowicz | #27323 | 27320 | |
Lukasz Bajsarowicz | #27093 | 27089 | |
Alexander Shkurko | #27994 | N/A | |
Vadim Malesh | #27976 | 1270 | |
Lukasz Bajsarowicz | #27964 | N/A | |
Andrii Kalinich | #27955 | 27897 | |
Shankar Konar | #27515 | 27503 | |
Ajith | #26886 | N/A | |
Nazar Klovanych | #28048 | N/A | |
Volodymyr Zaets | #27948 | N/A | |
Volodymyr Zaets | #27662 | N/A | |
Ajith | #26704 | N/A | |
Tu Nguyen | #27572 | 27058 | |
Dzung Nguyen | #27455 | 23440 | |
Rohan Hapani | #27359 | 27358 |
System requirements
Our technology stack is built on PHP and MySQL. For more information, see System Requirements.
Installation and upgrade instructions
You can install Magento Open Source 2.4.0 using Composer.
Migration toolkits
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 Magento Data Migration repository.
The Code Migration Toolkit 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.