ÃÛ¶¹ÊÓƵ

ÃÛ¶¹ÊÓƵ Commerce 2.4.6 release notes

ÃÛ¶¹ÊÓƵ Commerce 2.4.6 introduces support for PHP 8.2. PHP 8.1 remains fully supported, but support for PHP 7.4 has been removed. It includes significant performance and scalability enhancements. GraphQL operations for bulk cart operations and category tree rendering response have been optimized. This release introduces the ÃÛ¶¹ÊÓƵ Commerce Extension metapackage.

This release includes over 300 quality fixes and enhancements. Core Composer dependencies and third-party libraries have been upgraded to the latest versions that are compatible with PHP 8.2.

NOTE
ÃÛ¶¹ÊÓƵ Commerce releases can contain backward-incompatible changes (BICs). To review backward-incompatible changes, see . Major backward-incompatible issues are described in . Not all releases introduce major BICs.

Other release information

Although code for these features is bundled with 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.

ÃÛ¶¹ÊÓƵ Commerce 2.4.6 highlights

Look for the following highlights in this release.

Security enhancements

This release includes eight security fixes and platform security improvements.

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:

  • Gaps in Admin action logs have been addressed with more specific auditing of actions within grid views, mass actions, and exports.

  • reCAPTCHA validation no longer fails during checkout when unexpected errors occur during payment processing.

  • New system configuration for requiring email confirmation when an admin user changes their email. To reduce site vulnerability, a new system configuration setting (disabled by default) was added to require email confirmation when an admin user changes their email: Stores > Settings:Configuration > Customers > Customer Configuration > Account Information Options > Require email confirmation if an email has been changed. When this option is enabled, the application will request email confirmation every time the admin user changes their email address. The following module is affected by this change: Magento_Customer.

Platform enhancements

ÃÛ¶¹ÊÓƵ Commerce 2.4.6 introduces support for PHP 8.2. PHP 8.1 remains fully supported.

PHP 7.4 support has been removed from this release. You cannot run ÃÛ¶¹ÊÓƵ Commerce 2.4.6 on PHP 7.4.

ÃÛ¶¹ÊÓƵ Commerce 2.4.6 now supports:

  • Composer 2.2.x. Composer 1.x has been removed.

  • Redis 7.0.x. Although compatibility with Redis 6.2 remains, we recommend deploying this release with Redis 7.0.x because Redis 6.2 is expected to reach end of life in 2024.

  • OpenSearch is now supported as the default search engine for ÃÛ¶¹ÊÓƵ Commerce on-premises and cloud deployments. It is supported as an independent search engine for Magento Open Source. This release supports OpenSearch v2.x and has been tested with OpenSearch 2.5. Although compatibility with OpenSearch 1.x remains, we recommend using this release with OpenSearch 2.x. You can install and run ÃÛ¶¹ÊÓƵ Commerce and Magento Open Source 2.4.6 with OpenSearch 2.x on both Cloud and on-premises Search engine prerequisites.

  • Elasticsearch 8.x. See Upgrade Elasticsearch.

  • MariaDB 10.6 (LTS version). This release is still compatible with MariaDB 10.4, but we recommend upgrading to MariaDB 10.6.

Other upgrades and replacements

  • The DHL schema has been migrated from v6.2 to v10.0.

  • Outdated JavaScript libraries have been updated to their latest versions, and outdated dependencies have been removed. These changes are backward compatible.

  • PHP 7.4 compatibility has been removed from the Commerce codebase.

  • Symfony dependencies have been upgraded to the new LTS version. Dependencies include:

    • friendsofphp/php-cs-fixer
    • symfony/console
    • symfony/event-dispatcher
    • symfony/finder
    • symfony/process
    • web-token/jwt-framework
  • jquery-migrate has been removed from the Commerce codebase.

  • Upgraded jQuery/fileUpload library to v10.32.

  • Zend framework (ZF1) components that have reached end of life have been removed from the codebase. See .

  • Laminas dependencies have been updated to support PHP 8.2.

  • The laminas/laminas-dependency-plugin Composer plugin has been removed.

  • Replaced Zend_Filter with laminas/laminas-filter.

  • Upgraded web-token/jwt-framework to v3.0.5. (latest version)

  • Upgraded allure-framework/allure-phpunit to v2.x.

  • Upgraded the Chart-js library to v3.9.1

Performance and scalability enhancements

  • Improved performance for operations affecting many customer segments. Merchants can improve the performance of operations involving more than 100 customer segments by enabling a new configuration setting. The Real-time Check if Customer is Matched by Segment setting can be disabled as needed to reduce processing time by reducing validation of each customer segment against customers. See Customer segments validation.

  • New system configuration setting for limiting number of products displayed in product grid. Merchants can use the new Limit Number of Products in Grid configuration setting to improve product grid performance. This limit is configured to 20000 by default and affects only product collections that are used by UI components. Limiting the number of products displayed can boost performance of operations for grids populated with more than 200,000 products. See Limit number of products in grid

  • Improved import performance (up to 100,000 records per minute). Merchants can use the new POST /rest/<store_view_code>/V1/import/csv REST API endpoint to import data into ÃÛ¶¹ÊÓƵ Commerce. This endpoint provides the same capabilities as the Admin import feature and supports using a CSV file to create, update, and remove products, product pricing, and customer entities. See .

  • Improved high-throughput order processing performance through load balancing. ÃÛ¶¹ÊÓƵ Commerce 2.4.6 on cloud infrastructure customers who have a high volume of simultaneous orders (1000 orders per minute) can now improve order processing performance by balancing the load on their database across different nodes. Merchants can re-balance this load by enabling secondary connections for the MySQL database and Redis instances. See High-throughput order processing

ÃÛ¶¹ÊÓƵ Commerce Extension metapackage

This release introduces the ÃÛ¶¹ÊÓƵ Commerce Extension metapackage v1.1.0, which automatically bundles select ÃÛ¶¹ÊÓƵ Commerce extensions with this core release. The versions of these extensions that are included in this metapackage are installed when composer update is run, simplifying the process of upgrading these extensions when upgrading to the latest core release. These extensions will still maintain independent release schedules.

The ÃÛ¶¹ÊÓƵ Commerce Extension metapackage for ÃÛ¶¹ÊÓƵ Commerce 2.4.6 includes these two extensions:

Future versions of this extension metapackage will contain additional extensions.

ÃÛ¶¹ÊÓƵ I/O Events for ÃÛ¶¹ÊÓƵ Commerce

ÃÛ¶¹ÊÓƵ I/O Events for ÃÛ¶¹ÊÓƵ Commerce captures Commerce events and transfers data from ÃÛ¶¹ÊÓƵ Commerce to other ÃÛ¶¹ÊÓƵ systems. Developers can build cloud-native apps in ÃÛ¶¹ÊÓƵ Developer App Builder that subscribe to Commerce events such as inventory updates, order status changes, and price updates. Developers can use this capability to exchange data for the orchestration of the entire buyer journey across their mission-critical systems.

Accessibility updates

