Magento Commerce 2.2.4 Release Notes

Patch code and release notes published on May 2, 2018. Release notes revised on July 1, 2018.

We are pleased to present Magento Commerce 2.2.4. This release includes new tools and numerous functional fixes and enhancements, plus a substantial number of contributions from the wider Magento community.

Highlights

Look for the following highlights in this release:

  • Significant new bundled extensions that add instant and accurate tax and shipping calculations right from the cart:

    • Amazon Pay provides a trusted, familiar way for customers to check in and check out. See Amazon pay for a full description of the advantages this solution offers merchants and their customers.

    • Vertex simplifies and automates the complexity of calculating sales tax. Check out the Magento User Guide discussion of Vertex, too.

    • Klarna Payments is a new payment method. With Klarna Payments, merchants can provide customers with the option to pay now, pay later, or pay by installment for their purchases. See Magento User Guide for information on using Klarna with Magento. For more information on Klarna products, see Klarna Payments.

  • Numerous fixes and enhancements to the Magento Shipping and dotmailer bundled extensions. Merchants can now use dotmailer to create their own transactional email templates. Magento Shipping capabilities have been expanded, too.

  • Fixes and enhancements to core features, including performance improvements that enable faster shopping with image loading and search performance enhancements.

  • Almost 200 community contributions. These community contributions include performance-tuning enhancements plus at least 80 engineering fixes.

Looking for more information on these new features as well as many others? Check out Magento 2.2.x Developer Documentation and the Magento Commerce User Guide.

Enhancements

This section describes changes in this release that are not full-fledged features or bug fixes, but that add noticeable improvements to product performance or ease-of-use.

  • The admin global search is now translatable, extensible, and takes into account the ACL settings for the current user. See Using global search for more information. Fix submitted by Roman K. in pull request 1167. GitHub-7698
  • The multi-shipping checkout flow now supports the CyberSource payment method. This payment method is supported by Magento Commerce only. As part of the process of adding CyberSource support, we’ve made improvements to the Multi-shipping module to simplify integration process for other payment methods.
  • Magento has an automated checker to enforce the short array syntax convention that we are now enforcing in new code. This standard complies with all requirements of PSR-2. Fix submitted by Nickolas Malyovanets in pull request 12499.
  • Magento now provides dedicated payment and shipping debug log files to store information specific to those functional areas.
  • The Emogrifier dependency has been upgraded to 2.0.0 or later. Fix submitted by Oliver Klee in pull request 13132.
  • We’ve replaced is_null with strict comparison only for models and block in the following modules: Catalog, Tax, Sales, and EAV. Fixes submitted by Alexander Shkurko in pull requests 13171, 13170, 1163.

dotmailer enhancements

The dotmailer bundled extension features the following enhancements for this release:

  • The new Abandoned Cart report table

  • The ability for merchants to design their own transactional email template

  • Enhancement of syncs of subscriber’s sales data. Sales data is now synced only if the sales data option is enabled in config.

  • The ability to set transactional email at the Store level

  • Enhanced validation for deletion of cron job CSV files

Known issue

Note: The following known issue has been resolved in Magento Commerce and Open Source 2.2.5. We recommend that all users of 2.2.4 upgrade to 2.2.5 at their earliest convenience. If you are unable to upgrade to 2.2.5, Patch MAGETWO-92926 provides a fix for this issue.

Customers have reported the following behavior after upgrading to Magento 2.2.4 in deployments that span multiple websites:

Magento multi-store installations do not use the store view-specific values from the store configuration settings if these settings have different values than the global default configuration settings. Instead, Magento uses the default configuration for all store views. GitHub-15205, GitHub-15245

We do not recommend upgrading to Magento 2.2.4 if you deploy across multiple websites. Note that this problem is not triggered if you have only a single website with multiple stores or store views.

Fixes

Installation, setup, and deployment

  • The backup command now works as expected. Fix submitted by Jagriti Joshi in pull request 13066. GitHub-12877
  • Links to Magento installation documentation in setup/view/magento/readiness-check/progress.html are now correct. Fix submitted by Jonas Hünig in pull request 12857.
  • You can now use the app:config:status command to check whether configuration propagation is up-to-date. Fix submitted by Juan Alonso in pull request 12441.
  • The bin/magento setup:rollback -d filename.sql command now works as expected. Previously, this database rollback operation failed on certain versions of Magento (for example, 2.1.9). Fix submitted by Roman K. in pull request 12108. GitHub-12064
  • You can now set API access to integrations for Admin roles, which gives privileged users the ability to grant limited access to users such as third-party integrators. GitHub-9684
  • You can now enable or disable the Magento Profiler from the command line. GitHub-9277
  • The icons for Extension Manager and Module Manager are now consistent with the main content area and left-hand menu of the Web Setup Wizard. Fix submitted by Danny Verkade in pull request 11388. GitHub-11236
  • Magento now continues operating in maintenance mode if it was previously enabled. Previously, Magento disabled maintenance mode when you used one of these commands:

    • bin\magento module:uninstall
    • bin\magento setup:backup
    • bin\magento setup:rollback
    • bin\magento theme:uninstall
    • bin\magento deploy:mode:set production

Fix submitted by Joke Puts in pull request 11052. GitHub-9918

  • You can specify a custom version for static files being deployed, and now nginx sample config files can match these custom versions, too. Fix submitted by Scott Buchanan in pull request 12521.
  • The CrontabManager.php file has been updated as follows: If crontab has already been populated, the bin/magento cron:install command adds #~ MAGENTO START and the rest of code directly to the last row of crontab without any spaces. Fix submitted by Michele Fantetti in pull request.
  • The ext-bcmath PHP extension is now required in Open Source. Previously, it was required for Commerce only. Fix submitted by Mobecls in pull request 12768.
  • The cache_lifetime default setting for the Magento\Theme\Block\Html\Footer block is no longer set to false, and the new default setting is 3600. Fix submitted by zolat in pull request 13762.
  • The bin/magento maintenance:allow-ips command now has the --add flag, which appends a new IP address to the list of allowed IP addresses. Previously, when you added a new IP address, you had to copy the existing addresses. Fix submitted by Barry vd. Heuvel in pull request 13586.
  • The config:set command now has a lock-config option, and configuration values are always stored in app/etc/config.php instead of app/etc/env.php. Fix submitted by Andreas von Studnitz in pull request 13280.
  • In the Backend/etc/adminhtml/system.xml file, the url group and redirect_to_base field are now configured so that the showInWebsite and showInStore attributes are set to 1. Fix submitted by JeroenVanLeusden in pull request 13614.
  • You can now deploy static content on demand while in production mode.
  • The output of the Magento maintenance:status command no longer inserts a comma in between IP addresses, making it easier to copy and paste the values. Fix submitted by Barry vd. Heuvel in pull request 13587.
  • The DeploymentConfig reader now always returns an array. Fix submitted by Barry vd. Heuvel in pull request 13584.
  • Magento has improved how it manages the size of the cron_schedule table. GitHub-11002
  • Magento now includes a helper object to facilitate access to styling objects in the Symfony console. Fix submitted by Wesley Guthrie in pull request 11504.
  • Magento no longer throws an error when you try to generate a URN catalog for an empty misc.xml file. Fix submitted by Timon de Groot in pull request 11686. GitHub-5188
  • The sampledata:deploy and remove commands now have no-update options. Fix submitted by Fabian Schmengler in pull request 12359.
  • The currencies dropdown menu that is available during the setup process (step 4 – customize your store) no longer displays unallowed currencies. Fix submitted by Ricardo Martins in pull request 13770.

Bundle products

  • Save operations now work as expected for bundle products. Fix submitted by dzianis-yurevich in pull request 12734. GitHub-6916
  • You can now duplicate a bundle product without stripping the original bundle product of its options. Fix submitted by MattUnity in pull request 1217.

