Magento Commerce 2.2.0 Release Notes

Release notes updated October 2.

We are pleased to present Magento Commerce 2.2.0 General Availability. This release includes numerous functional fixes and enhancements.

Highlights

Magento Commerce 2.2.0 includes a wealth of new, exciting features, and hundreds of enhancements and fixes. Look for the following highlights in this release:

  • B2B Commerce functionality is designed to meet the needs of merchants whose primary customers are companies, rather than consumers. Companies can create and maintain their own accounts, each with teams of buyers with various roles and levels of permission. B2B Commerce functionality also includes a flexible API that integrates with a variety of ERP solutions from Magento partners. See B2B Quick Start for an overview of the rich B2B feature set we’re introducing in this release, and Getting Started with Magento Commerce for B2B for a more complete exploration of these new features.

  • Magento Commerce Starter. In addition to our Pro version, Magento Cloud (Commerce) now comes in a smaller, platform-as-a-service version — Magento Commerce Starter. This subscription plan differs from our Enterprise Cloud version in some key ways. For an overview of these versions, see Welcome to Magento Commerce Cloud.

  • Improvements to the Magento Commerce (Cloud) deployment process. This release includes new build and deployment variables. Users of earlier versions of Magento Commerce (Cloud) will note that MCC has been replaced by ece-tools and ece-patches, which allows for patching your Magento Commerce (Cloud) without requiring a full installation of base code and the patch.

  • Bundled extensions. This release of Magento includes the first third-party extension that we are bundling with Magento Commerce – Magento Social. This extension establishes a connection between your store and your corporate Facebook account, and creates a page with products from your catalog. When shoppers click a product, they are redirected to the corresponding product page in your Magento store.

  • Integrated Signifyd fraud protection. You can learn more about this fraud protection service, which can help merchants eliminate liability for any losses or fees from fraudulent orders, in Signifyd fraud protection.

  • Significant enhancements in platform security and developer experience. Security improvements include the removal of unserialize calls and protection of this functionality to increase resilence against dangerous code execution attacks. We have also continued to review and improve our protection against Cross-Site Scripting (XSS) attacks.

  • Upgraded technology stack. We’ve dropped support for PHP 5.6, Varnish 3, and Solr. We now support PHP 7.1 and Varnish 5, along with Redis 3.2 and MySQL 5.7. All third-party libraries have been upgraded to the latest stable version. Note: Although we’ve dropped support for Solr with this release, Solr code will remain in the Magento code base until a later release.

  • Pipeline deployment, a new deployment process, enables build and deployment stages to minimize production system downtime for site updates. Resource-intensive processes can run on the build server. Pipeline deployment supports easy management of configuration between environments, too. Read more about pipeline deployment here.

  • Performance gains from improvements in indexing, cart, and cache operations. Customers can browse and shop on a storefront while indexers are running with no visible impact to their experience. Additionally, long-running indexers operate in batches to better manage memory and run times. Cart improvements enable a buyer to create a cart with more than 300 line items, and merchants can process a cart with at least 300 line items. Varnish cache configuration now includes saint and grace mode to ensure Varnish is always presenting a cached page to a shop’s customers. Enhancements to cache invalidation logic and optimization of edge side include blocks for frequently changing data that significantly boost cache hit ratios.

  • Substantial contributions from our Community members. Our Community Engineering Team has been working with skilled and enthusiastic community members, and together they’ve added hundreds of pull requests to the Magento code base. For more information about our Community Engineering Team. see Magento Community Engineering.

Looking for more information on these new features as well as many others? Check out Magento 2.2 Developer Documentation.

Security enhancements

Magento 2.2.0 includes multiple security enhancements. Although this release includes these enhancements, 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, so we recommend that you upgrade your Magento software to the latest version as soon as possible.

In general, we’ve removed serialize/unserialize from most the code to improve protection against remote code execution attacks. We’ve enhanced protection of code where use of object serialization or unserialization was unavoidable. Additionally, we’ve increased our use of output escaping to protect against cross-site scripting (XSS) attacks.

Contact us for more information.

Known issues

Magento 2.2.0 GA includes the following known issues. Fixes for these issues are scheduled for patch releases in the near future.

General Issues

The following issues affect all editions of Magento 2.2.0:

Issue: This issue affects Magento installations that include multiple store views. If you delete a store view, any product grid filtered to that Store View does not load. If you’ve set your product filter to a store view you’ve deleted, when you open Catalog > Products, Magento displays the following behavior:

  • spinner widget spins indefinitely

  • error message: A technical problem with the server created an error. Try again to continue what you were doing. If the problem persists, try again later.

Issue: Errors result when a deleted customer tries to log in or register for new account. When you delete a customer from the Admin panel, a fatal error occurs if someone tries to log in or register using that deleted customer account.

Issue: A mistake entering credit card information during an order for a new customer can cause subsequent errors even after the user has corrected the credit card information.

Issue: Failure to specify a – base_url during installation when using custom server ports results in unresolved static content. Workaround: You can use the CLI command config:set web/secure/base_url <base_url> to set the base_url parameter.

Issue: Magento does not correctly calculate the Catalog Price rule for bundle products with custom options.

Issue: Visual Merchandiser performance is degraded when Category contains many products.

Issue: The Performance Toolkit does not currently work.

Magento Commerce-only issues

The following issues affect the Commerce edition of Magento 2.2.0:

Issue: Store website doesn’t work when Redis cache is installed and the PhpRedis extension is enabled. Workaround: Contact Support for a patch.

Issue: Magento does not apply the Catalog Price Rule as expected when Persistent Shopping Cart is enabled in installations running Fastly cache.

Issue: Magento displays an error (“Error 503 Service Unavailable”) when you try to save a newly-added Catalog Price rule.

Issue: This issue affects the default configuration of category permissions in a multi-storeview environment. When the use category path in product URL value is set to false, and the user navigates to the product page for a product contained in that category, he is redirected to a 404 error page. Workaround: Log in to your account, then download and apply MDVA-6272_EE_2.2.0_composer.patch.

B2B-only issues

Issue: Resubmitting an order that contains an out-of-stock product causes an error. Instead of displaying a message that indicates that a product is out-of-stock, Magento displays this exception: Warning: Division by zero in \/usr\/share\/nginx\/html\/vendor\/magento\/module-tax\/Model\/Calculation\/AbstractAggregateCalculator.php

Issue: You cannot save a customized shared catalog when the indexer state table contains duplicates. Workaround: Remove the duplicate record from the database.

Issue: You cannot export Advanced Pricing information to a CSV file on a server running a medium-sized Magento installation (that is, one that supports approximately 40,000 SKUs, 300 shared catalogs, and three store views). Instead, the export will fail due to a time out.

Fixed issues

This release contains hundreds of fixes and enhancements.