The focus of this release has been on creating a storefront experience on Venia (PWA) that is more perceivable, operable, understandable, and robust. These enhancements include:

  • The visual text label for the Sign in button now matches its accessible name. (Best practice recommends that a UI element’s accessible name starts with the visible label text.)
  • Descriptive accessible names have been added to buttons throughout the storefront.
  • Verbal descriptive labels have been added to the Has Video checkboxes in search filters.
  • Keyboard-only users can now access all page functionality on the storefront. Previously, shoppers could not access sub-navigation links using only keystrokes.

ÃÛ¶¹ÊÓƵ Commerce integration with ÃÛ¶¹ÊÓƵ IMS

The following ÃÛ¶¹ÊÓƵ IMS modules have been decoupled from the ÃÛ¶¹ÊÓƵ Commerce 2.4.6 core code and are now packaged as a separate metapackage:

  • adobe-ims
  • adobe-ims-api
  • admin-adobe-ims

The new adobe-ims-metapackage v2.2.0 is bundled with ÃÛ¶¹ÊÓƵ Commerce 2.4.6. No functionality has changed in this release.

B2B

The Purchase Orders for Companies feature is now fully exposed by the GraphQL API. This release introduces two GraphQL schemas:

  • Purchase Order GraphQL schema covers B2B company user Purchase Order Management functionality such as creating, editing, and deleting purchase orders. See .
  • Purchase Order Rule GraphQL schema provides the ability to create, edit, and delete approval rules as well as to manually validate purchase orders. See .

This release includes multiple bug fixes. See B2B Release Notes.

Braintree

  • The Pay Later button and banners (messages) for Italy and Spain have been enabled for Braintree.
  • PayLater messaging with PayPal Vault has been enabled.
  • Added Fraud Protection and ACH web hooks. The Fraud Protection web hook is triggered when a risk decision has been made in Braintree. The ACH web hook is triggered when the status of an ACH payment is updated to settled or settlement decline.
  • Added LPM (Local Payment Methods) web hook.

GraphQL

GraphQL performance enhancements include:

Improved response time when querying categories with category permissions enabled. Response times have improved when querying products in categories for which category permissions are enabled and that contain many customer groups or shared catalogs. Code changes that support this performance improvement include:

  • GraphQL resolver operation has been optimized.
  • The data provider no longer re-sets runtime-cached data for every new product being processed, which has improved performance.
  • Product permission processing has been optimized in the GraphQL resolver. Product permissions are now applied to product collections instead now on a per-product basis.
  • Optimized permissions read in shared catalogs in the addProductsToCart mutation.
  • Product permissions have been optimized with product inline fragments.

Optimized performance of category tree rendering. The categoryList query has been optimized to support customers with a large number of categories. Merchants using this query to search more than 1500 categories with up to five levels of nested subcategories will notice a performance improvement. The loading of category children by refactoring code has been improved by removing unnecessary method calls, improving caching of the category tree, and loading category data recursively. Code changes that support this performance improvement include:

  • Custom attributes metadata fetching for category models has been improved.
  • Category ID fetching has been improved, and getChildren calls have been reduced.
  • Category children loading has been improved.

Reduced bulk cart operations query response times. The add product mutations have been optimized to improve query performance when adding up to 500 simple and configurable products. Bundle products are not affected. The optimized mutations include addProductsToCart, addConfigurableProductsToCart, addDownloadableProductsToCart, addSimpleProductsToCart, addVirtualProductsToCart,addWishlistItemsToCart, and updateCartItems.

customer query now supports order sorting. The orders output object of the customer query now contains a sort field. You can now sort orders by order number or creation date and in ascending or descending order.

New mutations:

deleteCustomer

Page Builder

Page Builder v.1.7.3 is compatible with ÃÛ¶¹ÊÓƵ Commerce 2.4.6.

PWA Studio

PWA Studio v.13.0.x is compatible with ÃÛ¶¹ÊÓƵ Commerce 2.4.6. It includes multiple enhancements to improve accessibility. For information about bug fixes, see . See for a list of PWA Studio versions and their compatible ÃÛ¶¹ÊÓƵ Commerce core versions.

Known issue

Issue: New Relic is not currently compatible with PHP 8.2. Deployments running New Relic can run ÃÛ¶¹ÊÓƵ Commerce 2.4.6 on PHP 8.1 but not PHP 8.2. Workaround: Run ÃÛ¶¹ÊÓƵ Commerce 2.4.6 on PHP 8.1 until a new version of New Relic is released that supports PHP 8.2. This release is expected Summer 2023.

Fixed issues

We have fixed hundreds of issues in the ÃÛ¶¹ÊÓƵ Commerce 2.4.6 core code. A subset of the fixed issues included in ÃÛ¶¹ÊÓƵ Commerce 2.4.6 is described below.

Installation, upgrade, deployment

  • Static content deployment no longer times out or fails during standard or compact deployments with multiple locales and websites.
  • Compact strategy no longer causes an invalid reference to an external domain when running static content deployment (bin/magento set:static-content:deploy -f --strategy compact).
  • Executing bin/magento setup:di:compile -vvv (or with the -v or -vv options) now returns an informative message on failure.
  • ÃÛ¶¹ÊÓƵ Commerce no longer throws the following exception when you run the bin/magento setup:upgrade command in a deployment already running the data migration tool: PHP Fatal error: Declaration of Migration\Logger\Logger::addRecord(int $level, string $message, array $context = []): bool must be compatible with Monolog\Logger::addRecord(int $level, string $message, array $context = [], ?Monolog\DateTimeImmutable $datetime = null): bool in /var/www/html/vendor/magento/data-migration-tool/src/Migration/Logger/Logger.php on line 34.
  • The bin/magento setup:db:status command no longer fails in environments running MySQL 8.0.29. Previously, command output stated erroneously that the declarative schema was outdated.
  • The composer install command no longer overwrites .gitignore files.
  • Running bin/magento sampledata:remove to remove sample data after upgrade on Alpine Linux no longer fails with this error: Undefined constant "MagentoHackathon\Composer\Magento\Deploystrategy\GLOB_BRACE.
  • bin/magento setup:upgrade now executes successfully after first executing composer install --no-dev.
  • Exceptions and exception stack trace entries are now included in var/log/exception.log.
  • ÃÛ¶¹ÊÓƵ Commerce now throws a parameter validation error when you use the command line to set a Redis connection without a password.

Accessibility

  • The Proceed to Checkout, Review Order, and Place Order buttons in the checkout workflow now work as expected with keyboard input.
  • Visual indication of focus on buttons when using TAB or SHIFT + TAB to navigate through page controls now works as expected.

Screen readers

  • The screen reader for the order history page now reads the correct image description.

Screen readers now announce:

  • Total item count found in search results as expected
  • Logged-in user’s name when a user successfully signs in using keyboard controls
  • Product search result page header now reads the correct value for the <title> element
  • Whether input fields are required
  • Correct current state of accordion elements (collapsed and expanded)
  • When page content has been refreshed after the user has clicked the Create an account button