Catalog

  • Magento now successfully updates a product’s stock_item extension_attribute parameter for a product previously created using REST. Fix submitted by nuzil in pull request 13494.
  • When two customers check out concurrently for the same product, one of the checkouts now succeeds. Previously, when two customers checked out concurrently for the same product, and the total quantity being ordered is greater than the quantity available, the stock could become negative. Fix submitted by Myroslav Dobra in pull request 2133.
  • The getUrl method in Magento\Catalog\Model\Product\Attribu… no longer returns image URLs with unexpected double slashes. Fix submitted by Igor Tregub in pull request 13498.
  • When sorting by price, Magento now displays the same number of products no matter how it sorts products in the Catalog Product list. Previously, Magento reduced the product count by the number of disabled products when sorting by price.
  • The category filter used for layered navigation for configurable products with no available options now counts products accurately.
  • When you set the category_ids attribute to be visible in the storefront catalog, Magento now displays catalog listings as expected. Previously, Magento threw an exception. Fix submitted by Manu Gonzalez Rodriguez in pull request 11389. GitHub-11341
  • Product display issues within categories that have been filtered by price have been resolved: Products are no longer repeated within a category, and random products are no longer included. Fix submitted by Mayank Zalavadia in pull request 11429. GitHub-11139
  • Updating a product with the REST API (PUT /rest/all/V1/products/example_sku) no longer assigns the product to all websites automatically. (Automatic assignment to all websites now occurs only when you create the product in All Store Views scope.) Fix submitted by adrian-martinez-interactiv4 in pull request 11444. GitHub-11324
  • Magento no longer throws an error when you re-save a product attribute with a new name. Fix submitted by Raul Mateos in pull request 11617. GitHub-6770
  • You can now successfully remove a toolbar from a product listing page. Previously, you could explicitly remove the toolbar from layout configuration, but Magento would return product_list_toolbar to the layout. Fix submitted by mariuscris in pull request 11473. GitHub-9413
  • The getAttributeText($attributeCode) method now returns string values as expected. Previously, this method returned an array of attribute values. Fix submitted by p-bystritsky in pull request 12003.
  • You can now add customizable options to a product. Previously, when you tried to add a custom option to the product, Magento threw this error: A 'Uncaught TypeError: Cannot read property 'apply' of undefined' error. Fix submitted by Roman K. in pull request 11965. GitHub-11792
  • Magento now correctly decodes single quotation marks in the Admin attribute option input fields. Fix submitted by erfanimani in pull request 12133. GitHub-12127
  • You can now save emojis in custom product options. Fix submitted by Carlos Lizaga in pull request 12253.
  • Magento no longer displays unused product attributes with a value of N/A or NO on the storefront. Fix submitted by p-bystritsky in pull request 12057. GitHub-6634, GitHub-9961
  • The delay parameter now works as expected, which permits you to set the delay on the JQuery widget opening or closing. Previously, this parameter was documented, but did not work as expected. Fix submitted by Sam Carr in pull request 12161.
  • Third-party category images now have size and type properties. Fix submitted by Vova Yatsyuk in pull request 12161.
  • Category page X-Magento-Tags headers no longer contain product cache identities when category display mode is set to Static block only. Fix submitted by Atish Goswami in pull request 12466.
  • You can now delete rows in the dynamicRows component. Fix submitted by Roman K. in pull request 921. GitHub-8830
  • You can now add a new product with custom attributes that have the same name and attributes as a previously deleted product. Previously, Magento did not let you add this new product because a request_path with the same value already existed in table url_rewrite from the previous product. Fix submitted by Nickolas Malyovanets in pull request 12167. GitHub-12110
  • The og:type meta tag content value has been corrected from <meta property="og:type" content="og:product" /> to <meta property="og:type" content="product" />. Fix submitted by Atish Goswami in pull request 12530.
  • The Product Image Watermark Size Validation message has been revised for accuracy. Fix submitted by Nickolas Malyovanets in pull request 985. GitHub-12613
  • Magento no longer creates an extraneous new product when you save an existing product whose SKU you’ve changed. Fix submitted by Nickolas Malyovanets in pull request 984. GitHub-12535
  • cURL requests to delete a product’s tier pricing when used on store code all now works as expected. Previously, this cURL request deleted the tier pricing but also all the image selections for the product. Fix submitted by Nickolas Malyovanets in pull request 977. GitHub-10797
  • Sort by Price now works as expected on the catalog search page. Fix submitted by Roman K. in pull request 929. GitHub-12468
  • If an error occurs when you run catalog:images:resize, Magento now includes an entry into the log file. Previously, Magento displayed an error message, but did not add an entry into any log files. Fix submitted by Roman K. in pull request 1000. GitHub-8204
  • You can now duplicate and save a product successfully. Previously, you could not successfully duplicate a product, and Magento displayed this message: Notice: Undefined offset: 0 in /home/software/public_html/vendor/magento/module-catalog/Model/Category/Link/SaveHandler.php on line 124. Fix submitted by p-bystritsky in pull request 983. GitHub-12259
  • The REST API now saves all product properties as expected. Previously, Magento did not save the price and weight, and these attributes were not returned in the result of the POST request. Fix submitted by Nickolas Malyovanets in pull request 1018. GitHub-6486
  • Duplicate email IDs no longer occur on the Magento default contact page when running Google Chrome { Version 63.0.3239.84 (Official Build) (64-bit) }. Fix submitted by serhii-balko in pull request 1036. GitHub-12712
  • The hasDataChanges attribute for loaded EAV collection items now returns true or false as expected. Previously, this attribute always returned true. Fix submitted by virtual97 in pull request 12736. GitHub-12374
  • ajax:addToCart now contains the eventData parameter, with variables for SKU and quantity. Fix submitted by Renon Stewart in pull request 12875.
  • You can now successfully save a new option for a product custom attribute when the value of Admin scope is empty. Previously, Magento threw an exception. Fix submitted by virtual97 in pull request 12755.
  • You can now sort product collections by the is_saleable attribute. Fix submitted by Nickolas Malyovanets in pull request 1045. GitHub-7768
  • We’ve added a failsafe to the items.phtml file. Fix submitted by Sam Granger in pull request 13086.
  • You can now save a product with customizable options. Previously, if you were trying to add a customizable option (for example, a customer group) to a product, Magento did not let you save the product, the form did not close, and a validation issue was triggered. Fix submitted by luismiguelyangehuaman in pull request 12048. GitHub-11528
  • Magento now correctly displays stock status for products. Fix submitted by Roman K. in pull request 955.
  • Visual Merchandiser now includes website scope when displaying the correct prices and availability of configurable products.
  • The catalog product list widget now works with multiple SKUs. Previously, Magento displayed this error, We're sorry, an error has occurred while generating this email. Fix submitted by Nickolas Malyovanets in pull request 1050. GitHub-11897
  • Magento now loads type-dependent layout handles before more specific ID/SKU layout handles. Previously, when Magento updated a product page layout for a specific ID with catalog_product_view_id_<product_ID>.xml, some changes were overwritten by a less specific catalog_product_view_type_<product_type>.xml. Fix submitted by Andreas Schrammel in pull request 12807.
  • Unused temporary variables have been removed from Adminhtml/Category/Save.html. Fix submitted by Pierre Martin in pull request 13663.
  • Language switching now works as expected on the Catalog and Product pages. Previously, language switching did not work on these pages in production mode. Fix submitted by p-bystritsky in pull request 1143. GitHub-11963
  • The subcategory URL path is now updated for a store view according to the URL path of its parent category.
  • In cases where imagebuilder makes multiple calls, it no longer re-uses attributes from the first call if attributes from a second call are empty. Previously, imagebuilder re-used the attributes from the first call, which lead to unexpected results in storefront image display. Fix submitted by Ihor Sviziev in pull request 13438.
  • updateCart.phtml now uses dynamic rather than hardcoded validators. Fix submitted by Gil Greenberg in pull request 13462.
  • An unused constructor dependency has been removed from the Product Link Save handler. Fix submitted by Ihor Sviziev in pull request 13436.
  • A database backup created by setup:backup --db and restored with setup:rollback -d now includes triggers as expected. Previously, the restored database did not include triggers, which meant that indexes could not work correctly. Fix submitted by Denis Ristic in pull request 11369. GitHub-9036
  • The Low Stock report now accurately lists all out-of-stock products. Previously, this report was not accurate when the All Websites view was selected. Fix submitted by gwharton in pull request 13682. GitHub-10595
  • We’ve improved the visibility of products when displayed by category, and you can now filter by status. Fix submitted by Peter Jaap Blaakmeer in pull request 12564.
  • Magento now correctly sets a product_links position attribute even when the attribute value is not set in a GET request. Previously, only the first two of each link type was shown in the backend or in a GET request response, even though Magento correctly added the product links to the database. Fix submitted by Mohammad Haj-Salem in pull request 12650.
  • We’re resolved issues with product creation that occurred on installations of Magento Commerce with B2B installed and Update by Schedule indexer mode set.

Cart and checkout

  • Magento no longer adds addresses with saveInAddressBook set to 0 to the address book for new customers. Previously, if you placed an order as a guest and set the save_in_address_book setting for an address to 0, Magento still copied that address to the customer address book when registering as a new customer on the checkout success page. GitHub-7691
  • Magento no longer combines the Custom Checkout and Shipping steps when Magento loads the checkout page. Fix submitted by Roman K. in pull request 975.
  • You can now successfully change currency for an order before you complete the order. Previously, if you changed currency, when you proceeded to checkout by choosing a Bank Transfer Payment as Payment Method, Magento displayed, Your credit card will be charged for. Fix submitted by Roman K. in pull request 993. GitHub-12526
  • Magento no longer throws a JavaScript error on the cart from postcode validation when the United States is deselected in the Allowed Countries Admin option (Admin > Stores > Settings > Configuration > General > Default Country). Fix submitted by codekipple in pull request 13051.
  • Street format spacing when multiple streets are present is now consistent across Shipping and Review & Payments checkout steps. Fix submitted by nfourteen in pull request 13082.
  • Magento now displays text on the New Cart Rules page correctly. Previously, labels listed in the Store View Specific Labels section of this page was sometimes truncated or duplicated. Fix submitted by serhii-balko in pull request 1146. GitHub-12231
  • When you check out as a guest and click Create an account on the success page, you can now click on the customer name to jump to the customer record. Fix submitted by Renon Stewart in pull request 12998.
  • The XML_PATH_CUSTOMER_MUST_BE_LOGGED constant has been deprecated. Fix submitted by Roman K. in pull request 1148. GitHub-7848
  • dropdownDialog is now required when the mini cart is available. Fix submitted by Alexander Menk in pull request 13830.
  • The Check Out with Multiple Addresses page now displays an empty state field as expected when a customer changes from one address to another. Fix submitted by enriquei4 in pull request 13364. GitHub-8621