Installation, upgrade, deployment

  • You can now run magento setup:upgrade --keep-generated in production mode. Previously, Magento would throw an error when you ran setup:upgrade after compiling dependency injection. (This significantly curtailed your ability to deploy continuous integration.) GitHub-4795
  • You can now upgrade your Magento installation when using multiple master databases for checkout, order management, and product data.
  • We fixed an issue that blocked using the web installer to successfully set up Magento. Previously, if you tried to install Magento with the web installer, Magento would indicate that the readiness check failed, and installation would not complete.
  • You can now deploy build processes on a different staging machine than the one you’re running your production environment on.
  • Magento 2.0.x and 2.1.x now support the use of table prefixing during installation. Previously, when you used table prefixing, your Magento installation failed with this error: “Duplicate key on write or update”. GitHub-5688
  • Third-party command line tools no longer fail when you run setup:di:compile.
  • Magento now correctly applies website configuration parameters to the corresponding store view. GitHub-7943
  • Fixed HTML inline style used when sending emails when implementing the upgraded emorgifier library. GitHub-8241
  • We’ve changed how Magento displays status updates during a product upgrade. Previously, potentially vulnerable information such as full paths and module names were displayed in the product GUI, potentially exposing this information to a malicious user. Magento now restricts this potentially vulnerable information to logs that are available to administrators only.
  • The cron:install command now works as expected in Magento 2.2.0. Previously, the configuration for crontab commands contained double quotes that were not escaped, which caused invalid commands to be written to the crontab file. GitHub-10040
  • Magento now moves the sequence_* table to the correct database after implementing a split database.
  • Magento no longer throws an exception when the configuration checksum is absent on a new installation.
  • It is now possible to configure Redis settings for session storage, default cache, and full page cache from the command line.
  • Custom themes now inherit parent XML configuration information as expected.
  • We’ve removed the sample password from the Setup Wizard
  • You can now enable JavaScript minification without error. Previously, after enabling JS minification, the Magento Admin displayed 404 errors when accessing JavaScript elements.
  • Magento no longer displays console errors after CSS merging and minification is enabled. Previously, when CSS merging and minification was enabled, the storefront was not displayed as expected, and the styles-l.min.css and print.min.css files could not be found.
  • You can now successfully use the config:set command to set allowed or default currencies.
  • Nginx now redirects to the setup page when using port 81.
  • We’ve added the dev:template-hints:enable and dev:template-hints:disable commands to manage template hints. Fix submitted by community member Miguel Balparda in pull request 9778.
  • We’ve added the dev:query-log:enable and dev:query-log:disable to manage database query logging. Fix submitted by community member Federico Rivollier in pull request 9264.
  • We’ve added the varnish:vcl:generate command to create the Varnish VCL file. Fix submitted by community member Piotr Kwiecinski in pull request 9286.
  • Magento now adds a new record to the quote table and adds the current date and time to the created_at field. Previously, this field was not updated.
  • The installation script no longer creates files in the root directory for missing modules when you install a community-created language pack. Translation packs created by the community often include translations for Magento Commerce modules. When you install these translation packs on an Open Source installation, the Commerce modules are missing. Previously, the installation script creates a file in the root directory for these Commerce modules instead of skipping them. GitHub-6260
  • We’ve fixed issues with upgrading installations with split databases.
  • Static content deployment (SCD) now works when multiple languages are specified. Previously, Magento displayed an error if you tried to deploy static content in more than one language (for example, bin/magento setup:static-content:deploy en_CA fr_CA de_DE).
  • The import URL directive now contains base URL and locale placeholders instead of the real URL.
  • Magento now works as expected on an Apache php-fpm environment.
  • The DOCUMENT_ROOT directory is now writable. Previously, installation failed because this directory was not writable.
  • When upgrading Magento from 2.1.x to 2.2, the quote_address.free_shipping column is the same whether you upgraded from a previous installation of Magento or performed a fresh installation. Previously, different upgrade/installation options affected the contents of this column.

AMQP

  • The magento queue:consumers:start command now works correctly when you provide the max-messages argument.
  • Magento no longer indicates errors when you install without AMQP. Previously, Magento displayed the following error:

    report.CRITICAL: Error Connecting to server (0): Failed to parse address ":" {"exception":"[object] (PhpAmqpLib\\Exception\\AMQPRuntimeException(code: 0): Error Connecting to server (0): Failed to parse address \":\" at /vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php:106)"} []

  • You can now override queue publishers configuration through the env.php file.
  • Magento now re-processes queue messages if the consumer process is terminated.

Cart and checkout

  • Magento now implements the minicart maximum display recently added item setting to your shopping cart. Previously, Magento displayed all the items in the shopping cart, even when the number of items exceeded this limit. GitHub-4750
  • You can now reload a page during checkout without unintentionally changing shipping information.
  • Custom address attributes now appear in the Checkout summary.
  • Lengthy Order Status tables are now paginated as expected.
  • Magento now displays the product add validation message (“Product was added to the cart”) only after you have successfully added a product to your cart.
  • We’ve resolved an issue that prevented you from adding more than one product to a shopping cart from a wishlist. GitHub-5282
  • The number of items in the minicart is now updated correctly when you run Magento in mixed HTTP/HTTPS mode. GitHub-6487
  • The minicart now performs as expected in deployments that span multiple websites. Previously, in a Magento installation that had multiple websites, products that you added to one website appeared in the other websites’ minicarts.
  • A cart rule with a coupon code no longer overrides a cart rule without a coupon code when multiple cart rules are applied. Previously, when you created two cart rules and applied them to a cart, the rule with a coupon was applied, but the second rule was not. GitHub-6294
  • Refreshing your browser page while on the Review and Payments page of the checkout process no longer clears information from form fields. Previously, Magento cleared information from the Ship to field if you refreshed your browser page during this process.
  • Magento no longer lets you add a product variation to your shopping cart if the item is out of stock. Previously, Magento permitted you to select an out-of-stock item and when you added it to your cart, displayed the “Product is out of stock” message.
  • We’ve corrected a problem with Magento throwing an HTTP ERROR 500 intermittently during checkout.
  • We fixed a JavaScript error that occurred on the Checkout page after you changed the country in the Estimate Shipping and Tax field.
  • Magento now successfully estimates shipping costs. Previously, when you tried to estimate shipping costs, the load indicator would spin indefinitely, and Magento displayed this exception,Object doesn't support this action. GitHub-5358, GitHub-7051
  • Magento now displays the State/Province field on the Add New Address page. GitHub-5279
  • Credit card information now persists as expected after a user enters a promotion code during checkout. Previously, After an user enters credit card information, then discount code and then click Place Order. The credit card information fields are emptied and user has to enter the credit card information again to proceed with the order transaction.
  • You can complete your order after entering a new shipping address during checkout. Previously, Magento would not let you place an order if you entered a new shipping address during checkout.
  • Magento no longer throws an exception when a customer updates their shopping cart after you’ve enabled the Minimum Order setting. Fix submitted by community member Eric Risler in pull request 8474.
  • You can now translate the FPT label on the checkout page. Fix submitted by community member Oleksii Korshenko in pull request 9204.
  • Magento no longer truncates bill-to names and shio-to names to 20 characters in the Admin. Fix submitted by community member Isolde in pull request 9654.
  • You can now delete the last item in your cart when the Minimum Order setting is enabled. Fix submitted by community member storbahn in pull request 9714.
  • You can now create unique checkbox IDs for the Terms and Conditions part of the checkout process. Fix submitted by community member Bernhard in pull request 9717.
  • Magento now correctly displays the coupon label in the shopping cart during checkout. Fix submitted by community member Sylvain Rayé in pull request 9721.
  • Magento now pre-fills prefixes and suffixes in the quote shipping address Fix submitted by community member Anton Evers in pull request 9925.
  • The country drop-down box now correctly shows the countries for which the current store and customer account are configured. Fix submitted by community member Marcel in pull request 9429.
  • The shopping cart now handles products with custom options. GitHub-5612
  • Magento now requires completion of the State field during the check out process if this field has been configured as required.