Bundle products

  • Updating bundle product via API for a specific store view now does not override other store views data for the same bundle product. Previously, bundle product option titles were overridden with the first option title for other store views.
  • Bundled products can now be filtered successfully from Admin Catalog > Products when using a Dutch locale. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error when you tried to filter on Type: Bundle Product: Something went wrong with processing the default view and we have restored the filter to its original state.
  • The products grid no longer throws an exception when bundle products have a special price that exceeds 1000. Previously, when you either searched for the product by SKU or navigated to Catalog > Products, ÃÛ¶¹ÊÓƵ Commerce threw this error: Non Numeric value encountered. )
  • Columns in credit memo and invoice PDFs for orders that contain a mix of bundle and simple products are now rendered correctly. Previously, columns were distorted or misaligned.
  • In GraphQL queries that contain a BundleProduct fragment, the items.options.product object contains data as expected. Previously, the object could be null in some circumstances.
  • Decimal quantities for bundle options are now rendered correctly when Quantity uses decimals is enabled. Previously, only the integer part of the quantity was rendered, not the fractional component. For example, a quantity of 1.5 was rendered as 1.0.
  • GraphQL product queries now return only bundle product options within the scope of the store being queried.
  • Products that are not assigned to categories but that are product options for bundle or grouped products are now returned in responses when the Allow Category Browsing configuration setting is enabled for the customer sending the query.

Cache

  • Full-page cache is no longer flushed after order fulfillment unless the ordered product is out of stock. Previously, the cache was purged for the category whenever a shipment was created.
  • Data is now cached successfully when the L2 cache is configured and remote data is partially evicted. Previously, after flushing only the data cache without hashes of those data, the new cache was not saved while the data hashes existed.
  • Corrected defects in CatalogUrlResolverIdentity and CmsUrlResolverIdentity that prevented caching. This affected route query caching on multiple requests.

Cart and checkout

  • Shoppers can now add an additional item to their cart when their cart contains the minimum quantity of the simple product.
  • REST API calls to retrieve cart data now return the same grand_total and base_grand_total values when the store currency and base currency are the same.
  • The exported value of Maximum Qty Allowed in Shopping Cart now matches the default value set in the Admin configuration setting.
  • ÃÛ¶¹ÊÓƵ Commerce now correctly calculates the grand total for refunds of orders with a discount for shipping.
  • Google reCAPTCHA now works as expected for storefront orders. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed these errors when Google ReCAPTCHA was not first selected before a shopper first attempted to place an order: ReCaptcha validation failed, please try again and No such cart with id = ID.
  • CAPTCHA image refresh now honors the Admin configuration setting and is not triggered when the setting is disabled. Previously, the refresh was triggered whenever the payment method changed regardless of whether the setting was enabled or disabled.
  • ÃÛ¶¹ÊÓƵ Commerce now displays a confirmation popup as expected before redirecting a shopper to the next page when the shopper changes product quantity on the cart page without updating the cart and then tries to navigate to the next page.
  • Shoppers can now decrease a product’s quantity from their cart after it was decreased in the Admin. Previously, ÃÛ¶¹ÊÓƵ Commerce threw the following error when a shopper tried to decrease product quantity: The requested qty is not available.
  • ÃÛ¶¹ÊÓƵ Commerce no longer throws an error in the JavaScript console when product quantity exceeds the configured maximum during multi-shipping checkout. Instead, ÃÛ¶¹ÊÓƵ Commerce now displays an informative error message.
  • Item quantity on the shopping cart page is no longer represented as a negative number when a shopper uses the down arrow key on their keyboard to change product quantity.
  • Shoppers can no longer add to the cart a product from a category that is now disallowed after changing the customer group to which the shopper belongs. ÃÛ¶¹ÊÓƵ Commerce now checks customer group permission access for specific categories when the permission configuration settings have been changed.
  • Customer shopping carts are no longer emptied before Admin order creation, and cart contents are now restored if the order is canceled or abandoned. Items are now removed from the cart only after order creation. Previously, whenever an admin user tried to create an order on the Admin Manage Shopping Cart page, the cart was emptied.
  • The mini cart now displays correct product images after you run bin/magento catalog:image:resize. Previously, all images were replaced by the default product placeholder image.
  • Checkout can now complete successfully when the shipping address contains an extension attribute. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error: Object of class Magento\Quote\Api\Data\AddressExtension could not be converted to string.
  • The addBundleProductsToCart mutation no longer adds products to a quote if a required product option has no value.
  • ÃÛ¶¹ÊÓƵ Commerce now returns an informative message when an addProductsToCart mutation fails when adding a product to the cart with insufficient permissions.
  • ÃÛ¶¹ÊÓƵ Commerce no longer throws an error on the cart page when Quick Order is used to add a product in a quantity that exceeds available inventory.
  • The setGiftOptionsOnCart mutation now requires customer authorization for customer cart operations.

Cart price rule

  • Cart price rule free shipping options that are set during rule creation are now applied to orders as expected. Previously, free shipping options applied during rule created were ignored during checkout, and free shipping was not permitted when the rule was applied.
  • The discount_percent column of the sales_order_item table for a product is now populated as expected with the discount percentage when the item discount quantity is not set or it is greater than or equal to order item quantity. Previously, this column was not populated when a cart price rule was applied to this product.

Catalog

  • The product list widget no longer displays incorrect or cached prices for a logged-in shopper. The price displayed in the home page widget now matches the shopper’s address and is updated when the shopper updates the address. Previously, the browser cache did not update product prices on the home page based on customer group tax rules.
  • The Compare Products list feature now works correctly in a multi-website deployment and is dependent on website.
  • ÃÛ¶¹ÊÓƵ Commerce no longer displays data from the previous page when you reload a product detail page. Previously, when the product detail page was reloaded, data from the first tab was merged with the newly loaded data for a split second.
  • Categories with subcategories can now be expanded in the main menu on mobile devices as expected. Previously, shoppers could not open or expand categories with subcategories in mobile deployments.
  • Category listings are now updated as expected when a product is assigned to a new website or store. Previously, the product price indexer was not marked as invalid and subsequently re-triggered on a cron run as expected. As a result, the product’s price entry was missing from the price index table and was not displayed on the new store or website.
  • The storefront inventory count is now accurate when the Display Out of Stock Products configuration setting is enabled.
  • The category page is no longer empty when the Allow All Products Per Page setting is enabled.
  • The Display Out of Stock Products configuration option now works as expected when enabled. Previously, all products were displayed as out-of-stock on the storefront when this option was enabled on the Admin.
  • Customers assigned to a Wholesale group can now add a grouped product to their cart when permitted by category permissions. If this permission is not defined for a Customer group, the configuration setting takes precedence.
  • Product sorting by Boolean attributes now works as expected.
  • Catalog price rule discounts are no longer applied to fixed price custom product options but are applied to only the product’s original price.
  • Related products are now fetched successfully on the storefront product detail page when generated by the related product rule for alphanumeric product attributes.
  • Catalog price rules now take into account the selected scope and are applied to products only for the websites for which the attribute has an option value that matches the rule. Previously, the rule did not take into account the selected scope in multi-site deployments.
  • The swatch options color and size attributes are now pre-selected in the product detail page when a shopper modifies the configurable product from the My Cart page. (jQuery 3.x version now supports the swatchRenderer widget name, which is now camel case.) Previously, the swatch option is not pre-selected.
  • Customers are now notified for product price drops when the customer is subscribed to the price drop alert. Previously, price drop notifications were not always sent due to application level caching.
  • Catalog rules that are based on SKUs with the is not one of condition now work as expected.
  • ÃÛ¶¹ÊÓƵ Commerce no longer erroneously assumes that one category is the parent category of another based on category path. Previously, when two categories were adjacent and one category ID starts with another category’s category ID, ÃÛ¶¹ÊÓƵ Commerce assumed that the categories had the same parent category.