Configurable products

  • You can now use custom price symbols when assigning prices to configurable prices. Previously, Magento did not properly display prices for configurable products when you used a custom price symbol when assigning prices. Fix submitted by pradeep-wagento in pull request 13025. GitHub-12430
  • Magento now reorders configurable attribute options as expected on the product page. Fix submitted by wardcapp in pull request 12963. GitHub-7441
  • Magento now displays elements of the Catalog > Products > Create Configurations page correctly. Previously, the currency symbol overlapped with the attribute option’s price during the creation of a configurable product. Fix submitted by Vasilina in a pull request.
  • If you enter an invalid value for an SKU during the creation of the configurable product, Magento now displays a warning and does not let you save the product. Previously, you were not warned about invalid SKU values, and when you clicked Save, all the product information you entered was lost. Fix submitted by Zamaroka in pull request 12737. GitHub-11953
  • Magento now correctly runs a partial attribute (EAV) reindex of configurable products whose child products’ visibility is set to Not Visible Individually. Fix submitted by Roman K. in pull request 1023. GitHub-12667
  • Magento now displays the ID and Visibility parameter of child products when you use the LinkManagementInterface service contract to retrieve the ID and visibility of these products. Previously, Magento displayed NULL. Fix submitted by Nickolas Malyovanets in pull request 986.
  • The product price indexer (catalog_product_price reindex) no longer stalls during reindexing.
  • Product records inside the catalog_product_super_link table are no longer updated needlessly when you save a configurable product. Previously, saving configurable product erased and then reinserted records in the catalog_product_super_link table even when child products were not changed. This practice quickly resulted in an unnecessarily large catalog_product_super_link table, especially in multi-website installations.