Catalog

  • Magento no longer locks the category_product_entity table. Unlocking this table reduces the potential of lock-related timeouts that can occur when indexing and checkout operations run in parallel. Previously, Magento locked the category_product_entity table.
  • The storefront now displays images that Magento resizes during product save operations, rather than resizing the product on the storefront. Previously, the image path contained store_id, and during save operations, Magento resized images for images the default store only.
  • The \Magento\CatalogInventory\Model\Stock\Status\getStockId() method now returns the correct values.
  • The storefront gallery now displays all the images associated with a configurable product. Previously, when you clicked on the swatches associated with a configurable product, the gallery displayed only one of several possible images. GitHub-6195, GitHub-4101
  • Magento now displays the This is a required field message immediately adjacent to the product options as needed during checkout. Previously, Magento displayed this message at the bottom of the checkout form.
  • The category page now shows the current price after Magento runs a scheduled update. Previously, the category page would not update the price after running a scheduled update. GitHub-4945
  • You can now sort and filter on the New Review page. GitHub-5391
  • Magento now displays server-side Ajax error messages.
  • Magento now validates the uniqueness of product attribute values as you create or edit them. Previously, you could add identically named values to an attribute. GitHub-4881
  • Magento now displays the price of out-of-stock products on the product page.
  • If you remove an item from the Compare Items list that is displayed on any Category page, Magento no longer redirects you to the Compare Products page.
  • Subcategories no longer show up in the menu when the parent category is disabled or hidden from the menu. GitHub-10664
  • We’ve corrected a problem with Magento throwing an HTTP ERROR 500 intermittently during checkout.
  • The product attribute category_ids can have only Global scope. Previously, you could change the scope value of category_ids to Store.
  • The prices you assign to custom options no longer change unexpectedly after you save them. GitHub-6116
  • You can now successfully set an SKU mask to empty. Previously, when a product SKU mask was set to empty, Magento experienced problems loading the Product Add page. GitHub-5618
  • Magento now provides swatch input for the Admin Scope, and the attribute fall back mechanism now reverts to the default option value if no values are specified for specific store view. GitHub-5143, GitHub-5142
  • You can now create a custom attribute for a category that successfully uploads a custom image. Previously, you could create the attribute, but could not save the image.
  • Sorting configurable products by price now works as expected when a simple product has a special price. GitHub-4778
  • Magento no longer displays an error when you open a product with a Fixed Product Tax attribute enabled.
  • We’ve improved the process of using the WebAPI interface to save a product stock item. Previously, this type of save action worked inconsistently.
  • You can no longer change or fake a product price from the Magento storefront and then complete an order with that faked price.
  • You can now save a product with images multiple times.
  • View permissions to high-level product categories now work as expected. Previously, Magento displayed only the product categories that users who belonged to the NOT_LOGGED_IN customer group were permitted to view, no matter which user logged in. Additionally, a user restricted to browse a category could still see the category in the top-level navigation menu if the page were previously cached in FPC.
  • You can now successfully add a product to the compare list. Previously, when you tried to add a product to a compare list, Magento displayed an error.
  • You can now remove custom options from simple products. Previously, when you tried to remove a custom option from a product, Magento did not remove the options, and displayed an error message.
  • You can now successfully set the Enable Product attribute to no.
  • Magento no longer permits a shopper to place a re-order once you’ve disabled one of items in the order.
  • Fixed an issue that occurred in the Catalog Gallery on mobile displays when the allowfullscreen setting is enabled. Fix submitted by community member Dennis van Schaik in pull request 8434.
  • Magento now successfully loads re-ordered related products when Edge-Mode is activated. Fix submitted by community member @kirashet666 in pull request 8467.
  • Magento now displays cross-sells as expected when you use the product/list/items.phtml template. Fix submitted by community member Koen V in pull request 8602.
  • Magento now displays the Yes or No attribute value on Product pages. Fix submitted by community member Timo Klement in pull request 8623.
  • Setting the show_out_of_stock attribute to No now works as expected. Fix submitted by community member Theis Corfixen in pull request 8736.
  • Magento now uses parent names (instead of SKU-based names) when creating configurable products. Fix submitted by community member Pascal Brouwers in pull request 9681.
  • You can now create an etc/view.xml file containing an images tag with an attribute module. Fix submitted by community member Marius Strajeru in pull request 10052.
  • Magento now displays the Category selection UI under Conditions when you select a rule for editing. Fix submitted by community member duckchip in pull request 10094.
  • Magento now displays the correct image when you switch between a configurable product’s options. Previously, Magento loaded product images from a different product.
  • The Magento WYSIWYG editor now handles special characters such as percent sign (%). GitHub-9452
  • The indexer:reindex catalog_category_product process can now handle more than 500 products in a category.
  • Magento now displays the price set at store view-level for a product that has different prices set on the global and store view level.
  • Out-of-stock options for configurable products no longer show up in search and layered navigation results.
  • You can render the tax_class_id attribute nonsearchable. Previously, Magento displayed a 503 error under these circumstances.
  • If you’ve enabled persistent shopping cart, you can now check out even after your session has expired.
  • Magento no longer throws an error when you try to save a product with imported custom options.
  • Magento now displays the product price even when the product is out-of-stock.
  • productWebsiteLink no longer deletes a product’s custom origins.

Configurable products

  • You can now successfully disable the lowest price of a configurable product and its associated simple products. Previously, Magento displayed a configurable product’s lowest price even after you disabled that price.
  • Magento no longer applies one simple product’s special price to another simple product of the same configurable product. Previously, when you set a regular and special price for a child product, all products associated with the same configurable product displayed a regular and special price, even when these amounts were the same. GitHub-4442, GitHub-5097, GitHub-6645
  • You can now edit a product attribute for multiple configurable products. Previously, when you tried to bulk-edit an attribute on a collection of filtered, configurable products, Magento would complete the process without incorporating your edits, and then incorrectly tell you that the products had been edited.
  • Magento no longer throws an exception when you add a configurable product by SKU if an associated simple product is out-of-stock.
  • Magento now correctly displays a product as out-of-stock if its child products are disabled. Previously, the category page failed to list the product at all, rather than listing it as out-of-stock.
  • The check that Magento runs to confirm a configurable product’s readiness for sale is now faster. (The isSalable method checks that a configurable product can be sold (that is, is in a saleable state)).
  • Query optimizations have improved the speed of configurable product price calculation.
  • Magento no longer calculates configurable product special prices on the category page. Previously, Magento calculated special prices on the category page, but did not display them.
  • Magento now displays configurable products as expected after creation.
  • Magento no longer displays a configurable product on the storefront when its child products are deleted and the show out-of-stock setting is set to No.
  • Configurable products no longer show up on category page when all children are set to enable product = No and display out-of-stock products = Off.
  • Magento no longer displays the as low as label for a disabled price on the Category page.
  • The price you set on the website scope no longer overrides any local settings you set on configurable products at the store view level.
  • You can now successfully disable the lowest price of a configurable product and its associated simple products. Previously, Magento displayed a configurable product’s lowest price even after you disabled the price. GitHub-4419
  • Magento now correctly displays a product as out-of-stock if its child products are disabled. Previously, the category page failed to list the product at all, rather than listing it as out-of-stock.
  • Magento now displays the correct drop-down option labels for configurable products when using attributes with custom source.
  • Magento now shows the correct price of a configurable product based in installations that run multiple websites.
  • We’ve improved the performance of Magento installations that contain configurable products with many (1600+) options.
  • We’ve resolved some issues with the display of configurable products on the Magento frontend after product creation.
  • Magento now displays only the set price for a configurable product, not its set price and “as low as” price. Previously, Magento showed both prices if a minimum price was not configured.
  • Magento no longer removes the simple products associated with a configurable product if you click on the Save button more than once while saving the configurable product. Previously, if you clicked on Save more than once during an attempt to save a configurable product, Magento removed the simple products that were assigned to it.

Email

  • Magento now successfully loads the New Order Email templates. GitHub-5101
  • The Send Welcome Email From field now identifies the store that the customer is associated with.
  • Magento no longer sends email when the Disable email communication setting is set to yes. Previously, Magento sent email even when this setting was enabled. GitHub-5988

Frameworks

  • Static file generation is no longer affected by a race condition that affected merging CSS files. Previously, this race condition interfered with the proper generation of the product front end.
  • The ability to disable module output has been removed from Admin. If you disabled module output from Admin in a previous release, you must manually configure these settings. See Disable module output for details.
  • Static tests run in a Windows environment no longer fail due to file path mismatches. Fix submitted by community member Barbazul in pull request 9902.
  • Magento now displays special characters in store names in email subject lines. Previously, special characters in the store name were converted to numerical character references in the email subject field. GitHub-8094

Admin framework

  • You can no longer delete a currently logged-in user.

Application framework

  • Magento now supports new top level domains for email addresses. GitHub-4547
  • Page titles in layout files are not translatable. Fix submitted by community member Anton Evers in pull request 9992.
  • The setup:static-content:deploy, setup:di:compile and deploy:mode:set commands now return non-zero exit code if an error occurs. Fix submitted by community member Pablo Ivulic in pull request 7780.
  • We’ve changed the select protected property to query in the AbstractSearchResult class. Fix submitted by community member Alex Gusev in pull request 5043.
  • \Magento\Framework\Interception\Code\Generator\Interceptor now supports interceptors for generating for methods that return references. GitHub-9167

Configuration framework

  • Configuration values no longer return NULL when Redis reaches the limit set in the max_memory setting. Previously, when Redis met the limit specified in this setting, ScopeConfig returned a value of NULL for configuration options, which resulted in significant damage to data (for example, deleting all prices assigned to a website from the database).
  • The currency setup in Admin no longer throws an in_array error when a single value is selected. Fix submitted by community member Derik Nel in pull request 8077.
  • Magento now writes all default configuration values to the config.php file.