Configurable products

  • ÃÛ¶¹ÊÓƵ Commerce no longer throws an error when an admin user adds products manually to a configurable product that already has many simple products assigned to it. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error: Something went wrong with processing the default view and we have restored the filter to its original state.
  • Shoppers can no longer add configurable products with a salable quantity of 0 to their shopping cart in deployments with back orders disabled. ÃÛ¶¹ÊÓƵ Commerce now indicates that the product is out of stock.
  • Creating a new product by importing a configurable product with many options from a different store view now results in an exact copy of the first product as expected. Previously, the sort order of the new product’s configurable options was incorrect, and titles were not translated to the new store view’s locale in deployments with multiple store views and locales.
  • Configurable products with all out-of-stock child products are now displayed as out of stock on the storefront.
  • Configurable product SKUs and product names are now displayed accurately. Previously, name and SKUs were displayed as undefined after you moved an attribute group above the Product Details group on Stores > Attribute set.

Coupons

  • Validation logic has been added to the Manage Coupon Codes workflow to enforce the coupon code settings when generating coupons. Previously, coupon code generation ignored the Code Length setting when the Coupon Qty value was greater than 2500.
  • Reward points are now added to a customer’s account as expected when a rewards coupon is applied during checkout with the PayPal Express payment method.
  • You can now apply a coupon code during Admin order creation when the cart price rule has weight as a condition. Previously, coupon codes were not set if other fields were not selected for the product.
  • You can now filter coupon reports by multiple cart price rules.
  • Custom options are now applied and saved when an admin user presses Enter while configuring a product with custom options. Previously, you were able to select options and add the product to an order, but the options were not saved, and the admin user was prompted to re-select product options.
  • Coupon codes can now be successfully exported to Excel XML. Previously, the generated file did not contain all selected coupon codes but only as many items as were selected in the items per page selector.

cron

  • The catalog_index_refresh_price cron job now executes successfully. Previously, ÃÛ¶¹ÊÓƵ Commerce logged this error during cron execution: report.ERROR: Cron Job catalog_index_refresh_price has an error: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens.

Currency

  • A missing space between custom currency symbols and prices has been added to both storefront and Admin product prices. The appropriate condition and regex expression has been added to allow a custom NBSP in currency symbols. For example, IDRx 105.00 was previously displayed as IDRx105.00.

Customer segment

  • The Yes/No filter on the Admin customer segments grid during the creation of a new cart price rule now works as expected.

Email

  • ÃÛ¶¹ÊÓƵ Commerce no longer sends a customer duplicate emails after an order is created from the Admin.
  • Admin order emails are no longer sent when the Email order confirmation setting is disabled.
  • Image options are no longer displayed as HTML markup in the credit memo, order confirmation, and invoice customer emails (default template) for products with custom options.

Frameworks

  • Admin users can now successfully open the Admin Store > Configuration page when no country in the European Union Countries setting (Stores > Configuration > General > Country options > European Union Countries). Previously, when an admin user tried to open this page, ÃÛ¶¹ÊÓƵ Commerce threw this error: TypeError: explode(): Argument #2 ($string) must be of type string, null given in /var/www/php/folder/vendor/magento/module-config/ViewModel/CountryFilter.php:46.
  • jquery.cookie dependencies now work as expected with JavaScript dependencies. Previously, you could not use aliases for jquery/jquery.cookie.
  • The bin/magento i18n:collect-phrases command now includes <title> text in the exported CSV file.
  • Magento\Framework\Code\Reader\ArgumentsReader::getParentCall() now supports named constructor arguments. You can now call a function by setting the parameters by their name.
  • Errors are now logged as expected in the exception.log file. Previously, although errors were logged in the system.log file, errors were not logged in var/log/exception.log.
  • Merchants now have the ability to specify a custom external SMTP provider.
  • OAuth integrations can now be re-authorized as expected on deployments running ÃÛ¶¹ÊÓƵ Commerce 2.4.3-p2. Previously, re-authorization failed with this error: The attempt to post data to consumer failed due to an unexpected error. Please try again later. ÃÛ¶¹ÊÓƵ Commerce also attempted to decrypt unencrypted values.
  • The correct rowId parameter is now passed when the category urlKey is saved for categories that have child categories. Previously, the wrong categoryId was passed when saving the category URLKey.
  • The product attribute code event has been added to the list of reserved product attribute codes, which eliminates errors associated with using an attribute with this name on the storefront. Previously, the application threw this error on the product detail and search/product list pages when event was used: report.CRITICAL: Error: Call to a member function getStatus() on string in /home/mer33515/public_html/ee24develop/magento2ee/app/code/Magento/CatalogEvent/Observer/ApplyIsSalableToProduct.php:23.
  • Storefront validation error messages that occur during order placement are now displayed consistently. Previously, messages appeared, collapsed, then re-appeared.
  • AMQP consumers no longer fail due to a deprecated trim() function on deployments running PHP 8.1. Previously, when the AMQP consumer started after installation, ÃÛ¶¹ÊÓƵ Commerce threw this error: Deprecated Functionality: trim(): Passing null to parameter #1 ($string) of type string is deprecated in .../vendor/magento/framework-amqp/Config.php on line 143.
  • The getFilteredTimerIds method now works as expected. Class Magento\Framework\Profiler\Driver\Standard\Stat is now compatible with PHP 8.1. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an exception when this method was called.
  • Removed dependency on the imagemin-svgo library.
  • The minifying template process now successfully processes consecutive comments when the first comment begins with //.
  • Corrected a database query issued by the BundleGraphQl module that returned this error: "debugMessage": "Notice: Undefined offset: 16 in vendor/magento/module-bundle-graph-ql/Model/Resolver/Options/Collection.php on line 130".

