diff --git a/docs/internal-developers/testing/releases/870.md b/docs/internal-developers/testing/releases/870.md
new file mode 100644
index 00000000000..4c0a1856543
--- /dev/null
+++ b/docs/internal-developers/testing/releases/870.md
@@ -0,0 +1,401 @@
+# Testing notes and ZIP for release 8.7.0
+
+Zip file for
+testing: [woocommerce-gutenberg-products-block.zip](https://github.com/woocommerce/woocommerce-blocks/files/9758323/woocommerce-gutenberg-products-block.zip)
+
+## Feature plugin and package inclusion in WooCommerce
+
+### Improve visual consistency between block links ([7340](https://github.com/woocommerce/woocommerce-blocks/pull/7340))
+
+#### Screenshots
+
+| Before | After |
+| ------ | ----- |
+| | |
+
+#### User Facing Testing
+
+1. Create a regular page (Pages > Add New) and add the All Product block to it;
+2. Add the Active Filters block;
+3. Add the Filter By Attribute block;
+4. Select an attribute from the Filter By Attribute block and apply it;
+5. When the page reloads, check if the "Clear All" button (in the Active Filters block) and the "Reset" button (in
+ Filter By Attribute block) have the following properties:
+
+> Font size: 14px
+> Font weight: normal
+> Text decoration: underlined
+
+6. Hover the mouse over the "Clear All" button and the "Reset" button and make sure the text decoration is changed
+ to `none` (no underline) while the other properties remain the same:
+
+> Font size: 14px
+> Font weight: normal
+> Text decoration: none
+
+### Update the titles of some inner blocks of the Cart block and remove the lock of the Cross-Sells parent block ([7232](https://github.com/woocommerce/woocommerce-blocks/pull/7232))
+
+#### Screenshots
+
+
+
+Before:
+
+
+![adjust-titles-of-cart-inner-blocks-before](https://user-images.githubusercontent.com/3323310/192443836-aff1f06e-0847-4bf0-bf64-2d7011c19931.jpg)
+ |
+After:
+
+
+![adjust-titles-of-cart-inner-blocks-after](https://user-images.githubusercontent.com/3323310/192443832-55b72f49-e7ec-44ec-94ee-7e1a38525b09.jpg)
+ |
+
+
+
+### Testing
+
+#### User Facing Testing
+
+1. Create a test page.
+2. Add the Cart block.
+3. [Open the List View](https://wordpress.com/go/tutorials/how-to-use-the-list-view-in-the-wordpress-block-editor/).
+4. Verify that the following titles are visible:
+ - Cart Cross-Sells
+ - Cart Items
+ - Cart Cross-Sells Products
+ - Proceed to Checkout
+5. Verify that the Cross-Sells parent block does not show a lock.
+
+### Add filter for place order button label ([7154](https://github.com/woocommerce/woocommerce-blocks/pull/7154))
+
+#### User Facing Testing
+
+##### Verify that label filter works
+
+
+
+
+
+1. Create a test page and add the Checkout block to it.
+2. Install and activate the [Simple Custom CSS and JS](https://wordpress.org/plugins/custom-css-js/) plugin.
+3. Head over to `/wp-admin/edit.php?post_type=custom-css-js` and add the following JS code snippet:
+
+```js
+const label = () => 'Pay now';
+const {__experimentalRegisterCheckoutFilters} = window.wc.blocksCheckout;
+__experimentalRegisterCheckoutFilters('custom-place-order-button-label', {
+ placeOrderButtonLabel: label,
+});
+```
+
+4. Head over to the frontend, add a product to the cart and open the page with the Checkout block.
+5. Verify that the button label says `Pay now`.
+
+ |
+
+
+
+ |
+
+
+
+##### Verify that payment method label still works
+
+
+
+
+
+1. Make sure that the code snippet from the previous test is deactivated.
+2. Install and activate the [Code Snippets](https://wordpress.org/plugins/code-snippets/) plugin.
+3. Head over to `/wp-admin/admin.php?page=snippets` and add the following PHP code snippet:
+
+```php
+add_filter( 'woocommerce_should_load_paypal_standard', '__return_true' );
+```
+
+4. Head over to `/wp-admin/admin.php?page=wc-settings&tab=checkout§ion=paypal` and select the
+ options `Enable PayPal Standard` and ` Enable PayPal sandbox`.
+5. Head over to the frontend, add a product to the cart and open the page with the Checkout block.
+6. Select the payment method `PayPal`.
+7. Verify that the button label says `Proceed to PayPal`.
+
+ |
+
+
+
+ |
+
+
+
+##### Verify that default label still works
+
+
+
+
+
+1. Make sure that the code snippet from the first test is still deactivated.
+2. Head over to the frontend, add a product to the cart and open the page with the Checkout block.
+3. Select a payment method apart from `PayPal`, e.g. `Credit Card (Stripe)`.
+4. Verify that the button label says `Place Order`.
+
+ |
+
+
+
+ |
+
+
+
+#### Verify that i18n of the default label still works
+
+
+
+
+
+1. Make sure that the code snippet from the first test is still deactivated.
+2. Head over to `/wp-admin/options-general.php` and select `German` as the `Site Language`.
+3. Head over to `/wp-admin/update-core.php?force-check=1` and fetch translations.
+4. Head over to the frontend, add a product to the cart and open the page with the Checkout block.
+5. Select a payment method apart from `PayPal`, e.g. `Credit Card (Stripe)`.
+6. Verify that the button label says `Kostenpflichtig bestellen`.
+
+ |
+
+
+
+
+ |
+
+
+
+### Exposed data related to the checkout through wordpress/data stores ([6612](https://github.com/woocommerce/woocommerce-blocks/pull/6612))
+
+#### User Facing Testing
+
+The full instructions for testing this PR can be
+found [here](https://github.com/woocommerce/woocommerce-blocks/blob/trunk/docs/internal-developers/testing/cart-checkout/data-stores.md)
+. At a minimum, we will need to smoke test by trying the
+different [stripe failure](https://github.com/woocommerce/woocommerce-blocks/blob/trunk/docs/internal-developers/testing/cart-checkout/data-stores.md#stripe-failures)
+modes
+
+### Add simple, large & two menus footer patterns. ([7306](https://github.com/woocommerce/woocommerce-blocks/pull/7306))
+
+#### User Facing Testing
+
+1. In a new page or a template, go to the patterns tab and make sure all 6 patterns appear under the WooCommerce
+ category dropdown.
+2. Insert each one of the footer patterns, save and make sure they all look as expected on the GH discussions.
+
+### Add minimal, large, and essential header patterns ([7292](https://github.com/woocommerce/woocommerce-blocks/pull/7292))
+
+#### User Facing Testing
+
+1. In a new page or a template, go to the patterns tab and make sure all 6 patterns appear under the WooCommerce
+ category dropdown.
+2. Insert each one of the header patterns, save and make sure they all look as expected on the GH discussions.
+
+### Add `showRemoveItemLink` as a new checkout filter to allow extensions to toggle the visibility of the `Remove item` button under each cart line item. ([7242](https://github.com/woocommerce/woocommerce-blocks/pull/7242))
+
+#### User Facing Testing
+
+1. Install [this test plugin](https://github.com/woocommerce/woocommerce-blocks/files/9665640/some-extension-name.zip)
+ to your site and activate it. It contains a filter to prevent the `Remove item` button showing up for a product
+ called `Beanie`
+2. Add a product named Beanie to your cart.
+3. Go to the Cart block.
+4. Ensure you cannot see a button to remove it from your cart.
+5. View the `docs/third-party-developers/extensibility/checkout-block/available-filters.md` file and ensure it is good,
+ and the new text we added to describe the filter makes sense.
+
+### Add support for a GT tracking ID for Google Analytics ([7213](https://github.com/woocommerce/woocommerce-blocks/pull/7213))
+
+#### User Facing Testing
+
+1. Install
+ the [Google Analytics Integration Extension](https://github.com/woocommerce/woocommerce-google-analytics-integration)
+2. Set up the extension with a GT-X type ID from your Google Analytics account. Google Analytics account is required to
+ test this. This can be retrieved by going to the [analytics dashboard](https://analytics.google.com/) and going to a
+ data stream > Configure Tag Settings, see full
+ instructions [here](https://support.google.com/tagmanager/answer/12002338#zippy=%2Cset-up-your-google-tag-from-google-analytics-instructions)
+ ![image](https://user-images.githubusercontent.com/11388669/191953041-8593adb6-5dec-403c-9e73-45f6337ddb4b.png)
+3. Install [Google Analytics Debugger](https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcijamephohjechhna?hl=en) browser extension. It needs to be installed, but do not click it (debug mode should be off).
+
+4. Go to the store and trigger some events using the All Products Block and Cart block. For example an add to cart
+ event.
+5. Google Analytics Debugger should indicate that an event was fired.
+6. Instead of the Google Analytics Debugger we can also check the Browser Dev Tools > Network and confirm we see
+ requests being sent to a URL similar to: `https://region1.google-analytics.com/g/collect` (region could vary)
+
+### Separate filter titles and filter controls by converting filter blocks to use Inner Blocks ([6978](https://github.com/woocommerce/woocommerce-blocks/pull/6978))
+
+#### User Facing Testing
+
+##### Insert new blocks
+
+1. Check out this PR, built.
+2. Add a new page, add All Products, Active Filters, Filter by Price, Filter by Attribute, and Filter by Stock blocks to
+ the page.
+3. Check the newly inserted filter blocks, for each block, a wrapper block containing the heading and filter control
+ blocks were inserted.
+4. Try changing block settings and style, and see if they're updated on the front end.
+5. See filter blocks work as expected.
+
+##### Upgrade existing blocks
+
+1. Check out `trunk`.
+2. Add a new page, add All Products, Active Filters, Filter by Price, Filter by Attribute, and Filter by Stock blocks to
+ the page.
+3. Try changing block settings and style.
+4. Check out this PR and build.
+5. Edit the page created in step 2nd above.
+6. See the upgrade notices for filter blocks as shown
+ in [this comment](https://github.com/woocommerce/woocommerce-blocks/pull/6978#issuecomment-1252087654).
+7. Click the upgrade button, see:
+
+- The block is replaced by a filter wrapper block contain the heading and the filter block control blocks.
+- The modified title remains.
+
+8. Save the page, see all filter blocks continue functioning as expected on the front end.
+
+### StoreApi requests will return a `Cart-Token` header that can be used to retrieve the cart from the corresponding session via **GET** `/wc/store/v1/cart`. ([5953](https://github.com/woocommerce/woocommerce-blocks/pull/5953))
+
+#### User Facing Testing
+
+1. Using a REST API client
+2. Disabling basic auth
+3. Adding something to the cart via POST `/wc/store/v1/cart/add-item`. Note down the value of the `Cart-Token` header.
+4. Deleting or disabling cookies before requesting GET `/wc/store/v1/cart`
+5. No items
+6. Repeat this request with a header called `Cart-Token` and the value you noted earlier.
+7. Cart response has items!
+
+### Fixed HTML rendering in description of active payment integrations ([7313](https://github.com/woocommerce/woocommerce-blocks/pull/7313))
+
+#### Screenshots
+
+
+
+Before:
+
+
+![7312-before](https://user-images.githubusercontent.com/3323310/194226310-aef0c678-309d-40dd-bfb7-8a39dff5448e.png)
+ |
+After:
+
+
+![7312-after](https://user-images.githubusercontent.com/3323310/194226296-aadc639f-a01c-417c-92c9-214c014b5ae2.png)
+ |
+
+
+
+#### User Facing Testing
+
+1. Install the [WooCommerce Stripe Payment Gateway](https://wordpress.org/plugins/woocommerce-gateway-stripe/).
+2. Head over to `/wp-admin/admin.php?page=wc-settings&tab=checkout`.
+3. Activate various Stripe payment methods, e.g. Stripe SEPA Direct Debit.
+4. Head over to the Checkout block in the editor.
+5. Click on the Payments Options inner block.
+6. Verify that all descriptions of active payment integrations render HTML.
+
+### Hide the shipping address form from the Checkout when the "Force shipping to the customer billing address" is enabled ([7268](https://github.com/woocommerce/woocommerce-blocks/pull/7268))
+
+| Before | After |
+| ------ | ----- |
+|![image](https://user-images.githubusercontent.com/11503784/194019850-885528a2-aea6-40c9-bfdc-3f724ad5be80.png)|![image](https://user-images.githubusercontent.com/11503784/194019899-38245040-ca69-4c6e-afd6-671c0cb2595f.png)|
+
+#### User Facing Testing
+
+1. Go to `wp-admin/admin.php?page=wc-settings&tab=shipping§ion=options` page.
+2. Enable the `Force shipping to the customer billing address` option and save the changes.
+3. Go Checkout block, and confirm shipping address form is not visible.
+4. Change the billing address, confirm the shipping address in the order summary gets changed and shipping methods are
+ updated.
+
+### Fixed an error where adding new pages would cause an infinite loop and large amounts of memory use in redux ([7256](https://github.com/woocommerce/woocommerce-blocks/pull/7256))
+
+#### User Facing Testing
+
+1. Open the editor on any page/create a new page.
+2. View the console and ensure no errors about `RangeError: Maximum call stack size exceeded` or similar appear.
+3. Add the Checkout Block, ensure the editor works and the block is displayed correctly
+4. Make a new page and add the Cart block, ensure the editor works and the block is displayed correctly.
+5. Do a test order using the Cart and Checkout blocks.
+
+### Ensure error messages containing HTML are shown correctly in the Cart and Checkout blocks ([7231](https://github.com/woocommerce/woocommerce-blocks/pull/7231))
+
+| Before | After |
+| ------ | ----- |
+|||
+
+#### User Facing Testing
+
+1. Check out branch 1287-gh-Automattic/woopay
+ 2Update the code:
+ In src/Checkout/PaymentsHandler.php, comment or remove the if around the exception:
+
+```php
+ // if ( empty( $customer_id ) ) {
+ $session_data = WooPaySession::UNSANITIZED_get_data();
+ $blog_checkout_url = esc_url( add_query_arg( 'skip_platform_checkout', 'true', $session_data['store_data']
+ ['blog_checkout_url'] ) );
+ /* translators: %1$s opening anchor tag with url, %2$s closing anchor tag */
+ $error_message = __( 'we were unable to process your payment. Please %1$s go back to the merchant store %2$s and
+ log into WooPay again.', 'woopay' );
+ $open_tag = '';
+ $close_tag = '';
+ throw new InvalidSessionException(
+ sprintf( $error_message, $open_tag, $close_tag ),
+ );
+// }
+```
+
+3. Get a valid checkout_session by checking out with a valid email and filling in the OTP code.
+4. Place an order and see the error message
+
+### Prevent locked inner blocks from sometimes displaying twice ([6676](https://github.com/woocommerce/woocommerce-blocks/pull/6676))
+
+| Before | After |
+| ------ | ----- |
+| | |
+
+#### User Facing Testing
+
+1. Install the [newsletter-test](https://github.com/woocommerce/newsletter-test) plugin to your site
+2. Go to the Checkout block in your editor
+3. Observe the `I want to receive updates about products and promotions.` checkbox in the customer information block. Ensure it only displays once.
+4. Save the page and ensure the newsletter signup block is still only shown once.
+5. Visit the block on the front-end and ensure the newsletter signup block only shows once.
+
+### Improve visual consistency between block links. ([7357](https://github.com/woocommerce/woocommerce-blocks/pull/7357))
+
+| Before | After |
+| ------ | ----- |
+| | |
+
+#### User Facing Testing
+
+1. Create a regular page (Pages > Add New) and add the All Product block to it;
+2. Add the Active Filters block;
+3. Add the Filter By Attribute block;
+4. Select an attribute from the Filter By Attribute block and apply it;
+5. When the page reloads, check if the "Clear All" button (in the Active Filters block) and the "Reset" button (in Filter By Attribute block) have the following properties:
+
+> Font size: 14px
+> Font weight: normal
+> Text decoration: underlined
+
+6. Hover the mouse over the "Clear All" button and the "Reset" button and make sure the text decoration is changed to `none` (no underline) while the other properties remain the same:
+
+> Font size: 14px
+> Font weight: normal
+> Text decoration: none
+
+### Fix a problem that causes an infinite loop when inserting Cart block in wordpress.com ([7367](https://github.com/woocommerce/woocommerce-blocks/pull/7367))
+
+#### User Facing Testing
+
+1. Get a zip of this plugin (from below) and upload it to a wordpress.com website.
+2. Go to the editor and try to insert Cart, it should work.
+3. Make sure no block is missing.
+
+
diff --git a/docs/internal-developers/testing/releases/README.md b/docs/internal-developers/testing/releases/README.md
index 8c1592785f3..d860faebed1 100644
--- a/docs/internal-developers/testing/releases/README.md
+++ b/docs/internal-developers/testing/releases/README.md
@@ -84,12 +84,14 @@ Every release includes specific testing instructions for new features and bug fi
- [8.0.0](./800.md)
- [8.1.0](./810.md)
- [8.2.0](./820.md)
-- [8.2.1](./821.md)
+ - [8.2.1](./821.md)
- [8.3.0](./830.md)
-- [8.3.1](./831.md)
+ - [8.3.1](./831.md)
- [8.4.0](./840.md)
- [8.5.0](./850.md)
- [8.5.1](./851.md)
+- [8.6.0](./860.md)
+- [8.7.0](./870.md)
diff --git a/package.json b/package.json
index 7050d6cf91f..995d63bd627 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "@woocommerce/block-library",
"title": "WooCommerce Blocks",
"author": "Automattic",
- "version": "8.7.0-dev",
+ "version": "8.7.0",
"description": "WooCommerce blocks for the Gutenberg editor.",
"homepage": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/",
"keywords": [
diff --git a/readme.txt b/readme.txt
index 55ae51b741a..e93c746bcf5 100644
--- a/readme.txt
+++ b/readme.txt
@@ -4,7 +4,7 @@ Tags: gutenberg, woocommerce, woo commerce, products, blocks, woocommerce blocks
Requires at least: 6.0
Tested up to: 6.0
Requires PHP: 7.0
-Stable tag: 8.7.0-dev
+Stable tag: 8.7.0
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.html
@@ -80,6 +80,32 @@ Release and roadmap notes available on the [WooCommerce Developers Blog](https:/
== Changelog ==
+= 8.7.0 - 2022-10-10 =
+
+#### Enhancements
+
+- Improve visual consistency between block links. ([7340](https://github.com/woocommerce/woocommerce-blocks/pull/7340))
+- Update the titles of some inner blocks of the Cart block and remove the lock of the Cross-Sells parent block. ([7232](https://github.com/woocommerce/woocommerce-blocks/pull/7232))
+- Add filter for place order button label. ([7154](https://github.com/woocommerce/woocommerce-blocks/pull/7154))
+- Exposed data related to the checkout through wordpress/data stores. ([6612](https://github.com/woocommerce/woocommerce-blocks/pull/6612))
+- Add simple, large & two menus footer patterns. ([7306](https://github.com/woocommerce/woocommerce-blocks/pull/7306))
+- Add minimal, large, and essential header patterns. ([7292](https://github.com/woocommerce/woocommerce-blocks/pull/7292))
+- Add `showRemoveItemLink` as a new checkout filter to allow extensions to toggle the visibility of the `Remove item` button under each cart line item. ([7242](https://github.com/woocommerce/woocommerce-blocks/pull/7242))
+- Add support for a GT tracking ID for Google Analytics. ([7213](https://github.com/woocommerce/woocommerce-blocks/pull/7213))
+- Separate filter titles and filter controls by converting filter blocks to use Inner Blocks. ([6978](https://github.com/woocommerce/woocommerce-blocks/pull/6978))
+- StoreApi requests will return a `Cart-Token` header that can be used to retrieve the cart from the corresponding session via **GET** `/wc/store/v1/cart`. ([5953](https://github.com/woocommerce/woocommerce-blocks/pull/5953))
+
+#### Bug Fixes
+
+- Fixed HTML rendering in description of active payment integrations. ([7313](https://github.com/woocommerce/woocommerce-blocks/pull/7313))
+- Hide the shipping address form from the Checkout when the "Force shipping to the customer billing address" is enabled. ([7268](https://github.com/woocommerce/woocommerce-blocks/pull/7268))
+- Fixed an error where adding new pages would cause an infinite loop and large amounts of memory use in redux. ([7256](https://github.com/woocommerce/woocommerce-blocks/pull/7256))
+- Ensure error messages containing HTML are shown correctly in the Cart and Checkout blocks. ([7231](https://github.com/woocommerce/woocommerce-blocks/pull/7231))
+- Prevent locked inner blocks from sometimes displaying twice. ([6676](https://github.com/woocommerce/woocommerce-blocks/pull/6676))
+- Improve visual consistency between block links. ([7357](https://github.com/woocommerce/woocommerce-blocks/pull/7357))
+- StoreApi `/checkout` endpoint now returns HTTP 402 instead of HTTP 400 when payment fails. ([7273](https://github.com/woocommerce/woocommerce-blocks/pull/7273))
+- Fix a problem that causes an infinite loop when inserting Cart block in wordpress.com. ([7367](https://github.com/woocommerce/woocommerce-blocks/pull/7367))
+
= 8.6.0 - 2022-09-26 =
#### Enhancements
diff --git a/src/Package.php b/src/Package.php
index 255fc89f887..82213d8dba9 100644
--- a/src/Package.php
+++ b/src/Package.php
@@ -109,7 +109,7 @@ public static function container( $reset = false ) {
NewPackage::class,
function ( $container ) {
// leave for automated version bumping.
- $version = '8.7.0-dev';
+ $version = '8.7.0';
return new NewPackage(
$version,
dirname( __DIR__ ),
diff --git a/woocommerce-gutenberg-products-block.php b/woocommerce-gutenberg-products-block.php
index 767b275a943..465d22c8cac 100644
--- a/woocommerce-gutenberg-products-block.php
+++ b/woocommerce-gutenberg-products-block.php
@@ -3,7 +3,7 @@
* Plugin Name: WooCommerce Blocks
* Plugin URI: https://github.com/woocommerce/woocommerce-gutenberg-products-block
* Description: WooCommerce blocks for the Gutenberg editor.
- * Version: 8.7.0-dev
+ * Version: 8.7.0
* Author: Automattic
* Author URI: https://woocommerce.com
* Text Domain: woo-gutenberg-products-block
@@ -15,7 +15,7 @@
* @package WooCommerce\Blocks
* @internal This file is only used when running as a feature plugin.
*/
-
+
defined( 'ABSPATH' ) || exit;
$minimum_wp_version = '6.0';
@@ -24,11 +24,14 @@
define( 'WC_BLOCKS_IS_FEATURE_PLUGIN', true );
}
-// Declare comaptibility with custom order tables for WooCommerce
+// Declare compatibility with custom order tables for WooCommerce.
if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
- add_action('before_woocommerce_init', function() {
- \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility('custom_order_tables', __FILE__, true);
- });
+ add_action(
+ 'before_woocommerce_init',
+ function () {
+ \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
+ }
+ );
}
/**