JavaScript framework

  • Customers can now place orders as expected when Magento is running a French locale in production mode. Previously, customers could not complete a transaction in a storefront running a French locale, although they could if they switched to the storefront running the English locale.
  • Magento now displays server-side Ajax error messages.
  • JavaScript mixins now work when you add a urlArgs argument to a require_js file. Fix submitted by community member James Reed in pull request 9665.

Zend framework

Thanks to our hardworking Magento Open Source community members for the following contributions!

  • We’ve removed Zend_Json from Magento Theme and replaced it with a new serializer class. Fix submitted by community member David Manners in pull request 9262.
  • We’ve removed Zend_Json from the Weee module. Fix submitted by community member David Manners We’ve removed pull request 9261.
  • We’ve replaced the direct usage of Zend_Json with a call to the Json_Help class. Fix submitted by community member David Manners in pull request 9344.
  • We’ve replaced Zend_Json in the configurable product block test. Fix submitted by community member David Manners in pull request 9753.
  • We’ve removed Zend_Json from form elements. Fix submitted by community member David Manners in pull request 9754.
  • We’ve replaced the Magento Framework’s Zend_Session interface usage with SessionHandlerInterface. Fix submitted by community member Timon de Groot in pull request 9285.
  • We’ve removed Zend_Wildfire and Zend_Controller from the codebase. Fix submitted by community member Isolde in pull request 9622.
  • We’ve replaced Zend_Log with Psr\Log\LoggerInterface. Fix submitted by community member Timon de Groot in pull request 9285.
  • Magento no longer throws a Zend_Db_Statement_Exception when a user opens an empty Category page. Fix submitted by community member adrian-martinez-interactiv4 in pull request 9400.

General fixes

  • You can now save products using the multiple select attribute value. Previously, you could not save values if using this attribute.
  • You can now log in successfully after creating a custom attribute. Previously, Magento would display an error message, and you could not log in, after first creating a custom attribute, then logging out.
  • Magento now correctly displays customer address during account creation. Previously, when you selected a default billing address during creation of a new customer account, Magento would not display the address.
  • Admin users with restricted permissions can now log in successfully as determined by those permissions. Previously, Magento displayed a fatal error when you logged in under these conditions.
  • We’ve removed the duplicated PHP settings from the sample web server configuration files.
  • You can now make Return Merchandise Authorization (RMA) comments visible from the storefront by setting Stores > Configuration > Sales > RMA Settings > Enable RMA on Storefront.
  • When creating a new page with the Add New Page feature, Magento no longer throws a JavaScript error when Layout is set to empty.
  • We’ve removed the sample password from the Setup Wizard.
  • You can now assign open-ended start and complete dates for product rules. Previously, if you left the start and end date field blanks when creating a rule, Magento would supply the start and end dates based on the save date.
  • The Magento Framework now makes its dependency upon the zendframework/zend-stdlib library explicit in composer.json. GitHub-6442
  • You can now upload changes to the robots.txt file from the Admin panel.
  • We’ve eliminated difficulties saving product information when logged in as Admin. Previously, the Product Save feature worked erratically for Admin users.
  • Custom themes now inherit parent XML configuration information as expected.
  • Information set by the Default Billing Address and Default Shipping Address checkboxes on the Customer page are now saved correctly.
  • Admin users with appropriate permissions can now reset the passwords of more than one customer at a time. GitHub-5260
  • Admin interface forms now load data as expected after initializing all components. Previously, under certain conditions, the load indicator would spin indefinitely, and Magento would not load data.
  • Showing reports on the Reports > Coupons page no longer throws an error when the user is in a non-default Admin locale. GitHub-7037 
  • You can now generate static content without a database connection. GitHub-10041
  • Static content deployment now generates secure content, whether content included secure or non-secure URLs.
  • The Recently Viewed Products block now appears as expected when the full page cache is enabled. GitHub-3890
  • We’ve resolved an issue that prevented you from adding more than one product to a shopping cart from a wishlist. GitHub-5282
  • Widgets now accept UTF-8 special characters type as input parameters. Previously, you could successfully create a widget, but UTF-8 special characters were broken. GitHub-4232 Fix submitted by community member Pieter Hoste in pull request 9333.
  • Magento now sends email that provides updates on the status of RMA authorization.
  • Mass actions now work as expected on the Customer grid. Previously, Magento could not process more than 20 items at a time.
  • Customers who subscribe to a newsletter are now subscribed as expected after confirming their account. Previously, Magento unsubscribed customers from the newsletter after confirming their account.
  • Fixed issue with using the Magento Commerce invitations feature to insert malicious JavaScript and subsequently execute it in the Admin context.
  • You can now save products using the multiple select attribute value. Previously, you could not save values if using this attribute.
  • You can now assign open-ended start and complete dates for product rules. Previously, if you left the start and end date field blanks when creating a rule, Magento would supply the start and end dates based on the save date.
  • Magento no longer generates incorrect URLs in the site map when the Use Secure URLs in Admin setting is set to Yes. GitHub-8644
  • We’ve resolved a conflict that occurred after you changed a base URL. Previously, after you changed a base_url value (Stores->Configuration > General > Web > Base URLs (Secure)), Magento would update the base URL, then resubscribe, potentially resulting in a failure during the next update secure base_url call.
  • Magento now displays newly registered customers in the Admin customer list as expected.
  • The Customer Segment page no longer shows non-matching customers when a customer logs in and you refresh the Customer Segment page.
  • You can now add a translate attribute to any String argument in the di.xml file for any class. This attribute provides an ability on the level of dependency injection configuration to specify that an argument can be translated. The actual translation of strings is handled by another Magento component.
  • Magento front-end scope filters now work as expected. Previously, Magento did not reload product information correctly when you applied a filter using Catalog > Product.
  • Only users with permission to view a store can view or process the orders placed on it.
  • You can render the tax_class_id attribute nonsearchable. Previously, Magento displayed a 503 error under these circumstances.
  • We fixed an issue where cache-misses sometimes occurred when Fastly cache was implemented. Previously, the header information included in the response sometimes prevented the caching of this page. To minimize this potential problem, Magento now does not include header empty of real content in the response.
  • Fixed the location of the wishlist.js file. Fix submitted by community member Koen V. in pull request 8633.
  • You can no longer download products after you’ve set order state to STATE_CANCELED. Fix submitted by community member nazarpadalka in pull request 8917.
  • Fixed a typo in the Pull Request Template. Fix submitted by community member tomislavsantek in pull request 8908.
  • You now receive an error message as expected if you try to submit a product review while not logged in. Fix submitted by community member quienti in pull request 9001.
  • Fixed grammar error in the customer dashboard. Fix submitted by community member Petar Sambolek in pull request 9080.
  • The popup window in the Safari browser now closes properly. Fix submitted by community member Hans Schouten in pull request 8824.
  • We’ve fixed minor performance issues when you use /pub as docroot. Fix submitted by community member Joseph Maxwell in pull request 9094.
  • The Actions dropdown menu is now properly aligned in the Admin when the action column is not the last column. Fix submitted by community member Marius Strajeru in pull request 10082.
  • Magento now deletes pending entries in cron_schedule when you reconfigure a cron job. Fix submitted by community member Anton Evers in pull request 9957.
  • We’ve fixed the cron timestamp method. Fix submitted by community member Anton Evers in pull request 9943.
  • You can now save customers with unique attributes. Fix submitted by community member storbahn in pull request 9712.
  • The Magento_Framework/View/Layout/etc/elements.xsd file blockReferenceType definition now allows for the optional argument template. Fix submitted by community member jissereitsma in pull request 9772.
  • Customer sessions for different customers are no longer shared on installations on multiple websites. GitHub-4842, GitHub-6468
  • Magento now handles quotation marks in product names. Previously, quotation marks in product names caused a JSON error on the Product page. GitHub-8059

Gift cards

  • Order emails now specify the amount of the gift card that you have purchased.
  • The Checkout page no longer freezes when you order a virtual gift card using the Authorize.net Payment Action value set to Authorize and Capture.
  • You can now complete the purchase of a gift card in environments where you have set the Braintree payment method Payment Action to Authorize and Capture. Previously, any order made under these conditions would remain indefinitely in the processing stage.
  • You can now add a gift card with an undefined amount to the Items Ordered table. Previously, Magento did not permit you to add a gift card of an open value to this table.
  • Customers can no longer exceed a gift card balance by using the gift card twice.
  • You can now save the configuration settings of a gift card product.
  • Gift card accounts are now automatically generated after an invoice is created, when the Authorize and Capture payment action on Authorize.net Direct Post is enabled.