General fixes

  • ÃÛ¶¹ÊÓƵ Commerce now displays an accurate time range when an admin user selects the Last 24 Hours option from the Admin statistics dashboard. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed an incorrect time range. This occurred because the timezone of the database remained unchanged.
  • Credit memos can now be generated for both integer and decimal quantities. Previously, only integer quantities were supported.
  • The Customer Zip Code input validation rule for type numeric only now works as expected in the Edit Customer Address field (Store > Attribute > Customer Address). Previously, customer address information was saved without zip code validation.
  • Admin users with access restricted to one website can now successfully log in to the Admin using the Login As Customer feature.
  • Globally shared customer accounts now have addresses that are validated against the list of allowed countries for the current website and saved successfully. Previously, these accounts were incorrectly validated against the allowed countries of the website where customer was registered.
  • Breadcrumbs from the CMS page hierarchy are no longer displayed when Enable Hierarchy Functionality is disabled. Previously, breadcrumbs were displayed, and when shoppers clicked on them, a 404 page was displayed.
  • Removing a product from all websites via the Admin no longer causes the following error: SQLSTATE[42000]: Syntax error or access violation.
  • Customers who exceed the maximum login failed attempts can now log in after password reset.
  • The dynamic rows component now behaves as expected when an admin user adds a new element. Previously, the row component behaved incorrectly when a new simple product was added to a grouped product.
  • Corrected typos and incorrect grammar in the app/code/Magento/Backend/etc/menu.xsd file.
  • The app/code/Magento/Authorization/README.md file has been updated to accurately describe table creation.
  • The recordLogin method has been updated to set login values on the user model as well as preserving the correct values in the logdate and lognum fields of the admin_user table. Previously, login attempts for updated Admin users were not recorded.
  • GitHub issue templates have been converted to issue forms for developer experience issues and feature requests.
  • The Is required customer attribute is now implemented properly per website scope for the Admin customer edit form.
  • The Grid Filter Condition Type field of customer and customer address attributes is no longer visible on the attribute edit page when the Use in Filter Options setting is disabled.
  • ÃÛ¶¹ÊÓƵ Commerce now displays an informative error message if a merchant fails to enter an optional SKU attribute value when creating a product. Previously, the application threw this exception when the attribute was optional: Deprecated Functionality: trim(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/html/mg244/project-community-edition/vendor/magento/module-eav/Model/Entity/AbstractEntity.php on line 932.
  • The Show my quotes filter on the My Quotes page now works as expected. Previously, filter results included other admin users’s quotes.

Gift cards

  • Gift card product amounts now remain the same as the amount specified in a CSV file during import. Checks for existing options have been added and former values are now updated based on a unique key. Previously, gift card amounts were doubled when gift cards were imported multiple times.

Gift wrap

  • Gift wrap price is now displayed as expected in the order summary block when gift wrap has been applied on the order level to an order that contains both physical and virtual products. Previously, ÃÛ¶¹ÊÓƵ Commerce did not display the gift wrapping price.

GraphQL

  • Types that implement multiple Interfaces in GraphQL code can now separated by an & sign as well as , in accordance with the GraphQL @docspecification.
  • The setShippingAddressesOnCart mutation now supports setting numeric region codes as region. Previously, this mutation worked incorrectly for numeric region code values.
  • The products query now returns only reviews associated with the specified scope. Previously, queries returned reviews from all stores.
  • Category permissions are now respected during GraphQL requests.
  • The customer query now filters on orders with a specified from and to range correctly.
  • The product query now returns correct category data in aggregation. Previously, attribute_code.category_uid returned the value of category_id instead of category_uid.
  • The customerOrders query no longer throws an \"model\" value should be specifiederror.
  • The customer query now filters orders based on scope. You can now specify whether the query should filter orders by store, website, or globally.
  • The categoryList query now returns an accurate product count for both anchored and unanchored parent categories. The new is_anchor attribute has been added to the category collection selected columns list. Previously, requests returned a 0 product count.
  • The generateCustomerTokenAsAdmin mutation now works as expected when creating a token to log in to a non-default store in a multi-store deployment.
  • The createEmptyCart mutation now throws an exception as expected when an expired token is used.
  • Cart query error messages have been made more informative.
  • Aggregation data in the response of a products query now includes correct values for price type attribute attribute_code and label.
  • The products query returns category information as expected when the database prefix has a non-null value. Previously, it returned an Internal server error.
  • Corrected the return type for the getCustomerIsGuest method.
  • The Magento\CatalogGraphQl\Plugin\DesignLoader plugin as been refactored.
  • Cart reload is now triggered once only as expected when the cart is initialized by GraphQL mutations. Previously, cart loading triggered unnecessary cart revalidation against stock inventory, which consumed significant resources every time the cart was loaded.
  • Added the gift_message type to the OrderItemInterface.
  • Product options returned in GraphQL responses now include only the products that are within the catalog to which the user belongs. If the user belongs to a shared catalog, then only products in shared catalogs are returned. If user is a guest or not part of a custom shared catalog, then only products in public catalog are returned.

Google ReCAPTCHA

  • A reCAPTCHA error in the var/log/exception.log file for the Google V3 reCAPTCHA Admin login has been resolved, and no error messages are logged. Previously, the following error was thrown every few seconds when an admin user configured their Configuration > Security > Google reCAPTCHA Admin Panel settings: main.ERROR: Can not resolve reCAPTCHA parameter. {"exception":"[object] (Magento\Framework\Exception\InputException(code: 0): Can not resolve reCAPTCHA parameter. at /home/xxxxxxx/public_html/vendor/magento/module-re-captcha-ui/Model/CaptchaResponseResolver.php:25)"} [].

Image

  • Updated the recommendations on the logo size for PDF Invoice slip.

Import/export

  • Importing a product with the same numeric URL key as an existing product but without its terminal alphabetical character no longer causes a validation error when the Product URL Suffix is set to empty in the Admin.
  • The bin/magento app:config:importcommand now successfully imports the contents of a config.php file when it contains certain cron expressions. Previously, import failed with this error: Import failed: Notice: Trying to access array offset on value of type null in [..]/vendor/magento/module-config/Model/Config/Backend/Currency/Cron.php on line 66.
  • Full export now works correctly when AWS S3 is used as remote storage. Previously, export failed due to the uploaded file size.
  • Product status is now imported correctly when inventory data columns in the CSV file are missing. Previously, after product import, default source was automatically assigned to the product, its quantity was set to zero, and its status was listed as out of stock when inventory data columns in the CSV file were missing.
  • Importing advance pricing values now provides the correct count for new and updated records when the import includes more than 100 records. Previously, the import success message provided the wrong count.
  • Exported CSV files now contain correct paths to category names that are saved in multiple languages. A store ID has been added for category collection. Previously, the exported files contained mixed paths with different languages instead of a category path derived from the default store view.
  • Updating custom options for a product in a specific store view via import now completes successfully. Previously, an internal server error was thrown if a product-related rows were split into multiple batches.
  • The Fixer.io import service now works as expected. Currency rates are now imported successfully.

Index

  • Indexer batch_size for the catalogpermissions_category index is now changed to the value provided in the env.php file as expected. Previously, a typo in the path for indexer batch_size override prevented changing the batch size to the value provided in env.php.
  • Price re-indexing now runs successfully when the catalog contains bundle products are not assigned to any website. Previously, the following error occurred when the product price index ran: Warning: Undefined array key <bundel product id > in vendor/magento/module-bundle/Model/ResourceModel/Indexer/Price/DisabledProductOptionPriceModifier.php on line 117.

Infrastructure

  • Added sanitization of DATE and DATETIME values in database dumps for ÃÛ¶¹ÊÓƵ Commerce support. Previously, datetime type fields were not sanitized for customer/quote/order tables in the database backup table.
  • The escaper.js escapeHtml function now converts the ampersand (&) special character into "$amp;" per the InnerHtml rule. This generic solution solves special character and character references conversion issues in the title input box and saves the exact value as inserted. Previously, ampersand (&) characters were incorrectly encoded in node names in the content hierarchy.
  • Issues with the third-party colinmollenhour/php-redis-session-abstract module and PHP 8.1 have been resolved.
  • The legacy Media Gallery is now disabled by default. Previously, Enable old Media gallery was set to Yes.
  • The New Media Gallery has been optimized to improve loading of the directory tree in the category page.

Logging

  • You can now generate system reports for log files of 0 bytes. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an error when generating a report for a collection of log files when one or more files were empty.

Order

  • The Admin sales order credit memo page now displays the correct grand total for orders created with Store Credit and multiple invoices. Previously, the grand total calculation was incorrect, and the user could not generate a credit memo.
  • The order prefix that is passed in the installation script is now added correctly to the order ID.
  • The order details page now successfully loads when the order contains a product with a long custom text value. Previously, the order details page did not load, and the value in the sales_order_item.product_options column was not stored properly if a product contained a long value for a text custom option.
  • Storefront order status is now accurate for partially refunded orders. Previously, an order remained in the processing state after shipment when a partial refund was applied.
  • Customer group is now represented accurately as Not Logged in for an order created by a guest user. Previously, customer group was NULL in guest order summaries, which affected confirmation emails and order export.
  • A status of Closed is now assigned to virtual orders as expected after a credit memo has been issued and the customer is refunded. Previously, virtual products were displayed as Complete in the Status drop-down but Closed in the footer of the order comments when the comment was added from the Admin.
  • Guests can now place orders for products with a quantity of less than one, and product quantity is now strictly typed as float. Previously, because product quantity was strictly typed as int, orders for a product quantity less than one failed with this message: Some of the products are disabled.
  • Shipping refunds are now correctly calculated when the Apply discount on prices configuration option is set to including taxes.
  • Invoice, shipment, and credit memo grids are now updated asynchronously after orders are archived.
  • Duplicate orders no longer result from concurrent, identical GraphQL requests. Quotes are now locked for up to 10 seconds to prevent duplicate order creation, and the second request fails with these errors: The cart isn't active or The order has already been placed and is currently processing. This lock value can be configured through di for the Magento\Quote\Model\PlaceOrderMutex class lockWaitTimeout parameter.
  • Adding a comment to an archived order no longer returns it to the unarchived orders grid while keeping its archived status.
  • Company attribute values are now displayed as expected in the billing and shipping address sections of the checkout workflow. Previously, company attributes were not displayed properly on the order detail page because stores were not set properly during order creation. Attribute values were stored correctly only when the Show Company property was set to optional for Main Website in multi-store deployments.
  • The customer_address_id value is now set as expected for a new billing address when My billing and shipping address are the same checkbox is checked. An additional condition has been introduced to identify whether the billing address is same as shipping address before setting the customer address ID for the shipping address.
  • Concurrency issues with order placement have been resolved. Previously, if two orders were placed from different browsers at the same, or nearly the same, time, both orders were assigned the same order ID.
  • Placing an auto-invoiced order for a free product when asynchronous indexing is enabled now works as expected. No entries are added to the sales_order_grid or sales_invoice_grid table for these orders. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an exception because the application tried to index the grids during order placement instead of relying on cron.

Page Builder

  • You can now use the Page Builder drag-and-drop feature to bulk import images into the gallery.
  • Issues with the Page Builder slider CSS rule have been resolved.
  • Dropdown, Text area, and Text field attributes are now available in the Page Builder product attribute list. Previously, only Dropdown and Text area attributes were available.

Payment

  • The COD payment method is no longer rendered on the storefront checkout workflow when COD is exempted for the country specified in the shipping and billing addresses. Previously, Admin configuration settings for this feature were not implemented.
  • Vault payment information is no longer shown in the Payment section of Admin order creation workflow if the shopper has not saved a token.
  • Custom prices are no longer doubled after a discount is applied by cart price rule.
  • New order pending status is now honored as expected when an order is placed using the Zero Subtotal Checkout payment method.
  • Guest email settings are now respected during order creation for a guest shopper with PayPal Express via GraphQL. Previously, the email address set was overridden by the email address set in the PayPal account.

Braintree

  • Order IDs are now added to settlement requests for payment transactions.
  • ÃÛ¶¹ÊÓƵ Commerce no longer throws the following error when a merchant clicks on Reports > Braintree Settlement: Error: Undefined constant Braintree\PaymentInstrumentType::ANDROID_PAY_CARD in /var/www/html/vendor/paypal/module-braintree-core/Ui/Component/Report/Listing/Column/PaymentType.php:49.
  • The customerPaymentTokens query no longer returns Braintree tokens when the vault is turned off on the Admin.
  • The Pay Later button and banners have been enabled for Italy and Spain.
  • Admin users can now create an order or reorder when the Braintree payment method is enabled. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error: report.CRITICAL: Error: Call to a member function getMethodInstance() on null in /app/vendor/paypal/module-braintree-core/Block/Form.php:174.
  • Checkout using Braintree payment method now completes successfully when Braintree PayPal is enabled and Enable Card Payments is disabled. Previously, the progress bar never resolved, and ÃÛ¶¹ÊÓƵ Commerce displayed this console error: adapter.js:66 Uncaught TypeError: Cannot read properties of undefined (reading 'clientToken')at Object.getClientToken (adapter.js:66:66).
  • Fraud protection, ACH payment, and local payment method web hooks have been implemented. The fraud protection web hook Is triggered only if a risk decision has been made in Braintree. The ACH web hook is triggered only after an ACH payment has updated to settled or settlement decline.
  • The Tagline and Layout configuration fields have been removed from all PayPal buttons in the Admin Styling section.
  • The Braintree Vault payment method option remains selected in the checkout workflow when a shopper updates their billing address. Previously, the payment method was deselected when the shopper deselected the My billing and shipping address are the same button.
  • Line items are now passed for PayPal transactions when the Send Line Items configuration setting is enabled from the Admin.
  • Validation logic on the ACH payment method Account Number field now supports four to 17 digit text.
  • The customerPaymentTokens query no longer returns Braintree tokens when the vault is turned off from the Admin.
  • Admin users can now create an order or reorder for customers when the Braintree payment method is enabled. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error: report.CRITICAL: Error: Call to a member function getMethodInstance() on null in /app/vendor/paypal/module-braintree-core/Block/Form.php:174
  • Shoppers can now use the Braintree payment method in storefronts where Enable Card Payments has been disabled. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this JavaScript error: _adapter.js:66 Uncaught TypeError: Cannot read properties of undefined (reading 'clientToken')at Object.getClientToken (adapter.js:66:66).

Performance

  • The price indexer now deletes outdated data as expected after replacing records during partial re-indexing of large catalogs. Previously, the re-indexing process removed outdated records before replacing them, which caused products to occasionally disappear temporarily from the storefront.
  • The performance of the bin/magento/setup:upgrade command has been improved. Previously, this command recreated the database triggers, which caused significant downtime during command execution. Additionally, the indexers did not revert back to the scheduled mode and remained in save mode.
  • Updating tier prices by API now executes faster. Previously, updating tier prices generated unnecessary SELECT queries, which delayed execution when many customer groups were assigned to a product.
  • Loading of pages that include the catalog widget product list has been optimized. Previously, non-global attributes were loaded directly from the database.

Reports

  • The Admin log report now shows an accurate Value before change value when a category rule is updated.
  • The Order Total report from and to dates are now displayed properly after selection from the date picker.
  • The ANDROID_PAY_CARD constant in Braintree/Ui/Component/Report/Listing/Column/PaymentType.php has replaced GOOGLE_PAY_CARD. This resolves issues with the Braintree report.

Return Merchandise Authorizations (RMA)

  • The RMA comment field (Orders > Return) no longer contains redundant whitespace. (The <textarea> and <?php tags are now on one line.
  • The Use Config Settings checkbox for the Enable RMA field now saves its value as expected when a product is saved.

Reviews

  • Admin users with restricted access to a specific scope can now delete product reviews as expected.

Roles

  • Added a missing ACL for Stores > Configuration > Services > OAuth. Previously, you could not define access to this OAuth configuration setting when setting up role permissions.

Search search-heading

  • Searches for strings within quotation marks now work as expected when the Minimum Terms to Match configuration setting is enabled. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this error: {"error":{"root_cause":[{"type":"parsing_exception","reason":"[match_phrase] query does not support [minimum_should_match]' ....
  • The Signed up point search filter for customer records on the sales order customer grids now works as expected during order creation.
  • The quality of search suggestions has been improved for multi-word queries.
  • Search results now include out-of-stock option outputs for all available products when Display Out Of Stock Products is enabled

Shipping

  • Shipping rates for FedEx, USPS, and UPS are calculated correctly when the Free Shipping Cart rule is set to match only a subset of items in the cart.
  • The Admin shipping page no longer displays the free shipping option when the order total is less than the specified minimum order amount that is eligible for free shipping.
  • ÃÛ¶¹ÊÓƵ Commerce now honors the Admin customer Show Company configuration setting when displaying shipping or customer address. When this setting is disabled, the shipping company is no longer included in the shipping, customer address, or in the database order record. Previously, the information was displayed despite setting disablement.
  • Removed a superfluous save operation on quotes when estimating shipping.
  • storeId scope is now applied directly from $request->getStoreId() to ensure that scope is not lost when a quote is created by an admin user. Previously, problems occasionally occurred with shipping methods when a quote was created from the Admin using third-party modules.
  • SEO-friendly URLs are now generated for products whose url_key setting is overridden on the store-view level. Previously, category product URLs were not redirected to SEO-friendly URLs.
  • ÃÛ¶¹ÊÓƵ Commerce no longer throws a minimum order amount error when a discount is applied to shipping costs.
  • Shipping refunds are now calculated correctly when tax is applied after a discount has been applied to shipping.
  • All applicable promotions for a requested cart through GraphQL cart query are returned together. Promotions include line item discounts, cart rules/discounts, coupons, gift cards, and store credit.
  • Added the price_excl_tax and price_excl_tax types to the output of the setShippingMethodsOnCart mutation.
  • Unique shipping IDs are now passed in GraphQL responses as expected with shipping details for orders shipping to multiple addresses for GraphQL queries.

Staging

  • Rescheduling a staging update’s end date no longer results an error after the update is completed. Previously, administrators could not open product pages and product grids, and ÃÛ¶¹ÊÓƵ Commerce threw this error: report.CRITICAL: Exception: Item (Magento\Catalog\Model\Product\Interceptor) with the same ID "1" already exists.
  • The staging dashboard now displays the correct total number of records, and dashboard pagination now works as expected. Previously. the dashboard displayed a maximum of 20 records.
  • Content staging previews now load faster in deployments with many stores. Preview re-indexing now re-index only selected stores.
  • Products can now be added to the shopping cart in scheduling preview mode. Updating breadcrumbs links in scheduling preview mode with these parameters corrected this issue: version, timestamp, and signature.

Tax

  • The Display Zero Tax Subtotal configuration setting is now applied as expected for orders in deployments offering multiple shipping methods. Previously, the zero tax field was visible on the cart page during checkout before a shipping method was selected even when this setting was disabled.
  • ÃÛ¶¹ÊÓƵ Commerce can now display grouped products with tax on the storefront category page in deployments running PHP 8.1. Previously, ÃÛ¶¹ÊÓƵ Commerce did not display a list of products and threw this exception: main.CRITICAL: Exception: Deprecated Functionality: ucfirst(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/m24/vendor/magento/module-tax/Pricing/Render/Adjustment.php on line 188 in /var/www/m24/vendor/magento/framework/App/ErrorHandler.php:61.
  • Merchants can no longer move a scheduled update to another update that contains the same rule ID. Previously, schedule updates for cart price rules created duplicate schedules when an update was moved to another update that contained the same rule ID.
  • Automatic customer group assignment now works when there is no VAT ID associated with the customer’s address. If the address does not contain a VAT ID, it is treated as belonging to a non-VAT registered customer, and ÃÛ¶¹ÊÓƵ Commerce changes the customer group to a non-VAT group. Previously, when Enable Automatic Assignment to Customer Group was enabled, the customer account was not automatically assigned to the customerGroup when the VAT ID was deleted from the customer account.
  • The correct dynamic blocks are now shown for staged catalog rules in staging preview mode. Previously, unrelated dynamic blocks were shown.
  • Multiple taxes are now rendered correctly in the Tax Summary section of invoices and credit memos when multi-shipping is applied during checkout.
  • Discounts are no longer applied when an order subtotal including tax along with Fixed Product Tax amount exceeds the cart rule condition on the cart page. Previously, discounts were applied even when the total exceeded the cart rule condition.
  • You can now specify a vat_id when using GraphQL to add or update the address of a guest shopper.

Test

  • Fixed unit tests errors for different versions of the ICU and libxml libraries.
  • Developers can now instruct the system to execute a data fixture in a specific store view. The new optional parameter scope accepts a string that corresponds to the store fixture alias.
  • Added the ability to generate multiple instances of a data fixture using the optional count parameter.
  • Removed non-native array_first function from dev dependencies in the MFTF framework.

Translations and locales

  • Inline translation now works correctly with special characters including extended unicode characters in phrases located in SCRIPT tags. Previously, Japanese characters were rendered incorrectly in edited script when using inline translation.
  • The ñ character in a product name is now converted to n during URL key generation.
  • The output of running bin/magento i18n:collect-phrases now includes mail template translations in depend constructs as expected.
  • Japanese characters can now be directly entered into the product page attribute set (combo box). Previously, directly inputting Japanese characters in this combo box resulted in changed or deleted characters when running the Firefox browser on MacOS. The textInput HTML attribute, which can better handle Japanese character conversion in all browsers, has replaced the Value and valueUpdate attributes.
  • The getOptions method now correctly fetches price attribute label values based on store view. Previously, the price attribute was translated during GraphQL operations for the incorrect store view.

UI

  • Website-specific currency is now used as expected for Special Price, Cost and MSRP columns in the Admin products grid. Previously, the correct currency symbol was not displayed in the Admin catalog product grid when filtering by the store view for a special price.
  • The drag and drop functionality of product custom options now works as expected. You can now move a customizable option from one page to another when there are multiple pages available in the customizable option grid.
  • Admin dashboard charts now display YTD time intervals from the beginning of the current calendar year to the current date as expected. Previously, date ranges included over 12 months.
  • A missing default favicon on the storefront home page has been added.
  • The Admin now successfully displays the latest login date of each admin user. Previously, when an admin user logged in to the Admin for the first time, an empty login date value was displayed on the Admin user grid.
  • The preview email template feature (Marketing > Communications > Email Templates) now displays templates correctly. Previously, the preview image was truncated.
  • Added the new-shipping-address-modal class to support styling of the new shipping address modal.
  • Added informative text beneath the Search Weight ²¹³Ù³Ù°ù¾±²ú³Ü³Ù±ð’s Storefront Properties input field on Admin Stores > Attributes > Product.
  • Email previews now open in a separate tab instead of a popup window, which provides a wider view of the email content. Previously, email content was truncated.
  • The filter function for the user role grid (Admin System > Permissions > User roles > Administrators) now works as expected. The array value is now handled separately. Previously, when you tried to enter a query in this grid, ÃÛ¶¹ÊÓƵ Commerce threw this console error, and the page did not load: Uncaught TypeError: Cannot read properties of null.
  • Validation for attribute values has been added when creating a customer through the REST API. The creation process now fails when invalid attributes values are provided. Previously, there was no validation for gender, which is not a required field. During customer creation, the value that was passed in for gender was saved in the customer_entity table.
  • Addresses added during checkout now keep their expected format. Previously, blank lines were ignored.
  • Changing the product grid’s columns grid view and selecting new columns for a custom view no longer triggers a Select All Grid Columns action. Previously, the column box disappeared, and products in the grid were selected or deselected.
  • Admin users can now clear the Admin completed tasks log successfully. Previously, the Admin displayed this error: Something went wrong.
  • The theme Header setting Welcome Text can now contain a single quote character. Previously, ÃÛ¶¹ÊÓƵ Commerce threw this JavaScript error: Uncaught SyntaxError: Unable to process binding "ifnot: function(){return customer().fullname }".

URL rewrites

  • Changing product visibility to Not Visible Individually in the global All Store Views scope now removes only URL rewrites for store views that have not overridden the visibility attribute. Changing product visibility in this way also generates URL rewrites for all store views including those that have overridden the URL key attribute (but not the visibility setting). Previously, URL-rewrite rules were not applied when visibility settings changed.

Visual Merchandiser

  • You can no longer manually change product positions in Visual Merchandiser category listings when products are matched by rule.
  • Admin users with access restricted to only one store can no longer drag and drop products within a category in Visual Merchandiser. Instead, they can now use the Position column to re-arrange product position. Previously, these users could change product position within a category only by drag and drop.
  • The Products in Category section of the category edit page now displays the correct quantity of configurable products. The correct table column is now used to retrieve configurable products quantity.

Web API framework

  • The REST API DELETE /rest/V1/products/:sku/media/:entryId now returns an error message if the image is not removed from the product because it is assigned to a role in other store views. Previously, the API returned a successful response even when the image was not removed successfully.
  • Merchants can now use the REST API to create a credit memo for an order with zero grand total. Previously, ÃÛ¶¹ÊÓƵ Commerce displayed this error: The order does not allow a credit memo to be created. The credit memo's total must be positive. We can't create a credit memo for the invoice/order.
  • The Admin product edit page now accurately reflects a product’s assignments after the product’s website assignment has been changed using the REST API.
  • Duplicate option IDs can no longer be included for multi-select attributes during bulk REST API requests to update products. Previously, you could set duplicate option IDs for multi-select attributes when sending a bulk API request to update a product. When that multi-select attribute was configured for inclusion in layered navigation, EAV indexing failed with a Duplicate entry error.
  • Product names in shopping carts now use the specified store view’s values as expected. Previously, product names in the cart always returned the default store view value in REST API cart responses.
  • Cart item custom option values can now be updated using the REST API.
  • Bulk API requests for more than 20 sourceItems now complete successfully in deployments where Inventory is enabled.
  • The Fixer currency service now works as expected with keys generated via ApiLayer, and currency rates are exported correctly. Previously, ÃÛ¶¹ÊÓƵ Commerce threw an error when a merchant tried to import currency rates through the Admin.
  • You can now use the REST API /rest/V1/bulk?searchCriteria[filter_groups] request to query bulk operations by search criteria. Previously, the following error was returned: report.CRITICAL: Report ID: webapi-624bbb1db96c4; Message: Item (Magento\AsynchronousOperations\Model\Operation) with the same ID "0" already exists.
  • Product prices are now updated correctly on both the Admin and storefront catalog search pages using the Manage Base Price API.

Wish list

  • Shoppers can now add products to their wish list after logging in. Previously, due to issues with form key validation after log in, the form key submitted with the add-to-wishlist request was invalidated.
  • Products are now added as expected to the wish list from product list and view pages after a guest customer confirms their account from a confirmation email. Previously, products were not added to the wish list after account confirmation.
  • The addProductsToWishlist query now returns an informative error message when a shopper tries to add an item to a wish list with an invalid value for the product select custom option. Previously, server validation for the dropdown custom option value was missing, which lead to an invalid value in the database. As a result, the endpoint returned this internal server error: GraphQL endpoint returns Internal server error with "Call.

Known issue

Issue: Staged sales rule labels may be mismatched after an upgrade to ÃÛ¶¹ÊÓƵ Commerce 2.4.6 or later from pre-2.4.5 product versions. Workaround: Apply ACSD-50625_2.4.5-P1.patch during upgrade before the Update metadata step. See salesRules labels issues when upgrade from versions < 2.4.5 Knowledge Base article.

General steps for resolving this issue:

  1. Download the required patch. See the salesRules labels issues when upgrade from versions < 2.4.5 Knowledge Base article.
  2. Follow the upgrade steps outlined in the Manage packages phase of the upgrade process Perform an upgrade.
  3. Apply this patch during upgrade after the Manage packages phase and before the Update metadata phase.See How to apply a composer patch provided by ÃÛ¶¹ÊÓƵ .
  4. Complete the upgrade process.

Issue: You cannot create a credit memo when free shipping is enabled (Stores > Configuration > Sales > Delivery Methods) and the displayed shipping price includes tax. When you try to create a credit memo, ÃÛ¶¹ÊÓƵ Commerce throws this exception: "Division by zero".vendor/magento/module-sales/Model/Order/Creditmemo/Total/Tax.phpLine 139.

Workaround: A hot fix for this issue is now available. Go to Quality Patches Tool: Search for patches and search for patch ACSD-50814.

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).

Partner
Pull Requests
Related GitHub Issues
Ampersand
Elgentos
Fisheye
Perspective Studio
MRM Commerce
Interactiv4
Atwix
Aligent Consulting
Blue Acorn iCi
creativestyle

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).

Contributing community member
Pull Requests
Related GitHub Issues
amenk
convenient
hostep
sinhaparul
barryvdh
peterjaap
engcom-Delta
freezy-sk
ilnytskyi
pykettk
fredden
asim-blueprintprep
texboy
convenient
fredden
serbynskyi
dshevtsov
Bashev
lbajsarowicz
tkotosz
MeCapron
amenk
Viper9x
lalittmohan
vo1
sheepfy
bgorski
pykettk
mrtuvn
pykettk
pmzandbergen
osrecio
fredden
nicka101
nazarklovanych
pykettk
VladyslavSikailo
Sental
novakivskiy
erfanimani
fredden
convenient
khoimm92
dudzio12
kassner
duxabilii
sergeynezbritskiy
sean-breeden
SilinMykola
aligent-lturner
lbajsarowicz
lbajsarowicz
krzksz
Usik2203

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.6 using Composer.

recommendation-more-help
1d4eef6c-fef1-4e61-85eb-b58d7b9ac29f