Customer accounts

  • Magento now trims trailing and leading spaces when saving the name of a new contact. Fix submitted by wardcapp in pull request 12964. GitHub-10415
  • We fixed the invalid parameter configuration that was provided for the $block argument of Magento\\Ui\\Component\\HtmlContent. Fix submitted by Tomasz Gregorczyk in pull request 12964.
  • Magento now successfully sends an email (with content) even when you make a mistake in the email template file name. Previously, when the template name was incorrect, Magento sent the email with no content. Fix submitted by Roman K. in pull request 970. GitHub-8437
  • You can now import customer addresses from websites with country restrictions.
  • Magento no longer displays the Too many passwords reset requests error when the max wait time between password resets setting has been disabled. Previously, when you attempted to reset a customer’s password through the Admin, Magento threw an error even when you disabled the max wait time between password resets setting in the store configuration settings. Fix submitted by Cole Hafner in a pull request. GitHub-11409
  • Magento no longer throws an exception when you try to open your account address book immediately after creating a customer. Fix submitted by Chris Pook in pull request 12220. GitHub-12180
  • The isConfirmationRequired method in the AccountManagement class is now public, which makes it available for plugins. (For example, you can now develop custom business logic to decide if confirmation is required (yes/no) for certain customers.) Fix submitted by Derrick Heesbeen in pull request 11878.
  • When configuring a customer account, you can now leave the prefix or suffix fields as optional. Previously, if you did not select an option for these fields, Magento defaulted to selecting the first option in the list. Fix submitted by Andreas von Studnitz in pull request 11462. GitHub-7241
  • The storefront Back to Sign in button now works as expected. Previously, when you clicked that button, Magento simply reloaded the current page. Fix submitted by StasKozar in pull request 12759. GitHub-12715
  • The window.checkout.customerLoginUrl now contains a URL that includes the referrer in base64 encoding (for example, https://myShop.com/customer/account/login/referrer/aHR0cHM6Ly9teXNob3AuY29tL2NoZWNrb3V0). Previously, the login URL did not include a referrer (for example, https://myShop.com/customer/account/login). Fix submitted by Tommy Quissens in pull request 12630. GitHub-12627
  • When you are on the cart page and click a product’s Edit link, the product page now correctly displays the product quantity currently in the cart. Fix submitted by Arnoud Beekman in pull request 13310.
  • You can now create a custom attribute of type file for Customer objects as expected. Previously, you could create the custom attribute, but the file would not upload. Fix submitted by Mkennethsmith in pull request 13563. GitHub-11252
  • The event customer_address_after_save_viv_observer is now spelled correctly in the Customer events.xml file. Fix submitted by Renon Stewart in pull request 13661.
  • The is_subscribed extended parameter is now returned when a web API is used to modify or return information about a customer.

Dashboard

  • The top destinations configuration field is now configurable on a store level. Previously, it was configurable on the global level only. Fix submitted by Andreas von Studnitz in pull request 13052.
  • When multiple validation errors occur while saving a customer address, Magento now shows unique messages in the adminhtml customer edit page. Fix submitted by adrian-martinez-interactiv4 in pull request 12922.
  • The scrollbar on the Admin store switcher is now scrollable on machines running OSX. Fix submitted by Juan Alonso in pull request 12931.

Directory

  • The \Magento\Directory\Model\PriceCurrency::format() method no longer fails if you do not configure a conversion rate from the base to the specified currency. Previously, if you did not specify this conversion rate, Magento rendered the price (amount) in the base currency, not the specified currency. Fix submitted by Nickolas Malyovanets in pull request 1022. GitHub-6965
  • Magento now requires that customers select State/Province when shipping orders to India, and the checkout page now provides a drop-down field with appropriate values. Fix submitted by p-bystritsky in pull request. GitHub-12378
  • You can now disable the State is Required for field. Fix submitted by Burlacu Vasilii in pull request 12917. GitHub-12894

EAV attributes

  • Creating new configuration attributes no longer causes naming collisions in the JavaScript UI registry. Previously, when you created a new default attribute and then subsequently created a new product, JavaScript errors occurred. Fix submitted by Volodymyr Zaets in pull request 12945. GitHub-12555
  • You can now use a single query to retrieve attribute groups from multiple attribute sets. Fix submitted by Marius Strajeru in pull request 12105. GitHub-11936
  • Magento now saves multi-select attributes for a product that has a related product using another attribute set. Previously, multi-select attribute values were not saved for a product in the Admin panel when it had a related product that used another attribute set. Fix submitted by awarche in pull request 12767.
  • The product attribute repository save method no longer resets the source model to null when you create a new product attribute through code. Fix submitted by Nickolas Malyovanets in pull request 1012. GitHub-10814
  • Magento now uses the correct entity_model in table eav_entity_type for invoices (Magento\Sales\Model\ResourceModel\Order\Invoice). Previously, in table eav_entity_type for entity_type_code = "invoice" the entity_model was Magento\Sales\Model\ResourceModel\Order. Fix submitted by Nickolas Malyovanets in pull request 980. GitHub-10123
  • When a validation message is returned, Magento no longer displays the attribute code ($attrCode), but instead returns the label ($label). This change makes it easier to translate messages. Fix submitted by Hewerson Freitas in pull request 12120.
  • You can now perform a mass update on products that have more than 60 attributes.
  • Magento\Eav\Model\Config::getAttribute now stops the Profiler before it returns Profiler runtime. Previously, Magento\Eav\Model\Config::getAttribute did not stop the Profiler from returning early and consequently reported incorrect runtime. Fix submitted by Nick Anstee in pull request 12810.
  • The beforeSave method encodes an attribute value only when it has not yet been encoded. Previously, the JSON-encoded attribute value was loaded correctly, but when you saved a product multiple times, the attribute value was also encoded multiple times. Consequently, Magento did save the product and displayed this error, Unable to unserialize value. Fix submitted by Tibor Kotosz in pull request 13551.
  • The deprecated each() function has been removed from the code. Fix submitted by Ihor Sviziev in a pull request.

Email

  • Order confirmation emails from the Admin in multistore environments no longer default to the primary store, but instead are sent from the store that the customer used. Fix submitted by Roman K. in pull request. GitHub-11740
  • Magento no longer sends misleading feedback when sending tracking information email. Previously, instead of sending a notice that a shipment was underway, this response was sent, You sent the shipment. Fix submitted by Nickolas Malyovanets in pull request 1245. GitHub-5697

Frameworks

  • You can now switch to default mode from production mode. Previously, if you tried to switch back to default mode, Magento displayed this error, Cannot switch into given mode 'default'. Fix submitted by Etty in pull request 12752. GitHub-4292
  • vendor/magento/framework/composer.json now declares a dependency on magento/zendframework1. Previously, packages depending on magento/framework packages failed to execute. Fix submitted by Ihor Sviziev in pull request 12990. GitHub-12967
  • The filePutContents('file.txt') now contains content as expected. Previously, Magento threw this error, The specified "file.text" file could not be written*. Fix submitted by Nickolas Malyovanets in pull request 962. GitHub-7467
  • You can now subscribe to events that contain a number in their name. Fix submitted by Mobecls in pull request 12758. GitHub-5035
  • PhpDoc now shows correct parameter types. Previously, PhpDoc showed only a type of string, although array was also a valid parameter type. Fix submitted by Freek Vandeursen in pull request 12826.
  • Content no longer jumps when pages are reloaded on the Admin because notices-wrapper now has a min-height setting. Fix submitted by Anna Völkl in pull request 12985.
  • We’ve corrected a typo in the Magento\Ui\Controller\Adminhtml\Index\Render action. Fix submitted by Nick in pull request 12951.
  • X-Magento-Vary and PHPSESSID now have the same expiration time. Previously, the X-Magento-Vary cookie had an expiration of session, which meant it was not considered expired until the browser was closed. In contrast, the PHPSESSID cookie had a finite expiration time (not session). At times, this resulted in Magento caching the wrong page for the logged-in user.
  • \Magento\Config\Model\Config\Structure\Reader::processingDocument now throws a more helpful validation exception. Fix submitted by Patrick McLain in pull request 12859.
  • Creating an observer that uses ObserverInterface no longer triggers a patch-level dependency on magento/framework. Fix submitted by Kristof in pull request 13759.
  • RewriteBase directive has been added to the .htaccess file in pub/static to support the potential installation of Magento code under a directory inside the web root. Fix submitted by Cristiano Casciotti in pull request 13678.
  • The doc block of the walk method in a collection now correctly describes that the method accepts a string or array. Fix submitted by ByteCreation in pull request 13373.
  • The report processor now returns an HTTP 500 status code (which better communicates the need for user action) instead of a 503 status code. Fix submitted by Andrew Howden in pull request 11513. GitHub-11512

App framework

  • The customer grid indexer now works as expected. Previously, this indexer did not work when reindexing using the command-line interface during the upgrade. Fix submitted by Leonid Poluyanov in pull request 10838. GitHub-10838
  • expectException() calls now accept two parameters (instead of one). Fix submitted by Fabian Schmengler in pull request 11099. GitHub-11059
  • The findAccessorMethodName() method (Magento\Framework\Reflection\NameFinder) now provides a more helpful exception message. Fix submitted by Roman K. in pull request 12303. GitHub-9764
  • Customers with an empty Date of Birth field can now be saved even when the field is not marked (or checked on the JavaScript side) as mandatory. Fix submitted by Vova Yatsyuk in pull request 12302. GitHub-12146
  • You can now alter the transport variable in the email_invoice_set_template_vars_before event. Fix submitted by Roman K. in pull request 12132. GitHub-10210
  • Validation of South Korean zip codes now supports current South Korean zip code format. Fix submitted by Roman K. in pull request 903. GitHub-9515

Configuration framework

  • Scope-based configuration now decrypts data as expected. Previously, scope-based configuration failed to decrypt data on the default store only. Fix submitted by DubovykOleksandr in pull request 8591.

JavaScript framework

  • The depends field now works for fields of type radio in system.xml. Fix submitted by Javier Villanueva in pull request 11539.
  • Magento now sorts fields and amounts as expected when you extend a dynamic-row element in a ui_component and add a sort order attribute with an amount that falls between the other elements’ amount. Fix submitted by Harald Deiser in pull request 11846.

Session framework

  • The Setup Wizard page now loads successfully when the session storage method is Memcache. Previously, Magento returned an HTTP 500 error when you navigated to System > Tools > Web Setup Wizard Setup Wizard in installations where you’ve configured the session storage method to Memcache in env.php. Fix submitted by Marty S in pull request 11608. GitHub-9633
  • When you add a product to your wish list after logging out, Magento now redirects you to your account Wish list page and adds the product. Previously, you were redirected to your wishlist page, but Magento did not add the product. Fix submitted by Oscar Recio in pull request 12038. GitHub-11825
  • Anonymous calls using REST no longer trigger the creation of PHP sessions. Fix submitted by serhii-balko in pull request 1247. GitHub-7213

Web API framework

  • A user who has been denied permissions for negotiable quote editing can now create customer addresses.
  • Swagger now works as expected on instances of Magento that are running on non-standard ports. Fix submitted by JeroenVanLeusden in pull request 12541.
  • You can now set attribute values to empty strings using REST. Previously, Magento would not let you use REST to pass the following attributes with empty values: special_from_date, special_to_date, and special_price. Fix submitted by Roman K. in pull request 916. GitHub-8862
  • We’ve updated the webapi module to improve the order of how arguments are merged in multiple di.xml files. Fix submitted by serhii-balko in pull request 995. GitHub-8647
  • SearchCriteriaBuilder now has a check to determine if sort order should be applied. Previously, SearchCriteriaBuilder built wrong criteria (ORDER BY part). Fix submitted by Nickolas Malyovanets in pull request 1003. GitHub-5738
  • Anonymous Web API access to the Admin now unlocks REST catalog calls without requiring auth tokens. Fix submitted by Roman K. in pull request 904. GitHub-9468

Zend framework

  • vendor/magento/framework/composer.json now declares a dependency on magento/zendframework1. Previously, packages depending on magento/framework packages failed to execute. Fix submitted by Ihor Sviziev in pull request 12990.

General

  • A customer can now successfully log out of a session and then immediately log back in. Previously, if a customer logged out and then attempted to log in without the logout success page first completing its timeout, Magento displayed the logout page. Fix submitted by Vinay Shah in pull request 13040.
  • Magento now displays notification messages for only the expected duration. Previously, Magento displayed these messages indefinitely within a session. Fix submitted by p-bystritsky in pull request 1111. GitHub-11527
  • Sorting by product name now works as expected when filters are applied. Fix submitted by p-bystritsky in pull request 1192. GitHub-12860
  • We’ve removed the Magento\ProductAlert\Controller\Add\TestObserver class. Fix submitted by Alexander Shkurko in pull request 13174.
  • In the top-level README file in the Magento Open Source repository, all links to DevDocs have been updated to 2.2. Fix submitted by Bhargav Mehta in pull request 13161.
  • Elements within an array in store_website table are now correctly formatted. Fix submitted by Nolwennig Guilbert in pull request 13324.
  • A type error in CartTotalRepository has been resolved. Previously, CartTotalRepository could not handle extension attributes in quote addresses, and Magento threw a PHP Fatal error: Uncaught TypeError. Fix submitted by p-bystritsky in pull request 12993. GitHub-12993, GitHub-12819
  • The WYSIWYG editor image insertion process now takes into account the static URLs configuration value (configuration setting cms/wysiwyg/use_static_urls_in_catalog). Fix submitted by Nickolas Malyovanets in pull request 1215. GitHub-12147
  • The <![CDATA[]]> statement in the system.xml file now works as expected. Previously, when you entered an XML layout update with CDATA for the first time, it worked as expected. After you saved the file, however, the CDATA tag disappeared. Fix submitted by serhii-balko in pull request 1163. GitHub-12322
  • Magento now strips out unnecessary whitespace in the attribute value IDs used on the review form. Previously, rating titles with whitespace resulted in broken ID attributes. Fix submitted by Nickolas Malyovanets in pull request 1119. GitHub-5451
  • The header label Price in the invoice PDF is now correctly aligned with the invoice item’s price. Fix submitted by serhii-balko in pull request 1216. GitHub-8453
  • Google Analytics pageview is no longer triggered twice. Fix submitted by Bhargav Mehta in pull request 13034. GitHub-12221
  • Minor display issues on the Magento home product page have been resolved. Fix submitted by Punit Vaswani in pull request 13081. GitHub-11796
  • We’ve removed a condition from the password reset strength meter that caused a JavaScript error. Fix submitted by Alisson Oldoni in pull request 13429.
  • The copyright year has been updated to 2018. Fix submitted by Bhargav Mehta in pull request 13027.
  • Magento now displays the Contact Us page on the menu as expected. Previously, Magento displayed unnecessary space between the category page and the main footer. Fix submitted by Sanjay Patel in pull request 13026. GitHub-12601
  • The Learn More Link widget option in the Recently Viewed Products widget now respects its setting. Fix submitted by JeroenVanLeusden in pull request 12946.
  • An unused if statement in the order invoice Save.php has been removed. Fix submitted by JeroenVanLeusden in pull request 12887.
  • The sid variable no longer appears in the storefront URL even if it has been disabled in the Admin. Previously, even when the Magento setting General > Web > Session Validation Settings > Use SID on Storefront was set to No, the sid variable no longer appears in the URL. Fix submitted by Roman Strelenko in pull request 12743. GitHub-9453
  • The menu item handling has been refactored to read item data from two different sources:

    • from original XML definition if the cache is empty
    • from transformed item data when available in the cache. Fix submitted by Pavel in pull request 12747. GitHub-9720
  • A typo in the SINGLE_PRODUCT_LAYOUT_HANLDE constant has been fixed. Fix submitted by Andreas Schrammel in pull request 12786.
  • The tracking link no longer returns a 404 error in the Admin. Fix submitted by Ihor Sviziev in pull request. GitHub-12206
  • The product option value price calculation has been improved. Previously, tier prices and customs options were not calculated correctly. Fix submitted by Marina Gociu in pull request 11563. GitHub-5774
  • White space that is prepended to a coupon code no longer causes an error. Previously, Magento did not apply the coupon and displayed this message: Coupon code is not valid. Fix submitted by Roman K. in pull request 1021. GitHub-12656
  • The modified date field on editing pages is now updated as expected. Fix submitted by Oscar Recio in pull request. GitHub-12625
  • Links to Magento Connect on the Partners and Extensions page have been removed and replaced with links to Magento Marketplace. Fix submitted by Miguel Balparda in pull request 12633. GitHub-12632
  • HTML tags have been removed from the display of attribute names in the dropdown menu of the Catalog Product list. Fix submitted by Nickolas Malyovanets in pull request 968. GitHub-8011
  • Magento now displays the orders that are associated with customer accounts on the Orders page. Previously, in the Admin display of customer accounts that have orders associated with them, Magento did not display orders on the Orders tab but instead displayed a blank page.
  • Magento now displays information messages about both successful and failed actions when a company administrator adds or deletes entries in the Company Users section. Previously, Magento displayed this error message, Something went wrong in the response body, and did not display a message.
  • The credit card form is now available when you create an order from the Admin, even when only one payment method is enabled. Previously, when only one payment method was enabled, the Admin did not render this form.
  • Full Page Cache is no longer invalidated after you save a predictor category. Previously, all product-related cache data was invalidated, when only a narrow subset of cache tags associated with the product_id should have been.
  • Magento now displays a more meaningful error message when a module name is misspelled in a unit test. Fix submitted by Nickolas Malyovanets in pull request 13740.
  • Magento now displays a more meaningful error message when a module name is misspelled in registration.php. Fix submitted by Jānis Elmeris in pull request 12843.
  • In the line Perform login specific action in StorageInterface.php, login has been replaced with logout. Fix submitted by David Angel in pull request 13679.
  • The incorrect field value in the joined variable_value table has been replaced with two values: plain_value and html_value. Fix submitted by Maksymilian Szydło in pull request 13596.
  • Magento/Rma/Block/Adminhtml/Rma/Edit/Item/Form/Element/Boolean is a new block element that allows rendering ability for the Boolean RMA attributes on the Admin.
  • Duplicate array keys in app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php and app/code/Magento/Downloadable/Helper/File.php have been removed. Fix submitted by Leandro F. L. in pull request 12513.
  • The typo in the getDispretionPath function name has been corrected to getDispersionPath. Fix submitted by PascalBrouwers in pull request 12507. GitHub-12506
  • Magento now saves new orders created by guest accounts to the Order display as expected. Previously, Magento did not display the order with the customer information assigned to it, and although Magento sent an email containing the order ID, the email did not contain information about the ordered items. Fix submitted by Roman K. in pull request 12241. GitHub-10128
  • CAPTCHA labels now reflect both the symbols and letters associated with the CAPTCHA image. Previously, the text labels referred to the CAPTCHA image referred to letters only, despite there being numbers in the CAPTCHA images, too. This ambiguity had the potential to mislead users about which text to enter. Fix submitted by RhodriOwainDavies in pull request 12387.
  • The robots.txt response header content type is now plain text. Fix submitted by Milan Osztromok in pull request 12310.
  • Customers can now successfully use RSS to share their wish lists. Previously, when a logged-in user added products to the wish list and then tried to share them using RSS, Magento threw this exception: report.INFO: Broken reference: the 'wishlist.email.rss' element cannot be added as a child to 'root', because the latter doesn't exist Fix submitted by mediactbv in a pull request.
  • When you select a new main menu option, the previously selected menu item now loses the ui-state-active class as expected. Fix submitted by Arnoud Beekman in pull request 13341. GitHub-13327
  • Issues with displaying full-screen images and video on the configurable product page have been resolved. Previously, Magento displayed video associated with product options on this page as images, rather than video, and full-screen mode for images ignored the configurations settings in view.xml. Fix submitted by Ievgen Shakhsuvarov in pull request 991. GitHub-12268
  • We’ve fixed issues with the “report module enable/disable changes as deployment markers” functionality in the Magento_NewRelicReporting module. Previously, if New Relic’s cron was enabled, Magento sent a New Relic deployment marker for every enabled module once per cron period. This resulted in an excessive number of events. Fix submitted by Kristof in pull request 12477.
  • The New Product Configuration process now works as expected from the Admin. Previously, on the last step of this process, Magento displayed the element.disabled is not a function message and did not create the product variations as expected. GitHub-12555
  • Save operations on CMS pages now load from pageRepository. Fix submitted by JeroenVanLeusden in pull request 13814.
  • Magento now correctly displays product titles when displaying Sales information in Google Analytics. Previously, Magento replaced spaces in product names with their HTML values (for example, \u0020). Fix submitted by Julien Anquetil in pull request 13844. GitHub-13827, GitHub-13350

Gift card

  • Magento now includes a gift card recipient’s email address in the gift card account history. Previously, Magento did not include the gift card recipient’s name and email address in the gift card account history, even though Magento successfully sent the email.

Import/export

  • You can now successfully import product images and image labels from CSV files. Previously after import, the alt text field on the Admin was empty, even though the label was imported and was visible on the product list page as alt attribute, and the Product Detail page missed the alt attribute on image fields. Fix submitted by Ben Robie in pull request 11323. GitHub-9931
  • The CSV file created by using System > Export now incorporates the value of hide_for_product_page. Fix submitted by Nickolas Malyovanets in pull request 11926.
  • You can now import a value of zero (0) into a custom attribute when using the Admin product import feature. Fix submitted by p-bystritsky in pull request 12283. GitHub-12083
  • You can now import or export a specific store view that includes custom options and bundle product options. Previously, the import/export feature did not include store view-level edits for custom options.
  • Import no longer fails when you import products with image filenames containing round brackets from a CSV file. Fix submitted by p-bystritsky in pull request 1017. GitHub-12084
  • When you import information about existing customers, Magento now changes only the specific rows for this customer. If rows for other customer attributes (for example, group_id, store_id, created_at) are absent in the import file, these values are included unchanged.
  • Magento now provides a test for adding values to the system variable collection unit test. Fix submitted by Nickolas Malyovanets in pull request 13742.
  • You can now successfully import configurable products with specified configurable links when the store_view_code setting isn’t set. Previously, you could successfully import a configurable product with both configurable and additional attributes, but when you viewed the category to which the product belonged, the product was not displayed. GitHub-5876
  • Save operations on CMS blocks now load from pageRepository. Fix submitted by JeroenVanLeusden in pull request 13796.
  • The default storefront welcome message now works as expected when the Translate Inline (Stores > Settings > Configuration > Advanced > Developer >) setting is enabled. Fix submitted by Paresh Pansuriya in pull request 13038. GitHub-12711
  • You can now use the layout update XML field to include custom CSS in CMS pages. GitHub-4454
  • We’ve added an @api annotation to the block argument marker interface. This identifies this interface as requiring only a minor version dependency. See Dependencies for more information. Fix submitted by Vinai Kopp in pull request 13816.

Indexing

  • The URL that points to Magento crontab documentation has been updated to reflect current cron documentation in app/code/Magento/Indexer/Model/Message/Invalid.php. Fix submitted by Robbie Thompson in pull request 13050.
  • You can now view the state of the mview queue in real time, which can be useful when debugging indexing issues. Specifically, you can now view how many items are in the queue pending processing, as well as view information from the mview_state table. Fix submitted by Luke Rodgers in pull request 12122.

Infrastructure

  • Zoom now works as expected when using dropdown menus. Previously, zoom worked fine, but when you hovered over the category dropdown menu to the overlap area of product image and dropdown menu, the zoom was abnormally active, even though the mouse was still on the dropdown menu. Fix submitted by Mayank Zalavadia in pull request 13084. GitHub-5129
  • RequireJS loading issues that occur when ad blockers are active have been resolved. Previously, uBlock (or any ad blocker) forbade the trackingCode.js file from loading, which prompted RequireJS to throw an exception. This exception broke the JavaScript execution flow and caused unexpected issues throughout the storefront. Fix submitted by Yonn Trimoreau in pull request 13061.
  • continue() has been removed from templates. Fix submitted by Ihor Sviziev in pull request 13076.
  • The comment that marks the \Magento\Checkout\Model\Cart class as deprecated now includes a pointer to an alternative class. This fix is part of an ongoing effort to add pointers to valid replacements when marking methods and classes as deprecated. Fix submitted by Fabian Schmengler in pull request 13061. GitHub-10133
  • A new file (CODE_OF_CONDUCT.md) that defines standards for how to engage in the community has been added. Fix submitted by Ievgen Shakhsuvarov in pull request 12723.
  • \Magento\Framework\Data\Tree::getNodeById() no longer contains an invalid type in its PHPDoc block. Fix submitted by Roman K. in pull request 964. GitHub-8507
  • We’ve resolved naming collisions that previously occurred in the Javascript UI registry. Previously, these naming collisions resulted in the following behaviors: Magento displayed the element.disabled is not a function message, and did not create product variations as expected.
GitHub-12555

Newsletters

  • The About Us and Customer Service links of the Order Confirmation email (and other emails sent to the customer) now work as expected. Fix submitted by Roman K. in pull request. GitHub-12261
  • Magento now sends the newsletter subscription success email as expected when a customer successfully subscribes to a newsletter. Fix submitted by Styopchik in pull request. GitHub-12439
  • Magento now uses indexes to retrieve subscriber information during the creation of email to newsletter subscribers. Previously, Magento did not use indexes for this task, and performance was poor. Fix submitted by Amit Bera in pull request. GitHub-12787
  • Magento no longer sends multiple confirmation emails when a customer successfully subscribes to a newsletter. Fix submitted by Torben Höhn in pull request 13044. GitHub-12876
  • The text of the Subscribe to Newsletter button now wraps correctly. Fix submitted by monaemipro in pull request 13041. GitHub-12320

Orders

  • Magento now shows all products as expected in the Recently Ordered list when a customer places an order that contains products from multiple stores. Previously, in installations with two storefronts, if a customer added products from both stores to the same shopping cart, and placed a single order, the recently ordered product list would not show all ordered products.
  • The getDefaultStoreLocale() method has been added to allow for the fetching of scoped values. Use this method in getCreatedAtFormatted() to ensure that Magento translates the created_at order date in emails for the locale being used in that store view. Fix submitted by JeroenVanLeusden in pull request 11067.
  • You can now successfully open the Order edit page for orders that contain an address with extension attributes. Previously, when you tried to open this page, the page load failed with this error, Recoverable Error: Object of class Magento\Sales\Api\Data\OrderAddressExtension could not be converted to string in .../module-sales/Model/AdminOrder/Create.php on line 503.
  • Magento now saves an invoice ID on the credit memo when you create a credit memo from the invoice in the Admin. Previously, the invoice ID was not included. Fix submitted by Anton Evers in pull request 11067. GitHub-11669
  • Credit memos can have the state open (\Magento\Sales\Model\Order\Creditmemo::STATE_OPEN). As a result, you can create a credit memo with an ID that still has to be refunded, and existing credit memos should be refundable if their state is open. Fix submitted by Anton Evers in pull request 11550.
  • The Magento\Sales\Service\V1\OrderCreateTest test now has the correct shipping method fixture. Previously, this test contained an incorrect shipping method fixture, which produced an error whenever an order’s shipping method was treated as an object. Fix submitted by andrew-garside-temando in pull request 12227.
  • When you create a credit memo comment with POST /V1/creditmemo/:id/comments, Magento now sends credit memo update emails as expected. Previously, Magento did not send this email, and no other transaction emails were sent to the customer.
  • The getReservedOrderId() method now uses the current store as expected instead of the default store. Fix submitted by Timon de Groot in pull request 11702. GitHub-9055
  • When you are editing an order’s shipping or billing address, Magento now displays the allowed countries from the correct store view. Previously, possible addresses were derived from the wrong store view. Fix submitted by Roman K. in a pull request. GitHub-12560
  • The \Magento\Sales\Model\Order\Pdf\AbstractPdf::drawLineBlocks method now works as expected. Previously, when a text block spanned more than one page, Magento threw a Zend_Pdf_Exception error, and displayed this error: Font has not been set. Fix submitted by serhii-balko in pull request 1016. GitHub-11743
  • Magento no longer exports extra records when you export invoices for multiple orders. Fix submitted by Sanjay Patel in pull request 13208. GitHub-12714
  • You can now place orders using PayPal when Payment Action = Order. Previously, when Payment Action = Order, Magento displayed this error when you reached the order review page: We can't place the order.
  • The cancel order and restore quote methods now accurately calculate the amount of stock to be returned to inventory when an order is canceled. Previously, when you canceled an order, some of these methods did not accurately calculate the amount of restored stock. Fix submitted by Danny Verkade in pull request 12668. GitHub-9969
  • Join extension attributes are now added as expected to order results when the order is created using REST. Fix submitted by Nickolas Malyovanets in pull request 1168.
  • The Shipment Tracking REST API now throws an error as expected if the specified order doesn’t exist. Fix submitted by Roman K. in pull request 1162.
  • Invoices now display the exact quantity of a product ordered, even if it is a fractional unit (for example, 6.5). Previously, when Magento tried to invoice an order that had products with quantities that required decimals, it rounded down the quantity to the nearest whole number in the invoice. Fix submitted by Nickolas Malyovanets in pull request 11997. GitHub-11941

Payment methods

  • The multi-shipping checkout flow now supports the CyberSource payment method. This payment method is supported by Magento Commerce only. However, as part of the process of adding CyberSource support, we’ve made improvements to the Multi-shipping module to simplify integration process for other payment methods.

Users of the CyberSource payment method should note that CyberSource uses the Magento Vault module only to store and retrieve tokens. Stored CyberSource tokens won’t be displayed on the checkout page or customer account.

  • Logged-out customers can no longer see previously saved credit cards. Previously, users logged in as guest could see some payment information from an earlier, canceled order.
  • Third-party developers can now customize payment errors messages for payment integrations based on the Magento Payment Provider Gateway.
  • PayPal Express Checkout now appears as a payment option on the Checkout page when the PayPal buttons are available on the shopping cart page. Previously, PayPal did not appear as a payment method on the Checkout page when the billing agreement was disabled, although the PayPal buttons were still available on the shopping cart page.
  • You can now view order details for an order created with a custom offline payment method. Previously, Magento displayed PHP warning (undefined index) instead of the order details. Fix submitted by Alex in pull request 12296. GitHub-3596
  • Magento no longer disables the BrainTree Place Order button after a failed payment validation. Fix submitted by Ievgen Sentiabov in pull request 12902.
  • The is_active and is_visible columns now default to true even when column default values are not set in the vault_payment_token installation script. Fix submitted by helloitsluke in pull request 12965.
  • If you’ve chosen a custom payment method that is offline when you create an order, Magento now displays that payment method’s name as expected when you view order details in Payment & Shipping. Fix submitted by zamoroka in pull request 12731. GitHub-12209
  • PayPal now works as expected with virtual products such as gift cards. Previously, when you tried to place an order for a virtual product using PayPal, Magento did not display the PayPal popup when you clicked Continue PayPal during checkout.
  • Magento now correctly adds checkout agreements data to requests and validates payment information when you place an order using PayPal Express. Previously, you could check this box, but Magento did not parse the agreements data or pass it to the set-payment-information API. This failure in turn triggered the CheckoutAgreements validation plugin, which failed to validate. Fix submitted by Ričards Zālītis in pull request 12401.
  • Magento no longer archives active orders that are placed using PayPal Express Checkout. Previously, if you placed an order using PayPal Express Checkout, Magento would place the order as expected but also add it to the list of archived orders.
  • Magento now correctly displays transparent PNG watermarks on JPEG images. Previously, Magento did not correctly display a transparent watermark as expected on an image, but instead displayed a white outline of the box where the watermark should be. Fix submitted by Elze Kool in pull request 11060. GitHub-10661
  • We’ve improved the display of the Payment Methods section of the checkout page on mobile devices. Previously, the layout of page elements was not correctly spaced. Fix submitted by Marcin Kwiatkowski in pull request 13777. GitHub-13315
  • Magento now correctly updates the credit memo total when a merchant issues a refund. Fix submitted by serhii-balko in pull request 1185. GitHub-11798

Performance

  • The addition of a cache for the getimagesize() function has improved product image loading.
  • Each cache type now has its own separate cache storage.
  • We’ve optimized the initialization of the Product View block, which gives an 11% performance improvement for simple product views.
  • Magento now caches search results for faster response time on popular searches. A system administrator can configure how many top search queries can be cached. This enhancement can result in up to a 36% improvement for cacheable search terms.

Quote

  • If a customer changes the currency type of his order-in-progress while viewing the shopping cart, Magento displays a message that shows the minimum order necessary in the new currency. Previously, this minimum was calculated incorrectly. Fix submitted by Neeta Kangiya in pull request 13039.
  • Magento no longer truncates very long telephone numbers on the order page. Previously, Magento cut off very long phone numbers at 20 digits. Fix submitted by Danny Verkade in pull request 13015. GitHub-10869
  • You can now implement a product attribute that sets Catalog Input Type for Store Owner equal to Fixed Product Tax in a multi-store environment. Fix submitted by Danny Verkade in pull request 13019. GitHub-12393
  • When a customer is on the payment page and tries to reorder or retrace her steps backward through the checkout process, Magento now displays all the relevant shipping methods. Previously, Magento displayed only one shipping method under these circumstances.
  • An integrity constraint violation error no longer occurs after you reorder a product with custom options. Fix submitted by Vinay Shah in pull request 13036. GitHub-12705

Reports

  • The Products in Cart report is now accurate. Previously, if you created a Products in Cart report (Open Reports > Marketing > Products in Cart) after deleting a product from the catalog, the report displayed a blank list of products. Fix submitted by angelo983 in pull request 12539.
  • You can now successfully export the Ordered Products report to a CSV file. Previously, the export file contained no report data.

SalesRule

  • Magento now display the correct catalog rule price for bundle products with custom options.
  • Cart prices now displays the Cart Price Rule shipping discount correctly. Previously, when you placed an order, Magento displayed this error: Payment method is not available.
  • Magento now displays the exact label value that was given in the Admin during the cart price rule creation. Fix submitted by Ihor Sviziev in pull request 13141. GitHub-11428, GitHub-11497
  • Magento now correctly displays in Cart Price rules the nesting levels for categories with nesting levels that exceed three levels.
  • Coupon codes that a customer has applied to a subsequently canceled order are now available for re-use as expected. Previously, once a customer canceled this order, she could not apply the coupon code to another order. Fix submitted by p-bystritsky in a pull request. GitHub-12817
  • Magento now displays popular search terms in SEO & Search > Search Terms as expected. Fix submitted by p-bystritsky in pull request 1024. GitHub-10743
  • Layered navigation now displays the correct product count. Previously, the layered navigation product count incorrectly included only in-stock products. Fix submitted by Roman K. in pull request 12063. GitHub-11946
  • Grid filtration now handles MySQL special characters as expected. Fix submitted by laconica-sergey in pull request 12749.
  • Magento no longer throws an error when you submit the search form in the header with an empty value. Fix submitted by Koen V. in pull request 13811. GitHub-13791

Shipping

You can find Magento Shipping-specific release notes in Magento Shipping Release Notes.

  • The handling fee configuration of shipping methods is now explicitly cast to 0 to avoid warnings from PHP 7.1. Fix submitted by Fabian Schmengler in pull request 13680.
  • Unused count($_items) in templates have been removed. Fix submitted by Alexander Shkurko in pull request 12901.
  • Magento now enforces the minimum order amount during checkout as expected. Previously, you could bypass the minimum order amount logic by clicking Check Out with Multiple Addresses, removing products from the order and then clicking Update Qty & Addresses. Fix submitted by Roman K. in pull request 963.
  • DHL product codes now match those published in the latest DHL products and services guide. Previously, three DHL product codes in the DHL Shipping module were incorrect. Fix submitted by gwharton in pull request 12666.

Sitemap

  • sitemap.xml now displays URLs without /home appended. Fix submitted by Oscar Recio in pull request 12649. GitHub-12446
  • Sitemaps generated in a multi-store environment now include the correct URLs for each store (that is, http://storename.com/ instead of http://defaultstore.com/). Fix submitted by Roman K. in pull request 935. GitHub-12482
  • Magento now handles errors that occur during sitemap generation in a less intrusive way. If Magento throws an exception when generating a sitemap, it now sends the errors through email as configured in the sitemap configuration XML. The former _translateModel property is not used anymore, and the inline translation is correctly suspended using the inlineTranslation property instead. Fix submitted by Marina Gociu in a pull request. GitHub-10502

Swagger

  • The code formatting in the Swagger block and template has been updated. Fix submitted by JeroenVanLeusden in pull request 13485.

Swatches

  • You can now use REST to import visual swatch attribute options. Previously, you could not add swatch options using service contracts unless a swatch option already existed for the attribute. Fix submitted by gonzalopelon in pull request 12044. GitHub-9410, GitHub-10707, GitHub-10737, GitHub-11032
  • Visual swatches that have a color assigned now show that color in the swatch box. Previously, Magento did not display any color in the color swatch box. Fix submitted by Chris Pook in pull request 13101. GitHub-11828
  • The error message displayed when you do not supply enough information during swatch creation has been edited for clarity and grammatical accuracy. Fix submitted by Nickolas Malyovanets in pull request 1117. GitHub-5550

TargetRule

  • You can now successfully save a Related Product rule.

Tax

  • The default selector on the Admin’s tax rule edit page now selects only the correct container (tax rate) following the Tax Rate multi-select. Previously, the default selector selected three elements, which resulted in inaccurate results. Fix submitted by Pieter Hoste in pull request 13643. GitHub-12791
  • We’ve removed the redundant default discount tax calculation (tax/calculation/discount_tax) from Magento/Tax/etc/config.xml. Fix submitted by Vincent Marmiesse in pull request 13449.
  • The Not yet calculated text string immediately adjacent to the string Tax on the checkout page is now translated as expected. Fix submitted by Roman K. in pull request 1147. GitHub-7849
  • Magento no longer displays incorrect tax amounts for orders when using a non-default tax configuration. Fix submitted by Pieter Cappelle in pull request 12639. GitHub-10347

Testing

  • ConfigurationTest no longer fails when you install Magento using Composer. Fix submitted by Nickolas Malyovanets in pull request 1161. GitHub-12574
  • We’ve added MagentoStyle to console input and output in Travis tests.
  • We’ve re-implemented tests using Jasmine as part of the process of removing the legacy JavaScript test framework and completely removing JSTestDriver support. Fix submitted by Carlos Lizaga in a pull request. GitHub-12342
  • functional.suite.dist.yml now handles custom backend names. Previously, the value for the backend_name configuration was hardcoded. Fix submitted by scribam in pull request 12884.
  • We’ve added a missing preference for ObjectManager\ConfigInterface in integration tests. Fix submitted by Fabian Schmengler in pull request 12845. GitHub-12844
  • Integration Test Annotation magentoAppArea no longer breaks with valid values. Fix submitted by Nickolas Malyovanets in pull request 996. GitHub-2907
  • The inline documentation of the static test for XSS vulnerabilities now reflects that @escapeNotVerified is disallowed in Magento versions equal or greater than 2.2. Fix submitted by Matthias Zeis in pull request 12639.

Themes

  • Magento no longer caches warning messages as often as a customer clicks the Update Shopping Cart button while the shopping cart page loads. Previously, Magento cached a warning message each time a customer clicked this button while the page loaded in Firefox or Chrome, and this action resulted in multiple warning messages appearing on the top of the shopping cart page.
  • If a customer is logged in while Magento loads, then the welcome message displays the customer’s full name. Fix submitted by Oleh Kravets in pull request 12738. GitHub-12719
  • You can now disable the full-screen gallery on mobile devices Fix submitted by p-bystritsky in pull request 1006. GitHub-12490, GitHub-12285
  • Protected method getHtml now checks each child for an existing class and then appends the $outermostClass if true. Previously, when creating a dependency injection for the Magento\Theme\Block\Html\Topmenu class, you could not change class names on children in a beforeGetHtml method because getHtml declares setClass() on all child items. Fix submitted by jonshipman in pull request 12862.
  • Customers can now successfully close full-screen zoomed product images displayed on an iPhone 4s, 5s, 6, or 6s with the Safari browser. Previously, if a customer chose full-screen zoom for any product image, he could not close the full-screen zoom.

Translations and locale

  • Inline translations and custom translators now work for Knockout templates. Fix submitted by Dmitry Fedyuk in pull request 12953. GitHub-2156
  • Magento now provides a locale for Swedish (Finland). Fix submitted by Nickolas Malyovanets in pull request 1207. GitHub-13095
  • Magento now uses current locale (as defined in Stores > Settings > Configuration > Advanced Reporting) when translating the time zone label. Previously, Magento used operating system settings instead of the current locale. Fix submitted by adrian-martinez-interactiv4 in pull request 13408.
  • Newsletter labels can now handle the Chinese language. Fix submitted by Dasharth patel in pull request 13029. GitHub-12320
  • The module responsible for generating the js-translations.json file now contains a routine that translates strings in tags such as <translate args="This won't be translated". Fix submitted by Matti Vapa in pull request 13528. GitHub-12081

User interface

  • You can now configure a form field with validation range words. As a result, the category name is validated, and the category is created (or displays the correct error message, if validation fails). Previously, Magento displayed an error message on the console. Fix submitted by Robin Huy in pull request 12739.
  • The Save Block button on the Add New Block page no longer ignores clicks if the content editor is empty. Fix submitted by Roman K. in pull request 1032. GitHub-8114
  • Magento now disables the promo code input box after a user applies a promo code. Fix submitted by Chirag P in pull request 13030.
  • Magento now displays video and images as expected when you select a video or click to view a full-screen image for a configurable product. Fix submitted by Chumak Roman in pull request 12469. GitHub-12268
  • The PHP notice that Magento displays when an invalid ui_component configuration is used has been improved. Fix submitted by Vova Yatsyuk in pull request 12239.
  • Magento has added verification for previously set filters in Magento/Ui/Component/Filters, which has eliminated duplication of filters in the collection where conditions.
  • Inconsistency in the animation of the Admin spinner progress indicator has been corrected. Fix submitted by Neill Robson in pull request 13700.

URL rewrites

  • When using a store code in a URL, Magento now retrieves the value of Store_Code from the store if the store code value is empty. Previously, under these circumstances, Magento threw an error. Fix submitted by Oscar Recio in pull request 12529. GitHub-8615

Web API framework

  • You can now use the REST API to make requests that include a slash (/) in an SKU. Fix submitted by Roman K. in pull request 949. GitHub-8615

Wish list

  • Magento now correctly displays a product’s special price when you add it to a wish list. Previously, if you added a product with a special price to the wish list, Magento displayed the product with its regular price.
  • You can now remove an item description from a wish list. Fix submitted by p-bystritsky in pull request 981. GitHub-12582

Known issue

Merchants are unable to change a store view’s applied theme in Magento 2.2.4. When a merchant tries to change the Applied theme setting for a store view (Content > Design > Configuration), Magento does not change the theme, but instead displays this error: Something went wrong while saving this configuration: Area is already set. See GitHub-14968 for more information. Workaround: Merchants who are running Magento 2.2.4 should upgrade to 2.2.5, then apply patch MAGETWO-93036.

Community contributions

We are grateful to the wider Magento community and would like to acknowledge their contributions to this release.

The following table identifies contributions from our community members. This table lists the external pull requests, the GitHub issue number associated with it (if available), and the community member who contributed the pull request.

Pull request Related GitHub issue Contributing community member
12171 7691 Roman K.
11407 9277 Peter Jaap Blaakmeer
11997 11941 Nickolas Malyovanets
12283 12083 p-bystritsky
12296 3596 Alex
12303 9764 Roman K.
12310 13214 Milan Osztromok
12332 9684 Roman K.
11787 10438 Ievgen Sentiabov
12003 11691 p-bystritsky
12308 12261 Roman K.
12302 12146 Vova Yatsyuk
11320 10502 Marina Gociu
11429 11139 Mayank Zalavadia
11809 8003 Nickolas Malyovanets
11592 10347 Pieter Cappelle
11539 9360 Javier Villanueva
11965 11792 Roman K.
12048 11528 LuisMi
12108 12064 Roman K.
11473 9413 Marius
11670 11669 Anton Evers
11992 11740 Roman K.
12036 9410, 10707, 10737, 11032 gonzalopelon
12241 10128 Roman K.
903 9515 Roman K.
12132 10210 Roman K.
11389 11341 Manu Gonzalez Rodriguez
12133 12127 Erfan
12253 12058 Carlos Lizaga
12328 9742 Roman K.
904 9468 Roman K.
12057 6634, 9961 p-bystritsky
11323 9931 Ben Robie
11388 11236 Danny Verkade
11485 11484 joost-florijn-kega
11926 8255 Nickolas Malyovanets
12207 11509, 11882 Nickolas Malyovanets
11052 9918 Joke Puts
12038 11825, 11908 Oscar Recio
12499 758 cykirsch
11444 11324 adrian-martinez-interactiv4
11608 9633 Marty S
11617 6770 Raul Mateos
11099 11059 Fabian Schmengler
11435 11409 adrian-martinez-interactiv4
12167 12110 Nickolas Malyovanets
12469 12268 Chumak Roman
991 12268 Ievgen Shakhsuvarov
12507 12506 PascalBrouwers
935 12482 Roman K.
970 8437 Roman K.
986 8176 Nickolas Malyovanets
985 12613 Nickolas Malyovanets
12220 12180 Chris Pook
12529 12450 Oscar Recio
929 12468 Roman K.
962 7467 Nickolas Malyovanets
975 8410 Roman K.
981 12582 p-bystritsky
916 8862 Roman K.
968 8011 Nickolas Malyovanets
993 12526 Roman K.
984 12535 Nickolas Malyovanets
964 8507 Roman K.
980 10123 Nickolas Malyovanets
11702 9055 Timon de Groot
963 8601 Roman K.
977 10797 Nickolas Malyovanets
982 12560 Roman K.
996 2907 Nickolas Malyovanets
1003 5738 Nickolas Malyovanets
983 12259 p-bystritsky
1000 8204 Roman K.
1006 12285 p-bystritsky
1012 10814 Nickolas Malyovanets
12633 12632 Miguel Balparda
995 8647 Serhii
magento-engcom/magento2ce/pull/1007</a> 12378 p-bystritsky
12063 11946 Roman K.
12661 12452, 12660 Tomasz Gregorczyk
1017 12084 p-bystritsky
1021 12656 Roman K.
1023 12667 Roman K.
1024 10743 p-bystritsky
11563 5774 Marina Gociu
949 8615 Facundo Capua
11070 10133 Fabian Schmengler
12730 12713 Vasilina
12743 9453 Roman Strelenko
12747 9720 Pavel
1022 6965 Nickolas Malyovanets
12630 12627 Tommy Quissens
12732 12206 Ihor Sviziev
12739 6113 Zamoroka
12738 12719 Oleh Kravets
12758 5035 Mobecls
12759 12715 StasKozar
1016 11743 Serhii
11462 7241 Andreas von Studnitz
11686 5188 Timon de Groot
12105 11936 Marius Strajeru
12636 12625 Oscar Recio
12737 11953 Zamoroka
12751 12439 Styopchik
1036 12712 Serhii
12734 6916 dzianis-yurevich
12736 12374 virtual97
12401 11885 Ričards Zālītis
12845 12844 Fabian Schmengler
12294 12755 virtual97
12902 12900 Ievgen Sentiabov
12945 12555 Volodymyr Zaets
12752 4292 Etty
12953 2156 Danny Verkade
12963 7441 wardcapp
13015 10869 Danny Verkade
12649 12446 Oscar Recio
12917 12894 Burlacu Vasilii
13019 12393 Danny Verkade
11369 9036 Denis Ristic
12731 12209 Zamoroka
12964 10415 wardcapp
13026 12601 Sanjay Patel
13041 12320 monaemipro
13029 12320 dasharath-wagento
13081 11796 Punit Vaswani
13061 12828 Yonn Trimoreau
13084 5129 Mayank Zalavadia
1018 6486 Nickolas Malyovanets
12668 9969 Danny Verkade
13034 12221 Bhargav Mehta
13036 12705 Vinay Shah
13044 12876 Torben Höhn
1032 8114 Roman K.
1216 8453 Serhii
12990 12967 Ihor Sviziev
13033 12787 Amit Bera
13066 12877 Jagriti Joshi
1117 5550 Nickolas Malyovanets
13101 11828 Chris Pook
1207 13095 Nickolas Malyovanets
13141 11428, 11497 Ihor Sviziev
13025 12430 pradeep-wagento
1163 12322 Serhii
13208 12714 Sanjay Patel
955 8624 Roman K.
1050 11897 Roman K.
1215 12147 Nickolas Malyovanets
1186 12819, 12993 p-bystritsky
12406 12342 Carlos Lizaga
1217 13126 Nickolas Malyovanets
1045 7768 Nickolas Malyovanets
1146 12231 Serhii
1245 5697 Nickolas Malyovanets
1247 7213 Serhii
12936 5948 Alexander Shkurko
11060 10661 Elze Kool
13341 13327 Arnoud Beekman
13364 8621 enriquei4
1162 7760 Roman K.
1147 7849 Roman K.
1192 12860 p-bystritsky
1148 7848 Roman K.
1111 11527 p-bystritsky
1167 7698 Roman K.
1161 12574 Nickolas Malyovanets
1185 11798 Serhii
13498 13497 Igor Tregub
13528 12081 Matti Vapa
13563 11252 Mkennethsmith
1095 12817 p-bystritsky
1143 11963 p-bystritsky
13643 12791 Pieter Hoste
13761 13429 Alisson Oldoni
13770 13760 Ricardo Martins
1119 5451 Nickolas Malyovanets
1168 8035 Nickolas Malyovanets
13762 13595 zolat
13682 10595 gwharton
13777 13315 Marcin Kwiatkowski
13811 13791 Koen V.
13038 12711 Paresh Pansuriya
13567 5863, 8227, 8957, 10073, 13240 Adrien Louis-Rossignol
13787 13768 nuzil
13817 4454 Cedric Ziel
13844 13350, 13827 Julien ANQUETIL
1159 7765 Roman K.
11513 11512 Andrew Howden
13217 13216 Ville Vaarala
13641 13631 Fabian Schmengler
13709 12404 Pieter Hoste
13861 13006 Hiren Patel
13930 13899 Tadeo Barranco

System requirements

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

Installation and upgrade instructions

See How to get the Magento software for complete installation and upgrade information.

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.

Updated