Gift registry

  • The State/Province dropdown menu now works as expected in the frontend gift registry.
  • We’ve fixed inconsistent gift options checkbox labels in both the CSV file (app\code\Magento\GiftMessage\i18n\en_US.csv) and PHTML file (app\code\Magento\GiftMessage\view\frontend\templates\inline.phtml). Fix submitted by community member vpiyappan in pull request 9421.

Gift wrapping

  • The Allow Gift Wrapping for Order Items setting now works as expected. Previously, when Stores > Configuration > Sales > Gift Options was set to No, users saw the Gift Option link under each product in their shopping cart.
  • You can now add gift options to an order if logged in using a secure URL
  • Your gift wrapping selection now appears in the shopping cart regardless of whether you’ve selected a shipping method. Previously, Magento did not display your gift wrapping choice until you selected a shipping method.
  • Magento no longer displays the gift wrap tax when no gift wrap is selected.
  • You can now save products using the multiple select attribute value. Previously, you could not save values if using this attribute.
  • We’ve fixed an issue with fetching quote item by ID. Fix submitted by community member Mladen Ilic in pull request 10059.
  • We’ve corrected the ACL for the Developer Section resource. Fix submitted by community member Pascal Brouwers in pull request 10149.
  • Layout merging no longer fails when you save a widget that contains the grave accent character in the data. Fix submitted by community member Timon de Groot in pull request 10151.
  • Magento now uses the correct order when uploading image to the Admin using Content > Design. Fix submitted by community member Ihor Sviziev in pull request 10126.

Google Analytics

  • We’ve added the missing single quote (‘) to the Google API Tracking code. Fix submitted by community member Petar Sambolek in pull request 9084.
  • Google Analytics tracking now works when Cookie Restriction is enabled. Fix submitted by community member Bernhard in pull request 9713.

HTML

  • The CSS minify option no longer removes the whitespace around the minus (-) sign. Also, this option is now compatible with the calc() CSS function. Fix submitted by community member Petar Sambolek in pull request 9027.

Images

  • Magento now successfully saves images that you edit in a WYSIWYG editor. Previously, when you tried to change an image by right-clicking it in a WYSIWYG editor and choosing Insert/Edit Image, Magento did not save your changes.
  • You can now preview uploaded images.
  • You can now set an image size for product watermarks. GitHub-5270
  • Graphics now scroll as expected on mobile devices. GitHub-5302
  • Magento now successfully saves images that you edit in a WYSIWYG editor. Previously, when you tried to change an image by right-clicking it in a WYSIWYG editor and choosing Insert/Edit Image, Magento did not save your changes.
  • Inserted images on the content block of Category no longer reference the Admin URL. Previously, when you used the Wysiwyg editor to insert an image into the Content block of a Category, the image URL on the front end would reference the Admin location. When you subsequently logged out of the Admin panel, and refreshed the Category page, the image is no longer available.

Import/Export

  • You can now successfully import multiselect attributes that contain special symbols or delimiters. Previously, when you tried to import attributes containing delimiters, data validation (and the import) failed.
  • You can now import negative quantities. Previously, when importing a product quantity of ‘-1’, Magento returned an error.
  • Magento now imports custom options correctly. Previously, when you tried to import a custom option, the import failed, and Magento displayed this error: Javascript Error: Uncaught RangeError: Maximum call stack size exceeded. GitHub-5573
  • We’ve added a new way to import images: You can now successfully import images when you set your document root to your_Magento_install_dir/pub. Previously, you needed to set document root to /magento to import images. Both ways of importing now work. GitHub-5359
  • Magento now removes category URL keys from the url_rewrite table as expected during import. Previously, Magento did not remove these keys, which triggered a failure during import. This subsequently caused Magento to quickly reach the maximum error count, returning this error: “Maximum error count has been reached or system error is occurred!”. GitHub-1471
  • You can now export a bundle product that contains a custom text area attribute. Previously, if you tried to export this type of bundle product, the export would fail, and Magento displayed the message, “There is no data for the export”.
  • Magento now maintains super attribute ordering of configurable products with multiple super attributes after export or import. Previously, after import or export, the ordering of super attributes was not maintained. GitHub-6079
  • Magento now correctly displays both configurable and simple products, their attribute values, and visibility values after import if SKU is an integer. GitHub-5547
  • Magento now imports customer data as expected after the data passes the pre-import validation step. Previously, although data passed this validation step, an error would occur during import, and Magento displayed this message: Invalid data for insert. GitHub-4921, GitHub-9469
  • The export process now populates values in the configurable variations column for configurable products as expected. Previously, when exporting more than one product, the values for the configurable variations column for configurable products were not included.
  • Magento now displays imported product images in this order: first, the base image, then the additional images in the order in which they were listed in the CSV file. Previously, Magento displayed images in this unexpected order: first, an additional image, then the base image, and finally, all remaining additional images.
  • Magento now runs a selective partial re-indexing operation after import if you enable Update on Schedule. Previously, Magento ran a full reindex no matter which index mode was set.
  • We’ve fixed an issue with the correct representation of date and time zones of items in a product catalog during import or export. Previously, Magento exported all dates in the default format (UTC-8), including values that you set to be displayed using another standard.
  • Magento now successfully imports customer multiselect attributes. Previously, when you imported a CSV file with either the option’s ID numbers or the option’s values, Magento returned an error.
  • Magento now displays more verbose information about duplicated information with links to action for troubleshooting the import process. Previously, Magento displayed duplicated or incomplete information on the product page after import.
  • Magento now exports rows only once when product information contains HTML special characters. Previously, Magento exported rows containing product information that included HTML characters at least twice.
  • We’ve improved the import speed of advanced pricing data. Previously, the import process for this information frequently stopped after the import of approximately 300 rows of data, and Magento displayed this message: Please Wait.
  • The CatalogImportExport uploader now handles HTTPS images as expected. Fix submitted by community member Clement Beudot in pull request 8278.
  • You can now successfully import multiselect attributes that contain special symbols or delimiters. Previously, when you tried to import attributes containing delimiters, data validation (and the import) failed.
  • When you delete an image in Admin, Magento no longer deletes it on the server. Previously, Magento deleted it from the server as well, which caused errors for other products (example error message: Cannot gather stats! Warning!stat(): stat failed for).
  • The exported sheet now generates or renders data for columns that indicate associations for configurable products.

Integrations

  • With valid permissions, you can now regain access to your Admin account after it is temporarily disabled due to invalid credentials. Previously, you could not unlock the account of a valid Admin user if it were disabled due to multiple invalid login attempts.
  • Web API tokens now have a default expiration period: 4 hours for Admin tokens and 1 hour for Customer tokens. This can be changed in the Admin Panel configuration settings
  • You can now edit authentication_lock from the Admin. Fix submitted by community member Elias Kotlyar in pull request 9820.

Indexing

  • We’ve improved the performance of the algorithm that Magento uses to calculate batch sizes while indexing categories.
  • Magento no longer displays an indexing error when Elasticsearch is enabled. Previously, Magento displayed this indexing error when Elasticsearch was enabled: mapper_parsing_exception.
  • The category/product indexer now successfully completes a full reindexing of all indexes on large profiles with 500,000 or more products. Previously, Magento successfully generated a large profile, but failed to complete the reindexing of the categories or products, and displayed the following error: “Error 1114: Table is full”.
  • IndexerHandlerFactory no longer tries to cast the $indexer object to a String if an error occurs. Since $indexer is an object of type IndexerInterface and does not have a __toString() method, attempting to cast the $indexer object to a String previously resulted in an error. GitHub-5155
  • The Magento flat indexer now collects correct product data for ROW_ID.
  • The Magento flat indexer no longer throws an error after flat tables are enabled and reindexed. This fix applies to both product and catalog tables.
  • Magento now runs a selective partial re-indexing operation after import if you enable Update on Schedule. Previously, Magento ran a full reindex no matter which index mode was set.
  • IndexerHandlerFactory no longer tries to cast the $indexer object to a String if an error occurs. Since $indexer is an object of type IndexerInterface and does not have a __toString() method, attempting to cast the $indexer object to a String previously resulted in an error. GitHub-5155
  • The category/product indexer now successfully completes a full reindexing of all indexes on large profiles with 500,000 or more products. Previously, Magento successfully generated a large profile, but failed to complete the reindexing of the categories or products, and displayed the following error: “Error 1114: Table is full”.
  • We’ve resolved failures with indexing in installations that implemented catalogs containing at least 5,000 - 6,000 SKUs.
  • We’ve improved the performance of the algorithm that Magento uses to calculate batch sizes while indexing categories.
  • Reindexing no longer results in an SQL error that prevents bundle products from being reindexed, and results in wrong product prices.

Orders

  • We’ve added PHP interfaces that add the ability to change the status of a shipment. The new Creditmemo interface supports tasks you can already do through the Magento Admin, including the ability to:

    • support returning multiple units of a configurable product. Previously, when you tried to refund an order, you could refund only one unit of a configurable product, not the amount in the original order.

    • return the product to stock

    • change order status after a credit memo has been created.

  • You can now set the customer group when creating a new order from the Admin interface. GitHub-6162
  • You can now print invoices and credit memos from the Order page.
  • You can now successfully place orders when the Enable and Configure Website Payments Standard Payment Action attribute is set to Sale. Previously, under these conditions, Magento would display an error message and not allow you to complete the purchase. GitHub-4785
  • Attributes of the salesInvoiceRepository methods are now more appropriately type cast. (The data type is now a nullable float.) Previously, due to the use of an incorrect data type, Magento would produce an error when calling the salesInvoiceRepositoryV1GetList method. GitHub-3605
  • The order comments history no longer duplicates the time that a comment was made. Previously, the time that a comment was made was listed twice.
  • Magento now uses the address template from store view level of the placed order (similar to how order confirmation email works). Previously, Magento used the wrong address template for order e-mails.
  • Magento now correctly identifies an order being processed when it is placed in a store configured for multiple currencies. Previously, these orders always were identified as potentially fraudulent.
  • The order comments history no longer duplicates the time that a comment was made. Previously, the time that a comment was made was listed twice.
  • You can now add a gift card with an undefined amount to the Items Ordered table. Previously, Magento did not permit you to add a gift card of an open value to this table.
  • The Print Shipping Label link now displays on the product front end. Previously, the layout for the Shipping and Tracking block did not work properly.
  • You can now create an order through Admin if there is a translate csv for order-header. Fix submitted by community member Pascal Brouwers in pull request 6856.
  • You can now use a second credit memo to successfully issue a full refund for a credit memo with adjustment fees. Fix submitted by community member Max Pronko in pull request 9715.
  • Coupon codes are now included in invoice print outs. Fix submitted by community member Belgacem Naoui in pull request 9780.
  • The Orders grid now displays correct order dates. Fix submitted by community member Anton Evers in pull request 9941.
  • Magento now displays the correct order time in the Sales Order grid in the Admin panel. GitHub-9426
  • We’ve increased the size of the sales_order_payment.cc_number_enc field. GitHub-7334
  • We’ve fixed an issue with an undefined offset in the order\config.php file. GitHub-6111
  • The Create Order page now works as expected after you select Update items and quantities.
  • Magento no longer creates unnecessary loaders during checkout with an order that contains virtual products.

Payment methods

  • We’ve added support for the change to the USPS API that USPS implemented on September 1, 2017. After installing or upgrading to this release, Magento will display the Domestic rate for USPS, First-Class Mail Parcel as expected. Previously, the USPS First-Class Mail Parcel option was not available after September 1, 2017 on installations running Magento 2.x unless you applied the workaround described here
  • You can now successfully complete Paypal checkout with products that have custom options. GitHub-5938
  • Third-party payment gateways are now visible from the Admin. GitHub-7891
  • Magento no longer displays the No Payment method available message when a customer tries to ship items to a billing-restricted country.
  • Magento no longer displays the No Payment method available message when a customer tries to ship items to a billing-restricted country.
  • Magento now successfully completes checkout when a custom address attribute is added. Previously, an error occurred during checkout when the user added a required custom address attribute.
  • Removed a duplicate method call to the getLinkField method in the Magento\Catalog\Model\ResourceModel\Category class. Fixed by will-b in pull request 9057.
  • During order creation, you can now continue with a payment after clicking the Back button to the payment selection window. GitHub-4580
  • The expiration year validator now works as expected. GitHub-8482

  • We’ve introduced the Magento\Vault\Block\TokenRendererInterface::getToken method. This method provides details about payment tokens to renderer components, such as public hash and available card or account details. Third-party developers can use this method to implement this functionality in their payment integrations.

Braintree

  • You can now place orders from the Admin using the Braintree payment method.
  • We’ve enhanced our PayPal and Braintree implementations so that merchants can now:

    • Save customer PayPal account information in the Braintree Vault when using Braintree as a service. This enhancement provides a secure method for charging my customers without prompting them to enter a payment information for multiple purchases or for purchases from multiple devices. We’ve also added support for Maestro and Discover BINs added to the credit card form both for Braintree and PayPal solutions.

    • Configure dynamic descriptors (Company Name, Phone and URL) for Braintree. This enhancement supports customers easily identifying a source of transactions in their bank statements. (This will potential simplify the resolution of disputed transactions by supporting the display of the Kount status for Braintree in the Admin interface.)

  • Kount and 3D Secure now work as expected for Braintree Vault.
  • Magento now updates you as expected on order comments and order history after you initiate a refund using Braintree. Previously, when you clicked the Refund button (to initiate a refund), Magento did not redirect you to order comments and history information.
  • You can now use Braintree as a payment method when applying reward points or store credit to an order.
  • The Braintree payment method now works as expected with Vault table prefixing.
  • Magento no longer encounters an error when using the Braintree Vault payment GET order API call. GitHub-6215
  • You can now use JCB and Diners Club credit cards with the Authorize.net payment method.
  • Fixed issue with credit card capture information failing to remain associated with its first authorization. GitHub-6716
  • You can now successfully place orders with Braintree when using an alternative merchant account ID. (The merchant account does not need to match the 3D Secure authorization merchant account.) GitHub-5910
  • Braintree no longer encounters an error during checkout when you apply a 100% discount coupon to a product and enable free shipping. Previously, Magento displayed a spinning loader widget, and your screen froze. The Developer console displayed this error: Uncaught Error: [paypal-container] is not a valid DOM Element.
  • The Braintree payment method now works as expected with Vault table prefixing.
  • Merchants can now accept payment on a Suspected Fraud order without Magento altering the amount in Total Paid. Previously, when a merchant accepted payment for an order with a status of Suspected Fraud, Magento doubled the payment amount.
  • Braintree no longer encounters an error during checkout when you apply a 100% discount coupon to a product and enable free shipping. Previously, Magento displayed a spinning loader widget, and your screen froze. The Developer console displayed this error: Uncaught Error: [paypal-container] is not a valid DOM Element.
  • The Braintree PayPal locale now has its own setting. GitHub-9639
  • You can now modify the product quantities of a previous order and re-order it using the saved credit card information from the first order.

PayPal

  • We’ve improved and streamlined the Magento Admin PayPal configuration interface.
  • PayPal Payflow Pro now uses the currency you’ve specified in your store settings. Previously, Magento converted the total price into U.S. dollars, no matter which currency was specified in the store settings.
  • We’ve fixed an issue with using PayPal Express Checkout to order products with custom options. Previously, although an Admin user could create and configure “File type” custom options, customers could not upload and store files within the order quote. GitHub-5434
  • Fixed issue related to incorrect stock quantity calculation for bundle and configurable products during place order flow with PayPal Express Checkout.
  • Third-party payment gateways are now visible from the Admin. GitHub-7891
  • Fixed issue with credit card capture information failing to remain associated with its first authorization. GitHub-6716
  • PayPal Express payments no longer fail when there is adequate product inventory to cover your order. Previously, you’d receive this error message: We can't place the order. GitHub-6296
  • Paypal errors no longer occur when Fixed Product Tax (FPT) is enabled. Previously, when a product had a FPT, Paypal Express reported an error when you tried to place the order.
  • PayPal Payflow Pro now uses the currency you’ve specified in your store settings. Previously, Magento converted the total price into U.S. dollars, no matter which currency was specified in the store settings.
  • When refunding an order from PayPal, Magento now creates a credit memo with the correct status.
  • The exported sheet now generates or renders data for columns that indicate associations for configurable products.
  • We’ve fixed errors in processing valid orders using a PayPal account that had been previously used to pay for a valid order that had problems during checkout.
  • We’ve resolved a loader issue with Payflow Pro. The loader image is now invisible after redirecting to the payment page/success page or error page. GitHub-7159, GitHub-9296

Performance

This release includes substantial improvements to Magento caching, image processing, and re-indexing, among other enhancements.

  • We’ve improved the speed of static asset deployment and now support a variety of asset deployment strategies that can be used to optimize speed and size of assets deployed. Indexers can now be run with 256M of PHP RAM and default MySQL configuration settings. Developers can further tune memory usage to improve indexer performance (in some cases up to 100% improvement). Please see Magento Optimization Guide for further details.
  • We’ve improved storefront performance when creating 2500 or more product variants.
  • The processing speed of category URL rewrites for catalogs containing more than 20,000 products has greatly improved.
  • Opening many products from the Admin interface is now faster.
  • Creating many (2500 - 5000) product variants, both simple and complex product types is more efficient.
  • You can now quickly generate or preview multiple variations of a configurable product. (Saving these variations to the database can be time-consuming, if you have several thousand product options, and our efforts to improve performance continue.) Previously, Magento threw an Invalid Form key error is thrown while you tried to save a configurable product with variations.
  • Magento no longer performs unnecessary file check operations (for example, file_exists, is_file), which improves the performance of the category and product pages.
  • We’ve optimized compiler performance (that is, the setup:di:compile command).
  • We’ve improved the performance of the Display Time for Category Edit page for catalogs with many products or categories. GitHub-7469

Image processing

  • We’ve improved the process of resizing images on the frontend.
  • The process of loading many configurable products with multiple images (for example, configurable products with three attributes and 250 options) is more efficient. (GITHUB-6979)

Caching

  • Magento now caches image metadata, which avoids the time-consuming need to read images for metadata loading.
  • Magento now caches attribute options for the layered navigation feature. This reduces the number of queries to the database, and consequently improves performance.
  • We’ve optimized and streamlined how we cache EAV attributes by removing unnecessary SQL queries.

PHP

  • PHPCS can now correctly parse the syntax of PHP 7.x return types.
  • Cart Price rules are now applied as expected to payment method conditions. Previously, discounts set in Cart Price rules were not applied during checkout.

Sample data

  • Magento now handles the catalog_product_entity_media_gallery_value.position value the same whether you’ve installed or upgraded the product. Previously, these values differed depending upon whether you upgraded or freshly installed your Magento code.
  • You can now successfully install Magento with sample data when auto_increment_increment is set to 3 in the options file. Previously, installation completed successfully, but Magento displayed this error: Something went wrong while installing sample data. Please check var/log/system.log for details. You can retry installing the data now or just start using Magento.

SalesRule

  • You can now select and add a category to a Cart Price rule. Previously, Magento displayed this error: “Uncaught ReferenceError: sales_rule_form is not defined”, and did not add the selected category to the condition. GitHub-5526
  • A cart rule with a coupon code no longer overrides a cart rule without a coupon code when multiple cart rules are applied. Previously, when you created two cart rules and applied them to a cart, the rule with a coupon was applied, but the second rule was not. GitHub-6294
  • The SalesRule table is the same whether you’ve freshly installed or updated Magento 2.2.
  • Magento no longer discounts items that belong to an excluded category. Previously, you were unable to exclude products assigned to a specific category due to the cart price rule.
  • The Cart Price rule nows affects coupon life as expected. Previously, coupons did not persist longer than the current date if they did not have a designated end-date.
  • Customers can no longer apply a coupon code twice. Previously, the “Uses per Coupon” limit did not work for auto-generated coupons.
  • Magento now implements free shipping if there is a Cart Price Rule match. GitHub-6584
  • SalesRule now applies to auto-generated coupon codes as expected.

Scope

  • Changing a product price under the website scope now updates the product price across all stores. Previously, any price you set on the store view level overrode the price set in website scope. GitHub-5133
  • The list of allowed countries is now configured as part of website scope, not store view scope. GitHub-2946
  • A restricted user can now change storeview- or website- level attributes that are defined within his scope.
  • You can now select the scope for an action that you are running from the Catalog page’s product table.
  • The price you set on the website scope no longer overrides any local settings you set on configurable products at the store view level.
  • Out-of-stock items no longer erroneously appear in results of layered navigation if that product option is out-of-stock.
  • The Elasticsearch indexer search-by-attribute functionality now works as expected.
  • Elasticsearch does not throw errors when there are more than 100 searchable attributes or when user-defined price attributes are marked searchable.
  • ElasticSearch now includes data about composite products in its search index. Previously, search results did not include this data.
  • Magento now sends the parent_id of a deleted configurable product variation to ElasticSearch. Previously, Magento didn’t send this information to the ElasticSearch server if the simple product associated with a configurable product were changed.
  • Segmentation faults no longer occur when doing a catalogsearch_fulltext re-index, and indexing succeeds. Previously, in a large database (more than 70,000 products), the catalogsearch_fulltext (MySQL) re-index failed with a Segmentation fault message. GitHub-7963
  • Magento now implements the Attribute Weight Boosting Function for Elasticsearch.

Shipping

  • UPS now generates shipping rates for Puerto Rico postal codes.
  • Magento now displays tracking information when selected for the second shipping label created for the DHL shipping method. Previously, when you tried to display a completed DHL shipping label, Magento displayed an exception.
  • Refreshing your browser page while on the Review and Payments page of the checkout process no longer clears information from form fields. Previously, Magento cleared information from the Ship to field if you refreshed your browser page during this process.
  • You can now reload a page during checkout without unintentionally changing shipping information.
  • You can now save the settings you enter when creating a shipping label on an existing shipment. Previously, clicking the Save button resulted in an error, and the shipping label was not saved.
  • Added missing translation to label argument xml. Fix submitted by community member Mr Khoa in pull request 9095.
  • Magento no longer throws a fatal error when you create a new shipment for a placed order.
  • The State/Province field now changes to an input field as expected after you select United Kingdom when filling out the shipping address during checkout

Sitemap

  • Sitemap image URLs now match the URLs on product pages. Fix submitted by community member Petar Sambolek in pull request 9082.
  • The sitemap is no longer generated in the wrong folder when vhost is connected to /pub. Fix submitted by community member Joseph Maxwell in pull request 9094.

Staging

  • The CMS page now refreshes as expected after an update.
  • Magento no longer creates extraneous database values when you schedule new Staging updates.
  • Magento no longer performs unnecessary staging-related flag operations on the Category page. Previously, Magento performed staging-related flag operations even when the Staging module was not used.
  • You can now delete updates from a campaign’s page entity grid.
  • You can now create a staging update for a product that contains a unique attribute in its attribute set. Previously, under these conditions, Magento displayed this error: The value of attribute "test" must be unique’.
  • You can now install Magento Commerce without staging modules.
  • The Magento flat indexer no longer throws an error after flat tables are enabled and reindexed. This fix applies to both product and catalog tables. It also now collects correct product data for ROW_ID
  • The staging dashboard now loads without error when you sort by status on the dashboard. Previously, the staging dashboard broke and remained in an infinite loop when you attempted to sort by status on the dashboard.
  • You can now preview an update from the dashboard and click on links and see how the entire instance would look like for a store between some dates. Previously, the links from the Preview page were broken.
  • Magento now displays the correct content on the preview page for a scheduled update.
  • Magento now applies all scheduled product changes to all scopes.
  • The view/edit option for a scheduled change is now available for the duration that the scheduled change is in progress. Previously, you could not view or edit a scheduled change when it was in progress, which left no way to edit or remove it.
  • You can now create a new scheduled update for a product. Previously. when you tried to create an update, Magento displayed this error: Uncaught TypeError: Failed to execute 'removeChild' on 'Node': parameter 1 is not of type 'Node'.
  • Magento now displays the correct date and time for staging updates. Previously, when your current time in Daylight Saving time, and your target time was in Standard time, your target time was incorrect.
  • Magento now correctly assigns images to duplicated products.
  • Scheduled Update no longer removes simple variations from Configurable products. Previously, if you set up a scheduled update to toggle the New setting on a configurable product, Magento removes all simple variations from the configurable product once the update takes effect.
  • Content staging values for fields are now saved in database.
  • When you import products that exist in the CSV file, but not on the store (including categories), Magento now populates the categories as expected.
  • Magento no longer deletes images associated with categories scheduled for update after you modify the image.
  • Once the time frame for the scheduled update has passed, Magento removes the special price and displays the original price.
  • You can now remove a product or category from a campaign.
  • You can now preview a scheduled update for a category that contains a recently viewed block.
  • We’ve resolved a scheduling issue that previously resulted in Magento displaying a 404 error on most frontend pages. This occurred if you deleted a Catalog Rule with an end date, then ran an update.

Static file processing

  • We’ve corrected a problem with _requirejs asset retrieval via static.php in static content versioning.
  • Versioning of static files (including CSS, JS, font, and image files) is now enabled by default.
  • We’ve improved the speed of static asset deployment. See Deploy static view files for more information about available options.
  • The setup:static-content:deploy command now provides flags that you can use to exclude or include individual themes, areas, and locales. For more information, see GitHub-4294.

Swatches

  • Magento no longer creates redundant objects when initializing a configurable product on the Category page.
  • You can now disable swatches for both the Catalog page and search results (quick or advanced). To disable swatches from these requests, disable Stores > Configuration > Catalog > Storefront > Show Swatches in Product List.
  • We’ve optimized the logic that Magento uses to validate swatch attributes.
  • Magento now caches swatch data in the block cache, which improves the responsiveness of the configurable product pages.
  • Magento now correctly matches images to products. Previously, after you selected a configurable product, Magento displayed the images for another product.
  • Magento no longer displays a notice error when you create a text swatch attribute while the update product preview image setting is set to Yes. Fix submitted by community member Pascal Brouwers in pull request 6707.

TargetRule

  • Magento now displays Up-sells on the Product page.
  • We’ve fixed an SQL error that previously caused a logical error during the creation of a TargetRule. (This issue affected the modifyConditionByCategoryIdsAttribute function.)

Tax

  • Magento now correctly calculates tax and order totals when a discount is used for prices that include tax and catalog prices excluding tax. Please note this is not a valid tax configuration and can introduce rounding errors.
  • We’ve improved the performance of the Tax Rules form in installations containing many tax rates.
  • You can now create a tax rule when running Magento in Mozilla Firefox and Internet Explorer. Previously, you could not select a tax rate, and Magento displayed an error.
  • The tax_region_id value is no longer hard-coded in the \Magento\Tax\Setup\InstallData file.

Testing

  • We’ve fixed a fatal issue that occurred if you executed the CatalogImportExport test before running a subsequent test. Previously, you’d receive this error: Failed asserting that false is true.
  • We’ve fixed a fatal issue that occurred if you ran Travis builds on imagettfbbox 2.1.2. Previously, you’d receive this error:

    PHP Fatal error: Call to undefined function Magento\Framework\Image\Adapter\imagettfbbox() in /home/travis/build/magento/magento2/lib/internal/Magento/Framework/Image/Adapter/Gd2.php

  • StdoTest is now marked as skipped. Fix submitted by community member David Manners in pull request 8487.

Tier pricing

  • Magento now correctly calculates the tier price percentage when displayed prices include tax. GitHub-8833
  • Magento no longer resets the tier price during quote recalculation. Previously, when you triggered an automatic quote recalculation (by changing the shipping address, for example), the tier price was lost. (This issue occurred only if the product record in the database had values for row_id and entity_id that didn’t match.)
  • Magento no longer adds a thousands separator ( , ) to representations of quantities that exceed 1000. GitHub-5745
  • Tier pricing now works correctly with full page cache. GitHub-5364

Translation and locales

  • String localizations now work as expected when phrases include text wrapped with single quotation marks.
  • Translations now work for layered navigation attribute options. Fix submitted by community member Pieter Hoste in pull request 9873.

URL rewrites

  • You can now successfully create a product and assign it to a store without encountering the following error: Unique constraint violation found. GitHub-6671
  • The catalog_url_rewrite_product_category table is the same whether you’ve freshly installed or updated Magento 2.2.
  • You can now assign products to a category when Match Products by rule is enabled.
  • The Use default URL Key setting now works on the store-view level.
  • You no longer need to delete the URL rewrite to force Magento to display links after adding pages to the CMS hierarchy. Previously, when you added new pages to the CMS hierarchy, Magento did not show the links to the new pages until you deleted the URL rewrites.
  • We’ve fixed several issues with how Magento processes URLs with trailing slashes. Fix submitted by community member Ihor Sviziev in pull request 10043.

Varnish

  • We’ve changed the behavior of the Varnish X-header. Only the parent (meta) SKU is now included in the list – not the SKUs of all child products. GitHub-6401
  • Varnish no longer caches Cookie Restriction Mode Overlay. Fix submitted by community member Bernhard in pull request 9711.

  • Varnish now supports grace and saint mode to ensure that customers always see cached pages.

  • Viewing the page with HTTPS instead of HTTP no longer causes the Category menu to disappear in installations using Varnish cache. GitHub-4540

Visual Merchandiser

  • The order of products in a category display no longer changes when you add a new product to the category.
  • Visual Merchandiser Match products by rule now works as expected.

Web API

  • You can now use REST to add video to a product description. GitHub-7153
  • The PUT /V1/products/:sku/media/:entryId correctly updates a product’s media gallery and image role.
  • A null value may now be specified to unset the special_price attribute.
  • The Swagger documentation erroneously indicated that search queries can return detailed information about multiple objects. The description of these APIs now state which API to use to return detailed information about a single object.
  • You can now use REST to successfully update customer information without unintentionally deleting default billing and shipping address information.
  • You can now use a REST request to retrieve a shopping cart that contained a product with custom options. Previously, you could not use a REST request to retrieve a shopping cart that contained a product with custom options.
  • The PUT /V1/products/:sku/media/:entryId correctly updates a product’s media gallery and image role.
  • Searching for products via REST API using a store code in the URL returns products from all stores. GitHub-8121

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.

System requirements

Our technology stack is built on PHP and MySQL. For details, see Technology stack requirements

For more information, System Requirements.

Installation and upgrade instructions

You can install Magento Commerce 2.2 General Availability (GA) using Composer.

Install the Magento software

See one of the following sections:

Get Magento Commerce using Composer

Magento Commerce (formerly Enterprise Edition) is available from repo.magento.com. Before installing the Magento Commerce software using Composer, familiarize yourself with these prerequisites, then run:

composer create-project --repository-url=https://repo.magento.com/ magento/project-enterprise-edition=<version> <installation directory name>

where <version> is 2.1.0, 2.1.1, and so on

For example, to install 2.1.1 in the magento2 directory:

composer create-project --repository-url=https://repo.magento.com/ magento/project-enterprise-edition=2.1.1 magento2

Get Magento Commerce using a compressed archive

The following table discusses where to get the Magento software. We provide the following downloads:

  • Magento Commerce software only
  • Magento Commerce software with sample data (designed to help you learn Magento faster)

These packages are easy to get and install. You don’t need to use Composer, all you need to do is to upload a package to your Magento server or hosted platform, unpack it, and run the web-based Setup Wizard.

Archives are available in the following formats: .zip, .tar.bz2, .tar.gz

To get the Magento Commerce archive:

  1. Go to your account on magento.com.
  2. Log in with your Magento user name and password.
  3. In the left navigation bar, click Downloads.
  4. In the right pane, click Magento Commerce 2.X > Full Release or Magento Commerce 2.X > Full Release + Sample Data for the software.
  5. Follow the instructions on your screen to complete the Magento Commerce download:

    • Magento-EE-<version>.* (without sample data)
    • Magento-EE-<version>+Samples.* (with sample data)
  6. Transfer the installation package to your development system.

Complete the installation

After you get the Commerce software:

  1. Set file system ownership and permissions.
  2. Install the software:

Upgrade from an earlier version

To upgrade to Magento Commerce 2.1 from an earlier version, see Upgrade to Magento version 2.1 (June 22, 2016).

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.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts.