Commit 62c6a533ec2 for woocommerce

commit 62c6a533ec2cf0a97c6530dc0a9d1e6906c03eb6
Author: Raluca Stan <ralucastn@gmail.com>
Date:   Thu Aug 27 13:00:53 2026 +0200

    Fix the Blocks hook docs pipeline and regenerate hook docs (#67839)

    * Fix Blocks hook docs pipeline and regenerate hook docs

    * Add changelog entry for Blocks hook docs pipeline fix

    * Remove the suffix cap in the hook docs TOC anchor dedup

    * Size hook docs code fences to exceed inner backtick runs

    * Constrain hook docs example files to docs/examples

    * Backtick literal placeholders in AbstractTemplateCompatibility docblocks

    The <hook-name>/<function-name>/<priority> placeholders read as HTML
    tags once the docblock text lands in the generated hook docs as raw
    Markdown; as code spans they render literally and keep markdownlint's
    inline-HTML rule (MD033) quiet.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    * Emit raw docblock Markdown from the patched hook docs generator

    Extend wp-hooks-generator.patch so the long description and the
    @param/@see/@since tag text go into the JSON as the docblock's own
    Markdown instead of Parsedown-rendered HTML. Parsedown is still called
    internally for hook-alias detection, but long_description_html is
    emptied, so the data files carry no HTML at all.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    * Render hook docs from raw Markdown and drop the HTML converter

    With the generator emitting raw docblock Markdown, the regex-based
    html-to-markdown.js converter has nothing left to convert; delete it
    and read doc.long_description and the raw tag content directly. The
    new docblock-to-markdown.js only normalizes shape: soft-wrapped prose
    joins into single-line paragraphs, list items keep their own lines
    with a blank line before the list, and fenced code blocks pass through
    untouched. Table cells keep their pipe escaping.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    * Stop committing the hook docs data JSON

    data/actions.json and data/filters.json are an intermediate the
    generator writes and the doc builder consumes within the same
    build:docs run; nothing else reads them, and the committed copies had
    been frozen since the monorepo merge without anyone noticing. Gitignore
    the directory and create it in the build script (the generator refuses
    to write to a missing directory), so regens only ever touch the two
    rendered Markdown files.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    * Revert the @since change in AddToCartWithOptions

    The do_action call at this site was introduced by 57134b78b2 (#56536)
    and first shipped in 9.9.0, so 9.9.0 was the correct value; 9.7.0 was
    copy-pasted from the sibling docblock. The tag is never rendered into
    the generated docs, so the change had no effect on this PR anyway —
    the file now carries no diff at all.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    * Close code fences only on a matching marker

    Per CommonMark, a closing fence must be a bare run of the same
    character, at least as long as the opening one; the normalizer used to
    toggle on any fence-looking line, so a shorter or different marker
    inside a fenced block would end it early. Track the opening delimiter
    and close only on a matching marker. Generated docs are unchanged.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    * Keep doc file permissions intact in add-doc-footer.sh

    mktemp creates its file 0600 and mv carried that mode onto the
    generated docs, silently flipping them from 0644 to owner-only on
    every docs build (git does not track read bits, so it never showed
    up). Overwrite the target's contents from the temp file instead of
    renaming over it, so the file keeps its own mode.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    * Harden two doc builder edges

    Skip see tags without a reference: a malformed @see reaches the
    builder as a see tag with no refers, and the See list would render a
    literal "undefined". No such tag exists in the current scan; this
    guards the next one.

    Report build failures with console.error( error ), so the full stack
    lands on stderr in CI logs instead of a message-only line on stdout.

    Generated docs are unchanged.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    * Update the composer patch description for the raw-Markdown change

    The patch also makes the generator emit raw docblock Markdown now; say
    so in the description composer prints when applying it. Lock file
    change is the content hash only.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    * Make @example content the example file path

    The four hook @example tags read "See docs/examples/….md", so the doc
    builder had to strip the "See " prose before resolving the file — a
    frail prefix match. Make the docblock content the path itself and drop
    the prefix handling; an unreadable path still degrades to a warning.
    Generated docs are unchanged.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    ---------

    Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

diff --git a/docs/block-development/reference/hooks/migrated-hooks.md b/docs/block-development/reference/hooks/migrated-hooks.md
index 1f1b6fe24da..47bbc08d2c4 100644
--- a/docs/block-development/reference/hooks/migrated-hooks.md
+++ b/docs/block-development/reference/hooks/migrated-hooks.md
@@ -10,7 +10,6 @@ Please note that the actions and filters here run on the server side. The client

 ## Legacy Filters

-- [loop_shop_per_page](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#loop_shop_per_page)
 - [wc_session_expiration](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#wc_session_expiration)
 - [woocommerce_add_cart_item](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_add_cart_item)
 - [woocommerce_add_cart_item_data](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_add_cart_item_data)
@@ -18,7 +17,6 @@ Please note that the actions and filters here run on the server side. The client
 - [woocommerce_add_to_cart_sold_individually_quantity](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_add_to_cart_sold_individually_quantity)
 - [woocommerce_add_to_cart_validation](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_add_to_cart_validation)
 - [woocommerce_adjust_non_base_location_prices](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_adjust_non_base_location_prices)
-- [woocommerce_apply_base_tax_for_local_pickup](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_apply_base_tax_for_local_pickup)
 - [woocommerce_apply_individual_use_coupon](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_apply_individual_use_coupon)
 - [woocommerce_apply_with_individual_use_coupon](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_apply_with_individual_use_coupon)
 - [woocommerce_cart_contents_changed](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_cart_contents_changed)
@@ -26,13 +24,9 @@ Please note that the actions and filters here run on the server side. The client
 - [woocommerce_get_item_data](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_get_item_data)
 - [woocommerce_loop_add_to_cart_args](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_loop_add_to_cart_args)
 - [woocommerce_loop_add_to_cart_link](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_loop_add_to_cart_link)
-- [woocommerce_new_customer_data](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_new_customer_data)
 - [woocommerce_pay_order_product_has_enough_stock](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_pay_order_product_has_enough_stock)
 - [woocommerce_pay_order_product_in_stock](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_pay_order_product_in_stock)
-- [woocommerce_registration_errors](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_registration_errors)
-- [woocommerce_shipping_package_name](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_shipping_package_name)
 - [woocommerce_show_page_title](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_show_page_title)
-- [woocommerce_single_product_image_thumbnail_html](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md#woocommerce_single_product_image_thumbnail_html)

 ## Legacy Actions

@@ -44,7 +38,5 @@ Please note that the actions and filters here run on the server side. The client
 - [woocommerce_before_main_content](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md#woocommerce_before_main_content)
 - [woocommerce_before_shop_loop](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md#woocommerce_before_shop_loop)
 - [woocommerce_check_cart_items](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md#woocommerce_check_cart_items)
-- [woocommerce_created_customer](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md#woocommerce_created_customer)
 - [woocommerce_no_products_found](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md#woocommerce_no_products_found)
-- [woocommerce_register_post](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md#woocommerce_register_post)
 - [woocommerce_shop_loop](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md#woocommerce_shop_loop)
diff --git a/plugins/woocommerce/changelog/fix-blocks-hook-docs-pipeline b/plugins/woocommerce/changelog/fix-blocks-hook-docs-pipeline
new file mode 100644
index 00000000000..6974c89eb53
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-blocks-hook-docs-pipeline
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Fix the WooCommerce Blocks hook docs pipeline (build:docs) and regenerate the hooks reference (filters.md, actions.md) from the current PHP sources.
diff --git a/plugins/woocommerce/client/blocks/.gitignore b/plugins/woocommerce/client/blocks/.gitignore
index 1e3c9cb4106..d6cf83beec6 100644
--- a/plugins/woocommerce/client/blocks/.gitignore
+++ b/plugins/woocommerce/client/blocks/.gitignore
@@ -56,3 +56,4 @@ storybook-static/
 /.wp-env.override.json
 /eslint_report.json
 /storybook/dist
+/bin/hook-docs/data/
diff --git a/plugins/woocommerce/client/blocks/bin/add-doc-footer.sh b/plugins/woocommerce/client/blocks/bin/add-doc-footer.sh
index 049436ae966..fea49ca294d 100755
--- a/plugins/woocommerce/client/blocks/bin/add-doc-footer.sh
+++ b/plugins/woocommerce/client/blocks/bin/add-doc-footer.sh
@@ -1,6 +1,15 @@
 #!/bin/bash
+set -euo pipefail
+
+STARTTAG="<!-- FEEDBACK -->"
+
 function update_footer {
-	export REPLACEWITH='
+	if [ ! -f "$1" ]; then
+		echo "add-doc-footer.sh: $1 does not exist — run the docs build first." >&2
+		exit 1
+	fi
+
+	REPLACEWITH='

 ---

@@ -12,21 +21,20 @@ function update_footer {

 	# Replace everything after <!-- FEEDBACK -->
 	if grep -q "$STARTTAG" "$1"; then
-		awk '/<!-- FEEDBACK -->/ {exit} {print}' $1 > tmp && mv tmp $1
+		tmp="$(mktemp)"
+		# Overwrite the target's contents instead of mv-ing the temp file
+		# over it: mktemp creates 0600, and a rename would carry that
+		# restrictive mode onto the generated doc.
+		awk '/<!-- FEEDBACK -->/ {exit} {print}' "$1" > "$tmp" && cat "$tmp" > "$1"
+		rm -f "$tmp"
 	fi

 	# Append feedback section.
-	printf '%s\n' "<!-- FEEDBACK -->$REPLACEWITH<!-- /FEEDBACK -->" '' >> $1
+	printf '%s\n' "<!-- FEEDBACK -->$REPLACEWITH<!-- /FEEDBACK -->" >> "$1"
 }

-find ./docs -name "*.md" ! -path "./docs/examples*"  ! -path "./docs/internal-developers*"|while read filename; do
-  update_footer $filename
-done
-
-find ./packages/public-api/blocks-checkout -name "*.md"|while read filename; do
-  update_footer $filename
-done
-
-find ./src/StoreApi -name "*.md"|while read filename; do
-  update_footer $filename
-done
+# Only the files (re)generated by `pnpm build:docs` get their footer refreshed. The rest
+# of the docs tree is static (mostly stubs pointing at the new docs location) and keeps
+# its committed footers untouched.
+update_footer ./docs/third-party-developers/extensibility/hooks/actions.md
+update_footer ./docs/third-party-developers/extensibility/hooks/filters.md
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/README.md b/plugins/woocommerce/client/blocks/bin/hook-docs/README.md
new file mode 100644
index 00000000000..2f72ae33d27
--- /dev/null
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/README.md
@@ -0,0 +1,16 @@
+# Hook docs generator
+
+`pnpm --filter=@woocommerce/block-library build:docs` regenerates the hook documentation:
+
+1. `composer install` (in `client/blocks`) installs [`wp-hooks/generator`](https://github.com/wp-hooks/generator). A small patch (`wp-hooks-generator.patch`, applied via `cweagans/composer-patches`) keeps the `@return`/`@throws` tag types the docs render, downgrades unknown-docblock-tag fatals to warnings, and makes the generator emit the docblock text as raw Markdown instead of Parsedown-rendered HTML. The generator declares `php >= 8.3`, but its code runs fine on the repo's PHP 8.1 toolchain (verified: byte-identical output), so `composer.json` pins `config.platform.php` to `8.3.0` and disables the runtime platform check — revalidate this if `wp-hooks/generator` is ever bumped past 1.0.2.
+2. `wp-hooks-generator` scans the PHP sources in `plugins/woocommerce/src` and writes `data/actions.json` and `data/filters.json` — a gitignored intermediate that the next step consumes in the same run. The scan is limited to the WooCommerce Blocks PHP (`src/Blocks` and `src/StoreApi`) by the `extra.wp-hooks.ignore-files` list in `client/blocks/composer.json` — if a new top-level directory is added to `plugins/woocommerce/src` that should not appear in these docs, add it to that list.
+3. `node ./bin/hook-docs` renders the JSON into `docs/third-party-developers/extensibility/hooks/actions.md` and `filters.md`, and `bin/add-doc-footer.sh` re-appends the feedback footer to the regenerated files. Docblock text passes through as Markdown; `utilities/docblock-to-markdown.js` only normalizes it for the generated files (soft-wrapped prose is joined into single-line paragraphs, list items keep their own lines with a blank line before the list, fenced code blocks pass through untouched — nested list indentation is not preserved).
+
+Do not edit `actions.md` or `filters.md` by hand — fix the source docblocks instead and regenerate.
+
+Notes:
+
+- Hooks without a docblock at the call site are skipped by the generator (it warns during the build), and `internal_`-prefixed hooks are filtered out of the generated reference on purpose.
+- `composer-patches` v1 does not track patch content in `composer.lock`, so after editing `wp-hooks-generator.patch` run `rm -rf vendor && composer install` to re-apply it — a plain `composer install` with an existing `vendor/` is a no-op.
+- Docblock descriptions and tag text should be valid Markdown — it lands in the generated docs as-is. Use backticks around literal angle-bracket placeholders (`` `<hook-name>` ``), otherwise markdownlint flags them as inline HTML.
+- `composer.lock` pins `erusev/parsedown 1.8.0-beta-7` because `wp-hooks/generator` requires that exact beta; with the patch it is only used internally for hook-alias detection, never for the doc output, and it is dev tooling only and never ships.
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/actions/index.js b/plugins/woocommerce/client/blocks/bin/hook-docs/actions/index.js
index 821a168b6d6..979f3de3e12 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/actions/index.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/actions/index.js
@@ -45,7 +45,7 @@ const generate = ( hooks ) => {
 				...generateHookName( hook ),
 				...generateIntroduction( hook ),
 				...contentWithHeading(
-					hook.doc.long_description_html,
+					hook.doc.long_description,
 					'Description'
 				),
 				...sectionWithHeading( params( hookDocs ), 'Parameters' ),
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/data/actions.json b/plugins/woocommerce/client/blocks/bin/hook-docs/data/actions.json
deleted file mode 100644
index 9c6c1650a80..00000000000
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/data/actions.json
+++ /dev/null
@@ -1,1066 +0,0 @@
-{
-    "$schema": "https://raw.githubusercontent.com/wp-hooks/generator/0.9.0/schema.json",
-    "hooks": [
-        {
-            "name": "deprecated_function_run",
-            "file": "Domain/Bootstrap.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when a deprecated function is called.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.3.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_add_to_cart",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when an item is added to the cart.",
-                "long_description": "This hook fires when an item is added to the cart. This is triggered from the Store API in this context, but WooCommerce core add to cart events trigger the same hook.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.5.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches action name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "ID of the item in the cart.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$cart_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "ID of the product added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$product_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Quantity of the item added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$request_quantity"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Variation ID of the product added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$variation_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of variation data.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$variation"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of other cart item data.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$cart_item_data"
-                    }
-                ],
-                "long_description_html": "<p>This hook fires when an item is added to the cart. This is triggered from the Store API in this context, but WooCommerce core add to cart events trigger the same hook.</p>"
-            },
-            "args": 6
-        },
-        {
-            "name": "woocommerce_after_main_content",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "action",
-            "doc": {
-                "description": "Hook: woocommerce_after_main_content",
-                "long_description": "Called after rendering the main content for a product.",
-                "tags": [
-                    {
-                        "name": "see",
-                        "content": "Outputs closing DIV for the content (priority 10)",
-                        "refers": "woocommerce_output_content_wrapper_end()"
-                    },
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": "<p>Called after rendering the main content for a product.</p>"
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_after_main_content",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "action",
-            "doc": {
-                "description": "Hook: woocommerce_after_main_content",
-                "long_description": "Called after rendering the main content for a product.",
-                "tags": [
-                    {
-                        "name": "see",
-                        "content": "Outputs closing DIV for the content (priority 10)",
-                        "refers": "woocommerce_output_content_wrapper_end()"
-                    },
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": "<p>Called after rendering the main content for a product.</p>"
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_after_shop_loop",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "action",
-            "doc": {
-                "description": "Hook: woocommerce_after_shop_loop.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "see",
-                        "content": "Renders pagination (priority 10)",
-                        "refers": "woocommerce_pagination()"
-                    },
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_applied_coupon",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires after a coupon has been applied to the cart.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.6.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches action name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "The coupon code that was applied.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$coupon_code"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_archive_description",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "action",
-            "doc": {
-                "description": "Hook: woocommerce_archive_description.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "see",
-                        "content": "Renders the taxonomy archive description (priority 10)",
-                        "refers": "woocommerce_taxonomy_archive_description()"
-                    },
-                    {
-                        "name": "see",
-                        "content": "Renders the product archive description (priority 10)",
-                        "refers": "woocommerce_product_archive_description()"
-                    },
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_before_main_content",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "action",
-            "doc": {
-                "description": "Hook: woocommerce_before_main_content",
-                "long_description": "Called before rendering the main content for a product.",
-                "tags": [
-                    {
-                        "name": "see",
-                        "content": "Outputs opening DIV for the content (priority 10)",
-                        "refers": "woocommerce_output_content_wrapper()"
-                    },
-                    {
-                        "name": "see",
-                        "content": "Outputs breadcrumb trail to the current product (priority 20)",
-                        "refers": "woocommerce_breadcrumb()"
-                    },
-                    {
-                        "name": "see",
-                        "content": "Outputs schema markup (priority 30)",
-                        "refers": "WC_Structured_Data::generate_website_data()"
-                    },
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": "<p>Called before rendering the main content for a product.</p>"
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_before_main_content",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "action",
-            "doc": {
-                "description": "Hook: woocommerce_before_main_content",
-                "long_description": "Called before rendering the main content for a product.",
-                "tags": [
-                    {
-                        "name": "see",
-                        "content": "Outputs opening DIV for the content (priority 10)",
-                        "refers": "woocommerce_output_content_wrapper()"
-                    },
-                    {
-                        "name": "see",
-                        "content": "Outputs breadcrumb trail to the current product (priority 20)",
-                        "refers": "woocommerce_breadcrumb()"
-                    },
-                    {
-                        "name": "see",
-                        "content": "Outputs schema markup (priority 30)",
-                        "refers": "WC_Structured_Data::generate_website_data()"
-                    },
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": "<p>Called before rendering the main content for a product.</p>"
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_before_shop_loop",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "action",
-            "doc": {
-                "description": "Hook: woocommerce_before_shop_loop.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "see",
-                        "content": "Render error notices (priority 10)",
-                        "refers": "woocommerce_output_all_notices()"
-                    },
-                    {
-                        "name": "see",
-                        "content": "Show number of results found (priority 20)",
-                        "refers": "woocommerce_result_count()"
-                    },
-                    {
-                        "name": "see",
-                        "content": "Show form to control sort order (priority 30)",
-                        "refers": "woocommerce_catalog_ordering()"
-                    },
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_blocks_cart_enqueue_data",
-            "file": "BlockTypes/MiniCart.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires after cart block data is registered.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "5.8.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_blocks_cart_enqueue_data",
-            "file": "BlockTypes/Cart.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires after cart block data is registered.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.6.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_blocks_checkout_enqueue_data",
-            "file": "BlockTypes/Checkout.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires after checkout block data is registered.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.6.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_blocks_enqueue_cart_block_scripts_after",
-            "file": "BlockTypes/Cart.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires after cart block scripts are enqueued.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.6.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_blocks_enqueue_cart_block_scripts_before",
-            "file": "BlockTypes/Cart.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires before cart block scripts are enqueued.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.6.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_blocks_enqueue_checkout_block_scripts_after",
-            "file": "BlockTypes/Checkout.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires after checkout block scripts are enqueued.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "4.6.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_blocks_enqueue_checkout_block_scripts_before",
-            "file": "BlockTypes/Checkout.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires before checkout block scripts are enqueued.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "4.6.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_blocks_loaded",
-            "file": "Domain/Bootstrap.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when the woocommerce blocks are loaded and ready to use.",
-                "long_description": "This hook is intended to be used as a safe event hook for when the plugin has been loaded, and all dependency requirements have been met.\n To ensure blocks are initialized, you must use the `woocommerce_blocks_loaded` hook instead of the `plugins_loaded` hook. This is because the functions hooked into plugins_loaded on the same priority load in an inconsistent and unpredictable manner.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.5.0"
-                    }
-                ],
-                "long_description_html": "<p>This hook is intended to be used as a safe event hook for when the plugin has been loaded, and all dependency requirements have been met.</p> <p>To ensure blocks are initialized, you must use the <code>woocommerce_blocks_loaded</code> hook instead of the <code>plugins_loaded</code> hook. This is because the functions hooked into plugins_loaded on the same priority load in an inconsistent and unpredictable manner.</p>"
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_blocks_{$this->registry_identifier}_registration",
-            "file": "Integrations/IntegrationRegistry.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when the IntegrationRegistry is initialized.",
-                "long_description": "Runs before integrations are initialized allowing new integration to be registered for use. This should be used as the primary hook for integrations to include their scripts, styles, and other code extending the blocks.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "4.6.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Instance of the IntegrationRegistry class which exposes the IntegrationRegistry::register() method.",
-                        "types": [
-                            "\\Automattic\\WooCommerce\\Blocks\\Integrations\\IntegrationRegistry"
-                        ],
-                        "variable": "$this"
-                    }
-                ],
-                "long_description_html": "<p>Runs before integrations are initialized allowing new integration to be registered for use. This should be used as the primary hook for integrations to include their scripts, styles, and other code extending the blocks.</p>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_check_cart_items",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when cart items are being validated.",
-                "long_description": "Allow 3rd parties to validate cart items. This is a legacy hook from Woo core. This filter will be deprecated because it encourages usage of wc_add_notice. For the API we need to capture notices and convert to wp errors instead.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "deprecated",
-                        "content": ""
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches action name in WooCommerce core."
-                    }
-                ],
-                "long_description_html": "<p>Allow 3rd parties to validate cart items. This is a legacy hook from Woo core. This filter will be deprecated because it encourages usage of wc_add_notice. For the API we need to capture notices and convert to wp errors instead.</p>"
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_created_customer",
-            "file": "StoreApi/Routes/V1/Checkout.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires after a customer account has been registered.",
-                "long_description": "This hook fires after customer accounts are created and passes the customer data.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "New customer (user) ID.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$customer_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of customer (user) data.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$new_customer_data"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The generated password for the account.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$password_generated"
-                    }
-                ],
-                "long_description_html": "<p>This hook fires after customer accounts are created and passes the customer data.</p>"
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_no_products_found",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "action",
-            "doc": {
-                "description": "Hook: woocommerce_no_products_found.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "see",
-                        "content": "Default no products found content (priority 10)",
-                        "refers": "wc_no_products_found()"
-                    },
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_register_post",
-            "file": "StoreApi/Routes/V1/Checkout.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires before a customer account is registered.",
-                "long_description": "This hook fires before customer accounts are created and passes the form data (username, email) and an array of errors.\n This could be used to add extra validation logic and append errors to the array.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Customer username.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$username"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Customer email address.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$user_email"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Error object.",
-                        "types": [
-                            "\\WP_Error"
-                        ],
-                        "variable": "$errors"
-                    }
-                ],
-                "long_description_html": "<p>This hook fires before customer accounts are created and passes the form data (username, email) and an array of errors.</p> <p>This could be used to add extra validation logic and append errors to the array.</p>"
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_shop_loop",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "action",
-            "doc": {
-                "description": "Hook: woocommerce_shop_loop.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "woocommerce_store_api_cart_errors",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires an action to validate the cart.",
-                "long_description": "Functions hooking into this should add custom errors using the provided WP_Error instance.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "example",
-                        "content": "docs/examples/validate-cart.md"
-                    },
-                    {
-                        "name": "param",
-                        "content": "WP_Error object.",
-                        "types": [
-                            "\\WP_Error"
-                        ],
-                        "variable": "$errors"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Cart object.",
-                        "types": [
-                            "\\WC_Cart"
-                        ],
-                        "variable": "$cart"
-                    }
-                ],
-                "long_description_html": "<p>Functions hooking into this should add custom errors using the provided WP_Error instance.</p>"
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_store_api_cart_select_shipping_rate",
-            "file": "StoreApi/Routes/V1/CartSelectShippingRate.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires an action after a shipping method has been chosen for package(s) via the Store API.",
-                "long_description": "This allows extensions to perform addition actions after a shipping method has been chosen, but before the cart totals are recalculated.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "9.0.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The sanitized ID of the package being updated. Null if all packages are being updated.",
-                        "types": [
-                            "string",
-                            "null"
-                        ],
-                        "variable": "$package_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The sanitized chosen rate ID for the package.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$rate_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Full details about the request.",
-                        "types": [
-                            "\\WP_REST_Request"
-                        ],
-                        "variable": "$request"
-                    }
-                ],
-                "long_description_html": "<p>This allows extensions to perform addition actions after a shipping method has been chosen, but before the cart totals are recalculated.</p>"
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_store_api_cart_update_customer_from_request",
-            "file": "StoreApi/Routes/V1/CartUpdateCustomer.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when the Checkout Block/Store API updates a customer from the API request data.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Customer object.",
-                        "types": [
-                            "\\WC_Customer"
-                        ],
-                        "variable": "$customer"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Full details about the request.",
-                        "types": [
-                            "\\WP_REST_Request"
-                        ],
-                        "variable": "$request"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_store_api_cart_update_order_from_request",
-            "file": "StoreApi/Routes/V1/AbstractCartRoute.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when the order is synced with cart data from a cart route.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Order object.",
-                        "types": [
-                            "\\WC_Order"
-                        ],
-                        "variable": "$draft_order"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Customer object.",
-                        "types": [
-                            "\\WC_Customer"
-                        ],
-                        "variable": "$customer"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Full details about the request.",
-                        "types": [
-                            "\\WP_REST_Request"
-                        ],
-                        "variable": "$request"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_store_api_checkout_order_processed",
-            "file": "StoreApi/Routes/V1/CheckoutOrder.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires before an order is processed by the Checkout Block/Store API.",
-                "long_description": "This hook informs extensions that $order has completed processing and is ready for payment.\n This is similar to existing core hook woocommerce_checkout_order_processed. We're using a new action: - To keep the interface focused (only pass $order, not passing request data). - This also explicitly indicates these orders are from checkout block/StoreAPI.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "see",
-                        "content": "",
-                        "refers": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3238"
-                    },
-                    {
-                        "name": "example",
-                        "content": "docs/examples/checkout-order-processed.md"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Order object.",
-                        "types": [
-                            "\\WC_Order"
-                        ],
-                        "variable": "$order"
-                    }
-                ],
-                "long_description_html": "<p>This hook informs extensions that $order has completed processing and is ready for payment.</p> <p>This is similar to existing core hook woocommerce_checkout_order_processed. We're using a new action:</p> <ul> <li>To keep the interface focused (only pass $order, not passing request data).</li> <li>This also explicitly indicates these orders are from checkout block/StoreAPI.</li> </ul>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_store_api_checkout_order_processed",
-            "file": "StoreApi/Routes/V1/Checkout.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires before an order is processed by the Checkout Block/Store API.",
-                "long_description": "This hook informs extensions that $order has completed processing and is ready for payment.\n This is similar to existing core hook woocommerce_checkout_order_processed. We're using a new action: - To keep the interface focused (only pass $order, not passing request data). - This also explicitly indicates these orders are from checkout block/StoreAPI.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "see",
-                        "content": "",
-                        "refers": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3238"
-                    },
-                    {
-                        "name": "example",
-                        "content": "docs/examples/checkout-order-processed.md"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Order object.",
-                        "types": [
-                            "\\WC_Order"
-                        ],
-                        "variable": "$order"
-                    }
-                ],
-                "long_description_html": "<p>This hook informs extensions that $order has completed processing and is ready for payment.</p> <p>This is similar to existing core hook woocommerce_checkout_order_processed. We're using a new action:</p> <ul> <li>To keep the interface focused (only pass $order, not passing request data).</li> <li>This also explicitly indicates these orders are from checkout block/StoreAPI.</li> </ul>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_store_api_checkout_update_customer_from_request",
-            "file": "StoreApi/Routes/V1/CheckoutOrder.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when the Checkout Block/Store API updates a customer from the API request data.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "8.2.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Customer object.",
-                        "types": [
-                            "\\WC_Customer"
-                        ],
-                        "variable": "$customer"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Full details about the request.",
-                        "types": [
-                            "\\WP_REST_Request"
-                        ],
-                        "variable": "$request"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_store_api_checkout_update_customer_from_request",
-            "file": "StoreApi/Routes/V1/Checkout.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when the Checkout Block/Store API updates a customer from the API request data.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "8.2.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Customer object.",
-                        "types": [
-                            "\\WC_Customer"
-                        ],
-                        "variable": "$customer"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Full details about the request.",
-                        "types": [
-                            "\\WP_REST_Request"
-                        ],
-                        "variable": "$request"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_store_api_checkout_update_order_meta",
-            "file": "StoreApi/Routes/V1/Checkout.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when the Checkout Block/Store API updates an order's meta data.",
-                "long_description": "This hook gives extensions the chance to add or update meta data on the $order. Throwing an exception from a callback attached to this action will make the Checkout Block render in a warning state, effectively preventing checkout.\n This is similar to existing core hook woocommerce_checkout_update_order_meta. We're using a new action: - To keep the interface focused (only pass $order, not passing request data). - This also explicitly indicates these orders are from checkout block/StoreAPI.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "see",
-                        "content": "",
-                        "refers": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3686"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Order object.",
-                        "types": [
-                            "\\WC_Order"
-                        ],
-                        "variable": "$order"
-                    }
-                ],
-                "long_description_html": "<p>This hook gives extensions the chance to add or update meta data on the $order. Throwing an exception from a callback attached to this action will make the Checkout Block render in a warning state, effectively preventing checkout.</p> <p>This is similar to existing core hook woocommerce_checkout_update_order_meta. We're using a new action:</p> <ul> <li>To keep the interface focused (only pass $order, not passing request data).</li> <li>This also explicitly indicates these orders are from checkout block/StoreAPI.</li> </ul>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_store_api_rate_limit_exceeded",
-            "file": "StoreApi/Authentication.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires when the rate limit is exceeded.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "8.9.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The IP address of the request.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$ip_address"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_store_api_validate_add_to_cart",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "action",
-            "doc": {
-                "description": "Fires during validation when adding an item to the cart via the Store API.",
-                "long_description": "Fire action to validate add to cart. Functions hooking into this should throw an \\Exception to prevent add to cart from happening.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.1.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Product object being added to the cart.",
-                        "types": [
-                            "\\WC_Product"
-                        ],
-                        "variable": "$product"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Add to cart request params including id, quantity, and variation attributes.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$request"
-                    }
-                ],
-                "long_description_html": "<p>Fire action to validate add to cart. Functions hooking into this should throw an \\Exception to prevent add to cart from happening.</p>"
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_store_api_validate_cart_item",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "action",
-            "doc": {
-                "description": "Fire action to validate add to cart. Functions hooking into this should throw an \\Exception to prevent add to cart from occurring.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.1.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Product object being added to the cart.",
-                        "types": [
-                            "\\WC_Product"
-                        ],
-                        "variable": "$product"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Cart item array.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$cart_item"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_{$product->get_type()}_add_to_cart",
-            "file": "BlockTypes/AddToCartForm.php",
-            "type": "action",
-            "doc": {
-                "description": "Trigger the single product add to cart action for each product type.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "9.7.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        },
-        {
-            "name": "{$hook}",
-            "file": "Templates/AbstractTemplateCompatibility.php",
-            "type": "action",
-            "doc": {
-                "description": "Action to render the content of a hook.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "9.5.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 0
-        }
-    ]
-}
\ No newline at end of file
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/data/filters.json b/plugins/woocommerce/client/blocks/bin/hook-docs/data/filters.json
deleted file mode 100644
index e8a110dd56c..00000000000
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/data/filters.json
+++ /dev/null
@@ -1,1504 +0,0 @@
-{
-    "$schema": "https://raw.githubusercontent.com/wp-hooks/generator/0.9.0/schema.json",
-    "hooks": [
-        {
-            "name": "__experimental_woocommerce_blocks_add_data_attributes_to_block",
-            "file": "BlockTypesController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the list of allowed Block Names",
-                "long_description": "This hook defines which block names should have block name and attribute data- attributes appended on render.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "5.9.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "List of namespaces.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$allowed_namespaces"
-                    }
-                ],
-                "long_description_html": "<p>This hook defines which block names should have block name and attribute data- attributes appended on render.</p>"
-            },
-            "args": 1
-        },
-        {
-            "name": "__experimental_woocommerce_blocks_add_data_attributes_to_namespace",
-            "file": "BlockTypesController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the list of allowed block namespaces.",
-                "long_description": "This hook defines which block namespaces should have block name and attribute `data-` attributes appended on render.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "5.9.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "List of namespaces.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$allowed_namespaces"
-                    }
-                ],
-                "long_description_html": "<p>This hook defines which block namespaces should have block name and attribute <code>data-</code> attributes appended on render.</p>"
-            },
-            "args": 1
-        },
-        {
-            "name": "__experimental_woocommerce_blocks_payment_gateway_features_list",
-            "file": "Payments/Integrations/PayPal.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filter to control what features are available for each payment gateway.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "4.4.0"
-                    },
-                    {
-                        "name": "example",
-                        "content": "docs/examples/payment-gateways-features-list.md"
-                    },
-                    {
-                        "name": "param",
-                        "content": "List of supported features.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$features"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Gateway name.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$name"
-                    },
-                    {
-                        "name": "return",
-                        "content": "Updated list of supported features.",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "deprecated_function_trigger_error",
-            "file": "Domain/Bootstrap.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters whether to trigger an error for deprecated functions. (Same as WP core)",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.3.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Whether to trigger the error for deprecated functions. Default true.",
-                        "types": [
-                            "bool"
-                        ],
-                        "variable": "$trigger"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 1
-        },
-        {
-            "name": "loop_shop_per_page",
-            "file": "BlockTypes/ProductQuery.php",
-            "type": "filter",
-            "doc": {
-                "description": "",
-                "long_description": "",
-                "tags": [],
-                "long_description_html": ""
-            },
-            "args": 1
-        },
-        {
-            "name": "loop_shop_per_page",
-            "file": "BlockTypes/ProductCollection.php",
-            "type": "filter",
-            "doc": {
-                "description": "",
-                "long_description": "",
-                "tags": [],
-                "long_description_html": ""
-            },
-            "args": 1
-        },
-        {
-            "name": "wc_session_expiration",
-            "file": "StoreApi/Routes/V1/AbstractCartRoute.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the session expiration.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "8.7.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Expiration in seconds.",
-                        "types": [
-                            "int"
-                        ],
-                        "variable": "$expiration"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_add_cart_item",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the item being added to the cart.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.5.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of cart item data being added to the cart.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$cart_item_data"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Id of the item in the cart.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$cart_id"
-                    },
-                    {
-                        "name": "return",
-                        "content": "Updated cart item data.",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_add_cart_item_data",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filter cart item data for add to cart requests.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.5.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of other cart item data.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$cart_item_data"
-                    },
-                    {
-                        "name": "param",
-                        "content": "ID of the product added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$product_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Variation ID of the product added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$variation_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Quantity of the item added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$quantity"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 4
-        },
-        {
-            "name": "woocommerce_add_to_cart_quantity",
-            "file": "BlockTypes/ProductButton.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the change the quantity to add to cart.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "10.9.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The default quantity.",
-                        "types": [
-                            "\\Automattic\\WooCommerce\\Blocks\\BlockTypes\\number"
-                        ],
-                        "variable": "$default_quantity"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The product id.",
-                        "types": [
-                            "\\Automattic\\WooCommerce\\Blocks\\BlockTypes\\number"
-                        ],
-                        "variable": "$product_id"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_add_to_cart_sold_individually_quantity",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filter sold individually quantity for add to cart requests.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.5.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Defaults to 1.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$sold_individually_quantity"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Quantity of the item added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$quantity"
-                    },
-                    {
-                        "name": "param",
-                        "content": "ID of the product added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$product_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Variation ID of the product added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$variation_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of other cart item data.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$cart_item_data"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "integer"
-                        ]
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 5
-        },
-        {
-            "name": "woocommerce_add_to_cart_validation",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters if an item being added to the cart passed validation checks.",
-                "long_description": "Allow 3rd parties to validate if an item can be added to the cart. This is a legacy hook from Woo core. This filter will be deprecated because it encourages usage of wc_add_notice. For the API we need to capture notices and convert to exceptions instead.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "deprecated",
-                        "content": ""
-                    },
-                    {
-                        "name": "param",
-                        "content": "True if the item passed validation.",
-                        "types": [
-                            "boolean"
-                        ],
-                        "variable": "$passed_validation"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Product ID being validated.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$product_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Quantity added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$quantity"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Variation ID being added to the cart.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$variation_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Variation data.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$variation"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "boolean"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>Allow 3rd parties to validate if an item can be added to the cart. This is a legacy hook from Woo core. This filter will be deprecated because it encourages usage of wc_add_notice. For the API we need to capture notices and convert to exceptions instead.</p>"
-            },
-            "args": 5
-        },
-        {
-            "name": "woocommerce_adjust_non_base_location_prices",
-            "file": "StoreApi/Utilities/ProductQuery.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters if taxes should be removed from locations outside the store base location.",
-                "long_description": "The woocommerce_adjust_non_base_location_prices filter can stop base taxes being taken off when dealing with out of base locations. e.g. If a product costs 10 including tax, all users will pay 10 regardless of location and taxes.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.6.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "True by default.",
-                        "types": [
-                            "boolean"
-                        ],
-                        "variable": "$adjust_non_base_location_prices"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "boolean"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>The woocommerce_adjust_non_base_location_prices filter can stop base taxes being taken off when dealing with out of base locations. e.g. If a product costs 10 including tax, all users will pay 10 regardless of location and taxes.</p>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_apply_base_tax_for_local_pickup",
-            "file": "Shipping/ShippingController.php",
-            "type": "filter",
-            "doc": {
-                "description": "",
-                "long_description": "",
-                "tags": [],
-                "long_description_html": ""
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_apply_individual_use_coupon",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filter coupons to remove when applying an individual use coupon.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.6.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of coupons to remove from the cart.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$coupons"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Coupon object applied to the cart.",
-                        "types": [
-                            "\\WC_Coupon"
-                        ],
-                        "variable": "$coupon"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of applied coupons already applied to the cart.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$applied_coupons"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_apply_with_individual_use_coupon",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters if a coupon can be applied alongside other individual use coupons.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.6.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Defaults to false.",
-                        "types": [
-                            "boolean"
-                        ],
-                        "variable": "$apply_with_individual_use_coupon"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Coupon object applied to the cart.",
-                        "types": [
-                            "\\WC_Coupon"
-                        ],
-                        "variable": "$coupon"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Individual use coupon already applied to the cart.",
-                        "types": [
-                            "\\WC_Coupon"
-                        ],
-                        "variable": "$individual_use_coupon"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of applied coupons already applied to the cart.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$applied_coupons"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "boolean"
-                        ]
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 4
-        },
-        {
-            "name": "woocommerce_blocks_hook_compatibility_additional_data",
-            "file": "Templates/AbstractTemplateCompatibility.php",
-            "type": "filter",
-            "doc": {
-                "description": "When extensions implement their equivalent blocks of the template hook functions, they can use this filter to register their old hooked data here, so in the blockified template, the old hooked functions can be removed in favor of the new blocks while keeping the old hooked functions working in classic templates.",
-                "long_description": "Accepts an array of hooked data. The array should be in the following format: [   [     hook => <hook-name>,     function => <function-name>,     priority => <priority>,  ],  ... ] Where: - hook-name is the name of the hook that have the functions hooked to. - function-name is the hooked function name. - priority is the priority of the hooked function.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "9.5.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Additional hooked data. Default to empty",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$data"
-                    }
-                ],
-                "long_description_html": "<p>Accepts an array of hooked data. The array should be in the following format: [ [ hook =&gt; <hook-name>, function =&gt; <function-name>, priority =&gt; <priority>, ], ... ] Where:</p> <ul> <li>hook-name is the name of the hook that have the functions hooked to.</li> <li>function-name is the hooked function name.</li> <li>priority is the priority of the hooked function.</li> </ul>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_blocks_product_grid_is_cacheable",
-            "file": "BlockTypes/AbstractProductGrid.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters whether or not the product grid is cacheable.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "param",
-                        "content": "The list of script dependencies.",
-                        "types": [
-                            "boolean"
-                        ],
-                        "variable": "$is_cacheable"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Query args for the products query passed to BlocksWpQuery.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$query_args"
-                    },
-                    {
-                        "name": "return",
-                        "content": "True to enable cache, false to disable cache.",
-                        "types": [
-                            "array"
-                        ]
-                    },
-                    {
-                        "name": "since",
-                        "content": "2.5.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_blocks_product_grid_item_html",
-            "file": "BlockTypes/AbstractProductGrid.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the HTML for products in the grid.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "param",
-                        "content": "Product grid item HTML.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$html"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Product data passed to the template.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$data"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Product object.",
-                        "types": [
-                            "\\WC_Product"
-                        ],
-                        "variable": "$product"
-                    },
-                    {
-                        "name": "return",
-                        "content": "Updated product grid item HTML.",
-                        "types": [
-                            "string"
-                        ]
-                    },
-                    {
-                        "name": "since",
-                        "content": "2.2.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_blocks_register_script_dependencies",
-            "file": "Assets/Api.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the list of script dependencies.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "3.0.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The list of script dependencies.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$dependencies"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The script's handle.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$handle"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_cart_contents_changed",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the entire cart contents when the cart changes.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "2.5.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Array of all cart items.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$cart_contents"
-                    },
-                    {
-                        "name": "return",
-                        "content": "Updated array of all cart items.",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_cart_item_permalink",
-            "file": "StoreApi/Schemas/V1/CartItemSchema.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filter the product permalink.",
-                "long_description": "This is a hook taken from the legacy cart/mini-cart templates that allows the permalink to be changed for a product. This is specific to the cart endpoint.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "9.9.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Product permalink.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$product_permalink"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Cart item array.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$cart_item"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Cart item key.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$cart_item_key"
-                    }
-                ],
-                "long_description_html": "<p>This is a hook taken from the legacy cart/mini-cart templates that allows the permalink to be changed for a product. This is specific to the cart endpoint.</p>"
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_disable_compatibility_layer",
-            "file": "Templates/AbstractTemplateCompatibility.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filter to disable the compatibility layer for the blockified templates.",
-                "long_description": "This hook allows to disable the compatibility layer for the blockified.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "TBD",
-                        "description": "TBD"
-                    },
-                    {
-                        "name": "param",
-                        "content": "",
-                        "types": [
-                            "\\Automattic\\WooCommerce\\Blocks\\Templates\\boolean."
-                        ],
-                        "variable": ""
-                    }
-                ],
-                "long_description_html": "<p>This hook allows to disable the compatibility layer for the blockified.</p>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_disable_compatibility_layer",
-            "file": "Templates/AbstractTemplateCompatibility.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filter to disable the compatibility layer for the blockified templates.",
-                "long_description": "This hook allows to disable the compatibility layer for the blockified templates.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "TBD",
-                        "description": "TBD"
-                    },
-                    {
-                        "name": "param",
-                        "content": "",
-                        "types": [
-                            "\\Automattic\\WooCommerce\\Blocks\\Templates\\boolean."
-                        ],
-                        "variable": ""
-                    }
-                ],
-                "long_description_html": "<p>This hook allows to disable the compatibility layer for the blockified templates.</p>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_ga_disable_tracking",
-            "file": "Domain/Services/GoogleAnalytics.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filter to disable Google Analytics tracking.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in GA extension."
-                    },
-                    {
-                        "name": "since",
-                        "content": "4.9.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "If true, tracking will be disabled.",
-                        "types": [
-                            "boolean"
-                        ],
-                        "variable": "$disable_tracking"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_get_item_data",
-            "file": "StoreApi/Schemas/V1/CartItemSchema.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters cart item data.",
-                "long_description": "Filters the variation option name for custom option slugs.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "4.3.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Cart item data. Empty by default.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$item_data"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Cart item array.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$cart_item"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>Filters the variation option name for custom option slugs.</p>"
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_loop_add_to_cart_args",
-            "file": "BlockTypes/ProductButton.php",
-            "type": "filter",
-            "doc": {
-                "description": "Allow filtering of the add to cart button arguments.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "9.7.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_loop_add_to_cart_link",
-            "file": "BlockTypes/ProductButton.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the add to cart button class.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "8.7.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The class.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$class"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_new_customer_data",
-            "file": "StoreApi/Routes/V1/Checkout.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters customer data before a customer account is registered.",
-                "long_description": "This hook filters customer data. It allows user data to be changed, for example, username, password, email, first name, last name, and role.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "An array of customer (user) data.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$customer_data"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>This hook filters customer data. It allows user data to be changed, for example, username, password, email, first name, last name, and role.</p>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_pay_order_product_has_enough_stock",
-            "file": "StoreApi/Utilities/OrderController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters whether or not the product has enough stock.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "param",
-                        "content": "True if has enough stock.",
-                        "types": [
-                            "boolean"
-                        ],
-                        "variable": ""
-                    },
-                    {
-                        "name": "param",
-                        "content": "Product.",
-                        "types": [
-                            "\\WC_Product"
-                        ],
-                        "variable": "$product"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Order.",
-                        "types": [
-                            "\\WC_Order"
-                        ],
-                        "variable": "$order"
-                    },
-                    {
-                        "name": "since",
-                        "content": "9.8.0-dev"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_pay_order_product_in_stock",
-            "file": "StoreApi/Utilities/OrderController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters whether or not the product is in stock for this pay for order.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "param",
-                        "content": "True if in stock.",
-                        "types": [
-                            "boolean"
-                        ],
-                        "variable": ""
-                    },
-                    {
-                        "name": "param",
-                        "content": "Product.",
-                        "types": [
-                            "\\WC_Product"
-                        ],
-                        "variable": "$product"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Order.",
-                        "types": [
-                            "\\WC_Order"
-                        ],
-                        "variable": "$order"
-                    },
-                    {
-                        "name": "since",
-                        "content": "9.8.0-dev"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_registration_errors",
-            "file": "StoreApi/Routes/V1/Checkout.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters registration errors before a customer account is registered.",
-                "long_description": "This hook filters registration errors. This can be used to manipulate the array of errors before they are displayed.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "7.2.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Error object.",
-                        "types": [
-                            "\\WP_Error"
-                        ],
-                        "variable": "$errors"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Customer username.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$username"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Customer email address.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$user_email"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "\\WP_Error"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>This hook filters registration errors. This can be used to manipulate the array of errors before they are displayed.</p>"
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_shared_settings",
-            "file": "Assets/AssetDataRegistry.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the array of shared settings.",
-                "long_description": "Low level hook for registration of new data late in the cycle. This is deprecated. Instead, use the data api:\n ```php Automattic\\WooCommerce\\Blocks\\Package::container()->get( Automattic\\WooCommerce\\Blocks\\Assets\\AssetDataRegistry::class )->add( $key, $value ) ```",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "5.0.0"
-                    },
-                    {
-                        "name": "deprecated",
-                        "content": ""
-                    },
-                    {
-                        "name": "param",
-                        "content": "Settings data.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$data"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>Low level hook for registration of new data late in the cycle. This is deprecated. Instead, use the data api:</p> <pre><code class=\"language-php\">Automattic\\WooCommerce\\Blocks\\Package::container()-&gt;get( Automattic\\WooCommerce\\Blocks\\Assets\\AssetDataRegistry::class )-&gt;add( $key, $value )</code></pre>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_shipping_package_name",
-            "file": "StoreApi/Utilities/CartController.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the shipping package name.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "4.3.0"
-                    },
-                    {
-                        "name": "internal",
-                        "content": "Matches filter name in WooCommerce core."
-                    },
-                    {
-                        "name": "param",
-                        "content": "Shipping package name.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$shipping_package_name"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Shipping package ID.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$package_id"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Shipping package from WooCommerce.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$package"
-                    },
-                    {
-                        "name": "return",
-                        "content": "Shipping package name.",
-                        "types": [
-                            "string"
-                        ]
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_shipping_{$this->id}_is_available",
-            "file": "Shipping/PickupLocation.php",
-            "type": "filter",
-            "doc": {
-                "description": "",
-                "long_description": "",
-                "tags": [],
-                "long_description_html": ""
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_show_page_title",
-            "file": "BlockTypes/ClassicTemplate.php",
-            "type": "filter",
-            "doc": {
-                "description": "Hook: woocommerce_show_page_title",
-                "long_description": "Allows controlling the display of the page title.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "6.3.0"
-                    }
-                ],
-                "long_description_html": "<p>Allows controlling the display of the page title.</p>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_single_product_image_thumbnail_html",
-            "file": "BlockTypes/ProductGalleryThumbnails.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filter the HTML markup for a single product image thumbnail in the gallery.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "param",
-                        "content": "The HTML markup for the thumbnail.",
-                        "types": [
-                            "string"
-                        ],
-                        "variable": "$thumbnail_html"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The attachment ID of the thumbnail.",
-                        "types": [
-                            "int"
-                        ],
-                        "variable": "$attachment_id"
-                    },
-                    {
-                        "name": "since",
-                        "content": "7.9.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_store_api_add_to_cart_data",
-            "file": "StoreApi/Routes/V1/CartAddItem.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters cart item data sent via the API before it is passed to the cart controller.",
-                "long_description": "This hook filters cart items. It allows the request data to be changed, for example, quantity, or supplemental cart item data, before it is passed into CartController::add_to_cart and stored to session.\n CartController::add_to_cart only expects the keys id, quantity, variation, and cart_item_data, so other values may be ignored. CartController::add_to_cart (and core) do already have a filter hook called woocommerce_add_cart_item, but this does not have access to the original Store API request like this hook does.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "8.8.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "An array of customer (user) data.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$customer_data"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "array"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>This hook filters cart items. It allows the request data to be changed, for example, quantity, or supplemental cart item data, before it is passed into CartController::add_to_cart and stored to session.</p> <p>CartController::add_to_cart only expects the keys id, quantity, variation, and cart_item_data, so other values may be ignored. CartController::add_to_cart (and core) do already have a filter hook called woocommerce_add_cart_item, but this does not have access to the original Store API request like this hook does.</p>"
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_store_api_disable_nonce_check",
-            "file": "StoreApi/Routes/V1/AbstractCartRoute.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the Store API nonce check.",
-                "long_description": "This can be used to disable the nonce check when testing API endpoints via a REST API client.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "4.5.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "If true, nonce checks will be disabled.",
-                        "types": [
-                            "boolean"
-                        ],
-                        "variable": "$disable_nonce_check"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "boolean"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>This can be used to disable the nonce check when testing API endpoints via a REST API client.</p>"
-            },
-            "args": 1
-        },
-        {
-            "name": "woocommerce_store_api_product_quantity_limit",
-            "file": "StoreApi/Utilities/QuantityLimits.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the quantity limit for a product being added to the cart via the Store API.",
-                "long_description": "Filters the variation option name for custom option slugs.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "6.8.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Quantity limit which defaults to 9999 unless sold individually.",
-                        "types": [
-                            "integer"
-                        ],
-                        "variable": "$quantity_limit"
-                    },
-                    {
-                        "name": "param",
-                        "content": "Product instance.",
-                        "types": [
-                            "\\WC_Product"
-                        ],
-                        "variable": "$product"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "integer"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>Filters the variation option name for custom option slugs.</p>"
-            },
-            "args": 2
-        },
-        {
-            "name": "woocommerce_store_api_product_quantity_{$value_type}",
-            "file": "StoreApi/Utilities/QuantityLimits.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters the quantity minimum for a cart item in Store API. This allows extensions to control the minimum qty of items already within the cart.",
-                "long_description": "The suffix of the hook will vary depending on the value being filtered. For example, minimum, maximum, multiple_of, editable.",
-                "tags": [
-                    {
-                        "name": "since",
-                        "content": "6.8.0"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The value being filtered.",
-                        "types": [
-                            "mixed"
-                        ],
-                        "variable": "$value"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The product object.",
-                        "types": [
-                            "\\WC_Product"
-                        ],
-                        "variable": "$product"
-                    },
-                    {
-                        "name": "param",
-                        "content": "The cart item if the product exists in the cart, or null.",
-                        "types": [
-                            "array",
-                            "null"
-                        ],
-                        "variable": "$cart_item"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "mixed"
-                        ]
-                    }
-                ],
-                "long_description_html": "<p>The suffix of the hook will vary depending on the value being filtered. For example, minimum, maximum, multiple_of, editable.</p>"
-            },
-            "args": 3
-        },
-        {
-            "name": "woocommerce_store_api_rate_limit_options",
-            "file": "StoreApi/Utilities/RateLimits.php",
-            "type": "filter",
-            "doc": {
-                "description": "Filters options for Rate Limits.",
-                "long_description": "",
-                "tags": [
-                    {
-                        "name": "param",
-                        "content": "Array of option values.",
-                        "types": [
-                            "array"
-                        ],
-                        "variable": "$rate_limit_options"
-                    },
-                    {
-                        "name": "return",
-                        "content": "",
-                        "types": [
-                            "array"
-                        ]
-                    },
-                    {
-                        "name": "since",
-                        "content": "8.9.0"
-                    }
-                ],
-                "long_description_html": ""
-            },
-            "args": 1
-        }
-    ]
-}
\ No newline at end of file
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/filters/index.js b/plugins/woocommerce/client/blocks/bin/hook-docs/filters/index.js
index 2d114ad10d3..296f603727a 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/filters/index.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/filters/index.js
@@ -45,7 +45,7 @@ const generate = ( hooks ) => {
 				...generateHookName( hook ),
 				...generateIntroduction( hook ),
 				...contentWithHeading(
-					hook.doc.long_description_html,
+					hook.doc.long_description,
 					'Description'
 				),
 				...sectionWithHeading( params( hookDocs ), 'Parameters' ),
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/example.js b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/example.js
index bdb05a0f067..83ad1e111ca 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/example.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/example.js
@@ -2,20 +2,43 @@
  * External dependencies
  */
 const fs = require( 'fs' );
+const path = require( 'path' );

 const example = ( hookDoc ) => {
 	const tags = hookDoc.tags || [];
 	const exampleDoc =
 		tags.filter( ( { name: tagName } ) => tagName === 'example' )[ 0 ] ||
 		undefined;
-	const exampleSource = exampleDoc ? exampleDoc.content : false;
+	if ( ! exampleDoc || ! exampleDoc.content ) {
+		return null;
+	}

-	if ( ! exampleSource ) {
+	// The @example content is the path of a Markdown file under
+	// docs/examples. Anything else (a missing file, a directory, or a path
+	// resolving outside the examples dir) is skipped with a warning instead
+	// of aborting the docs build with the generated files already deleted by
+	// prebuild:docs.
+	let exampleContent;
+	try {
+		const examplesRoot = fs.realpathSync( 'docs/examples' ) + path.sep;
+		const resolvedSource = fs.realpathSync( exampleDoc.content );
+		if ( ! resolvedSource.startsWith( examplesRoot ) ) {
+			throw new Error( 'path is outside docs/examples' );
+		}
+		exampleContent = fs.readFileSync( resolvedSource, 'utf8' );
+	} catch {
+		// eslint-disable-next-line no-console
+		console.warn(
+			`Skipping @example "${ exampleDoc.content }": not a readable file under docs/examples.`
+		);
 		return null;
 	}

-	const buffer = fs.readFileSync( `${ exampleSource }` );
-	const exampleContent = buffer.toString();
+	// Demote the example doc's title so it nests under the "Example" section
+	// instead of showing up as a sibling of the per-hook headings.
+	if ( exampleContent.startsWith( '# ' ) ) {
+		exampleContent = `#### ${ exampleContent.slice( 2 ) }`;
+	}

 	return exampleContent
 		? {
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/files.js b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/files.js
index 8a4825c2549..7b5c8a1c450 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/files.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/files.js
@@ -1,8 +1,11 @@
+// The prefix pairs with `--input=../../src` in package.json's build:docs: file
+// paths are relative to plugins/woocommerce/src, links live in
+// docs/third-party-developers/extensibility/hooks/. Keep the two in sync.
 const files = ( sources ) => {
 	return sources && sources.length
 		? {
 				ul: sources.map( ( file ) => {
-					return `[${ file }](../../../../src/${ file })`;
+					return `[${ file }](../../../../../../src/${ file })`;
 				} ),
 		  }
 		: null;
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/params.js b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/params.js
index 16f66959527..5e65620c0b5 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/params.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/params.js
@@ -1,3 +1,7 @@
+// json2md only escapes the first unescaped pipe per cell; escape them all so
+// values like `shipping|billing|other` don't add phantom table columns.
+const cell = ( text ) => String( text ).replace( /\|/g, '\\|' );
+
 const params = ( hookDoc ) => {
 	const tags = hookDoc.tags || [];
 	const paramDocs =
@@ -10,9 +14,9 @@ const params = ( hookDoc ) => {
 					rows: [
 						...paramDocs.map(
 							( { variable, types, content }, index ) => [
-								variable ? variable : index + 1,
-								types.join( ', ' ),
-								content,
+								variable ? cell( variable ) : index + 1,
+								cell( types.join( ', ' ) ),
+								cell( content ),
 							]
 						),
 					],
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/related.js b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/related.js
index 42924db1391..b45093fcd85 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/related.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/related.js
@@ -1,12 +1,20 @@
+// Angle-bracket autolinks, so markdownlint (MD034) doesn't flag bare URLs.
+const linkify = ( text ) =>
+	/^https?:\/\//.test( text ) ? `<${ text }>` : text;
+
 const related = ( hookDoc ) => {
 	const tags = hookDoc.tags || [];
-	const seeDocs =
-		tags.filter( ( { name: tagName } ) => tagName === 'see' ) || [];
+	// A malformed @see comes through as a `see` tag without `refers`;
+	// skip those so the docs don't render a literal "undefined".
+	const seeDocs = tags.filter(
+		( { name: tagName, refers } ) => tagName === 'see' && refers
+	);

 	return seeDocs && seeDocs.length
 		? {
 				ul: seeDocs.map( ( { refers, content = '' } ) => {
-					return content ? refers + ' - ' + content : refers;
+					const reference = linkify( refers );
+					return content ? reference + ' - ' + content : reference;
 				} ),
 		  }
 		: null;
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/returns.js b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/returns.js
index 23ca518e746..9994b523d1c 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/returns.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/format-hook-doc/returns.js
@@ -8,7 +8,7 @@ const returns = ( hookDoc ) => {
 		? {
 				p: `\`${ returnDoc.types.join( ', ' ) }\` ${
 					returnDoc.content
-				}`,
+				}`.trim(),
 		  }
 		: null;
 };
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/index.js b/plugins/woocommerce/client/blocks/bin/hook-docs/index.js
index 77ef46e31f7..840b1fd9815 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/index.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/index.js
@@ -3,9 +3,59 @@
 /* eslint no-console: 0 */
 const chalk = require( 'chalk' );

+// Dynamic hook names come out of the generator as the raw PHP expression, e.g.
+// `'woocommerce_' . $product_type . '_add_to_cart'`. Render them in the
+// interpolated style used by WordPress hook docs: `woocommerce_{$product_type}_add_to_cart`.
+// Assumes the generator's spacing (` . ` with surrounding spaces); other
+// concatenation styles pass through unnormalized.
+const normalizeHookName = ( name ) => {
+	if ( ! name.includes( ' . ' ) ) {
+		return name.startsWith( '$' ) ? `{${ name }}` : name;
+	}
+
+	return name
+		.split( ' . ' )
+		.map( ( part ) => {
+			const trimmed = part.trim();
+			return trimmed.startsWith( '$' )
+				? `{${ trimmed }}`
+				: trimmed.replace( /^['"]|['"]$/g, '' );
+		} )
+		.join( '' );
+};
+
+const skipHook = ( name ) => {
+	// A name that is nothing but a variable (e.g. `{$hook}`) documents no real,
+	// attachable hook — the value is only known at runtime.
+	if ( /^\{\$[^}]+\}$/.test( name ) ) {
+		return true;
+	}
+
+	// `internal_`-prefixed hooks are explicitly not a third-party contract.
+	return name.startsWith( 'internal_' );
+};
+
 const groupByHook = ( hooks, hook ) => {
+	hook = { ...hook, name: normalizeHookName( hook.name ) };
+
+	if ( skipHook( hook.name ) ) {
+		return hooks;
+	}
+
+	// The docs scan is scoped by the ignore list in composer.json; a hook from
+	// anywhere else means a new plugins/woocommerce/src directory leaked in.
+	if (
+		! hook.file.startsWith( 'Blocks/' ) &&
+		! hook.file.startsWith( 'StoreApi/' )
+	) {
+		throw new Error(
+			`Hook "${ hook.name }" comes from "${ hook.file }", outside src/Blocks and src/StoreApi. ` +
+				'Add the directory to extra.wp-hooks.ignore-files in client/blocks/composer.json and regenerate.'
+		);
+	}
+
 	if ( hooks[ hook.name ] !== undefined ) {
-		if ( hooks[ hook.name ].file !== hook.file ) {
+		if ( ! hooks[ hook.name ].file.includes( hook.file ) ) {
 			hooks[ hook.name ].file.push( hook.file );
 		}
 		return hooks; // skip or return updated record.
@@ -32,8 +82,16 @@ try {
 	const actions = rawActions.reduce( groupByHook, {} );
 	const filters = rawFilters.reduce( groupByHook, {} );

-	generateActionDocs( Object.values( actions ) );
-	generateFilterDocs( Object.values( filters ) );
+	// Re-sort, since normalizing dynamic hook names can change their sort position.
+	// Byte order, matching the generator's strcmp sort (localeCompare would
+	// weigh `_` differently and reshuffle the `__experimental_*` entries).
+	const byName = ( a, b ) =>
+		a.name < b.name ? -1 : Number( a.name > b.name );
+
+	generateActionDocs( Object.values( actions ).sort( byName ) );
+	generateFilterDocs( Object.values( filters ).sort( byName ) );
 } catch ( error ) {
-	console.log( chalk.red( error.message ) );
+	// Full error on stderr, so CI logs get the stack trace.
+	console.error( error );
+	process.exitCode = 1;
 }
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/content-with-heading.js b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/content-with-heading.js
index c70f3f9c8e6..f5a13baaa0d 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/content-with-heading.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/content-with-heading.js
@@ -1,6 +1,14 @@
+/**
+ * Internal dependencies
+ */
+const { docblockToMarkdown } = require( './docblock-to-markdown' );
+
 const contentWithHeading = ( content, heading, headingLevel = 'h3' ) => {
 	return content && content.length
-		? [ { [ headingLevel ]: heading }, { html: content } ]
+		? [
+				{ [ headingLevel ]: heading },
+				{ html: docblockToMarkdown( content ) },
+		  ]
 		: [];
 };

diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/create-docs.js b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/create-docs.js
index 0da64d18319..a53283eb018 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/create-docs.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/create-docs.js
@@ -15,11 +15,8 @@ const { json2md } = require( './json2md' );
 const createDocs = ( file, jsonDocs ) => {
 	console.log( chalk.blue( `Creating file ${ file }...` ) );

-	fs.writeFile( file, json2md( jsonDocs ), function ( error ) {
-		if ( error ) {
-			throw error;
-		}
-	} );
+	// Synchronous, so a write failure surfaces inside the caller's try/catch.
+	fs.writeFileSync( file, json2md( jsonDocs ) );
 };

 module.exports = { createDocs };
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/docblock-to-markdown.js b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/docblock-to-markdown.js
new file mode 100644
index 00000000000..05d3b98cb8f
--- /dev/null
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/docblock-to-markdown.js
@@ -0,0 +1,88 @@
+'use strict';
+
+/**
+ * Normalize raw docblock Markdown for the generated docs.
+ *
+ * Docblock prose is soft-wrapped to fit the comment width, so consecutive
+ * plain-text lines are joined into single-line paragraphs. List items keep
+ * their own lines, with a blank line inserted between a paragraph and the
+ * list that follows it (CommonMark needs it for reliable list parsing, and
+ * markdownlint's MD032 requires it). Fenced code blocks pass through
+ * untouched. Nested list indentation is not preserved — the same flat-list
+ * limitation as json2md.
+ */
+
+const isListItem = ( line ) => /^([-*+]|\d+[.)])\s/.test( line );
+
+const getFenceMarker = ( line ) => {
+	const match = line.match( /^(`{3,}|~{3,})/ );
+	return match ? match[ 1 ] : null;
+};
+
+const docblockToMarkdown = ( text ) => {
+	if ( ! text ) {
+		return text;
+	}
+
+	const out = [];
+	// Whether the last emitted line is prose that a soft-wrapped
+	// continuation line should be joined onto.
+	let joinable = false;
+	// The delimiter run that opened the current code fence, if any.
+	let openFence = null;
+
+	for ( const rawLine of String( text ).split( '\n' ) ) {
+		const line = rawLine.trimEnd();
+		const trimmed = line.trim();
+
+		if ( openFence ) {
+			// Per CommonMark, only a bare marker of the same character
+			// with at least the opening length closes the fence; any
+			// other line is code-block content.
+			const closeMarker = getFenceMarker( trimmed );
+			if (
+				closeMarker === trimmed &&
+				closeMarker[ 0 ] === openFence[ 0 ] &&
+				closeMarker.length >= openFence.length
+			) {
+				openFence = null;
+				out.push( trimmed );
+				joinable = false;
+			} else {
+				out.push( line );
+			}
+			continue;
+		}
+		const fenceMarker = getFenceMarker( trimmed );
+		if ( fenceMarker ) {
+			openFence = fenceMarker;
+			out.push( trimmed );
+			joinable = false;
+			continue;
+		}
+		if ( ! trimmed ) {
+			if ( out.length && out[ out.length - 1 ] !== '' ) {
+				out.push( '' );
+			}
+			joinable = false;
+			continue;
+		}
+		if ( isListItem( trimmed ) ) {
+			const prev = out.length ? out[ out.length - 1 ] : '';
+			if ( prev && ! isListItem( prev ) ) {
+				out.push( '' );
+			}
+			out.push( trimmed );
+			joinable = true;
+		} else if ( joinable ) {
+			out[ out.length - 1 ] += ` ${ trimmed }`;
+		} else {
+			out.push( trimmed );
+			joinable = true;
+		}
+	}
+
+	return out.join( '\n' ).trim();
+};
+
+module.exports = { docblockToMarkdown };
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-hook-name.js b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-hook-name.js
index 1a23267dec0..97eb0dbb16c 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-hook-name.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-hook-name.js
@@ -6,9 +6,16 @@ const generateHookName = ( hook ) => {
 		( { name: tagName } ) => tagName === 'deprecated'
 	);

+	// Dynamic names like `__experimental_woocommerce_{$product_type}_…` go in a
+	// code span: otherwise CommonMark reads some of the underscores next to the
+	// braces as emphasis, which garbles the rendered heading and its anchor.
+	const displayName = hookName.includes( '{$' )
+		? `\`${ hookName }\``
+		: hookName;
+
 	return [
 		{
-			h2: isDeprecated ? `~~${ hookName }~~` : `${ hookName }`,
+			h2: isDeprecated ? `~~${ displayName }~~` : `${ displayName }`,
 		},
 	];
 };
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-introduction.js b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-introduction.js
index 6559ca666e2..45574fa4681 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-introduction.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-introduction.js
@@ -47,22 +47,23 @@ const generateIntroduction = ( hook ) => {
 				content: `${ hookFunction }( '${ hookName }'${ formattedHookParams } )`,
 			},
 		},
+		// Bold the label only — a fully-emphasized paragraph trips markdownlint's MD036.
 		deprecated
 			? {
-					p: `**Deprecated: ${
+					p: `**Deprecated:** ${
 						deprecated.content
 							? deprecated.content
 							: 'This hook is deprecated and will be removed'
-					}**`,
+					}`,
 			  }
 			: null,
 		internal
 			? {
-					p: `**Note: ${
+					p: `**Note:** ${
 						internal.content
 							? internal.content
 							: 'This hook is for internal use only'
-					}**`,
+					}`,
 			  }
 			: null,
 	];
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-toc.js b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-toc.js
index ae96ff12a85..807a95f820c 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-toc.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/generate-toc.js
@@ -24,14 +24,17 @@ const generateToc = ( hooks ) => {
 					.replace( /\-+$/, '' );
 				if ( usedHeaders.indexOf( anchor ) !== -1 ) {
 					let i = 1;
-					while (
-						usedHeaders.indexOf( anchor + '-' + i ) !== -1 &&
-						i++ <= 10
-					);
+					while ( usedHeaders.indexOf( anchor + '-' + i ) !== -1 ) {
+						i++;
+					}
 					anchor = anchor + '-' + i;
 				}
 				usedHeaders.push( anchor );
-				return `[${ hook.name }](#${ anchor })`;
+				// Match generate-hook-name: dynamic names render as code spans.
+				const displayName = hookName.includes( '{$' )
+					? `\`${ hookName }\``
+					: hookName;
+				return `[${ displayName }](#${ anchor })`;
 			} ),
 		},
 	];
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/json2md.js b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/json2md.js
index c169aa4579c..53e8eeb07ec 100644
--- a/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/json2md.js
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/utilities/json2md.js
@@ -9,4 +9,10 @@ json2md.converters.html = function ( input ) {
 	return input;
 };

+// json2md's stock `ul` converter indents items with a leading space, which
+// markdownlint (MD007, indent 0 at top level) rejects. Emit flat lists instead.
+json2md.converters.ul = function ( input ) {
+	return input.map( ( item ) => `- ${ item }` ).join( '\n' );
+};
+
 module.exports = { json2md };
diff --git a/plugins/woocommerce/client/blocks/bin/hook-docs/wp-hooks-generator.patch b/plugins/woocommerce/client/blocks/bin/hook-docs/wp-hooks-generator.patch
new file mode 100644
index 00000000000..6d40a16edb1
--- /dev/null
+++ b/plugins/woocommerce/client/blocks/bin/hook-docs/wp-hooks-generator.patch
@@ -0,0 +1,92 @@
+--- a/src/generate.php
++++ b/src/generate.php
+@@ -340,10 +340,7 @@
+ 					$description = preg_replace( '/[\n\r]+/', ' ', strval( $tag->getDescription() ) );
+
+ 					if ( ! empty( $description ) ) {
+-						$markdown = \Parsedown::instance();
+-						$html = $markdown->text( $description );
+-						$html = preg_replace( '/^<p>(.*)<\/p>$/', '$1', $html );
+-						$tag_data['description'] = $html;
++						$tag_data['description'] = $description;
+ 					}
+ 				} elseif ( $tag instanceof \phpDocumentor\Reflection\DocBlock\Tags\Deprecated ) {
+ 					$tag_data['content'] = (string) $tag;
+@@ -355,11 +352,6 @@
+ 						$tag_data['types'] = [ (string) $type ];
+ 					}
+ 					$tag_data['variable'] = '$' . $tag->getVariableName();
+-
+-					$markdown = \Parsedown::instance();
+-					$html = $markdown->text( $tag_data['content'] );
+-					$html = preg_replace( '/^<p>(.*)<\/p>$/', '$1', $html );
+-					$tag_data['content'] = $html;
+ 				} elseif ( $tag instanceof \phpDocumentor\Reflection\DocBlock\Tags\Link ) {
+ 					$link = $tag->getLink();
+ 					$tag_data['content'] = sprintf(
+@@ -372,26 +364,22 @@
+ 					//
+ 				} elseif ( $tag instanceof \phpDocumentor\Reflection\DocBlock\Tags\See ) {
+ 					$tag_data['refers'] = ltrim( (string) $tag->getReference(), '\\' );
+-					$markdown = \Parsedown::instance();
+-					$html = $markdown->text( $tag_data['content'] );
+-					$html = preg_replace( '/^<p>(.*)<\/p>$/', '$1', $html );
+-					$tag_data['content'] = $html;
+ 				} elseif ( $tag instanceof \phpDocumentor\Reflection\DocBlock\Tags\InvalidTag && $tag->getName() === 'see' ) {
+ 					//
+-				} elseif ( $tag instanceof \phpDocumentor\Reflection\DocBlock\Tags\Return_ ) {
++				} elseif ( $tag instanceof \phpDocumentor\Reflection\DocBlock\Tags\Return_ || $tag instanceof \phpDocumentor\Reflection\DocBlock\Tags\Throws ) {
++					$type = $tag->getType();
++					if ( $type instanceof \phpDocumentor\Reflection\Types\Compound ) {
++						$tag_data['types'] = array_map( 'strval', iterator_to_array( $type ) );
++					} else {
++						$tag_data['types'] = [ (string) $type ];
++					}
++				} else {
+ 					printf(
+-						'Hook "%s" contains a `@return` tag, which is not supported.' . "\n",
++						'Warning: unknown tag type "%s" (@%s) for hook "%s" in file "%s".' . "\n",
++						get_class( $tag ),
++						$tag->getName(),
+ 						$hook_name,
+-					);
+-				} else {
+-					throw new \Exception(
+-						sprintf(
+-							'Unknown tag type "%s" (@%s) for hook "%s" in file "%s".',
+-							get_class( $tag ),
+-							$tag->getName(),
+-							$hook_name,
+-							$filename,
+-						)
++						$filename,
+ 					);
+ 				}
+
+@@ -401,24 +389,11 @@
+ 			$markdown = \Parsedown::instance();
+ 			$html = $markdown->text((string) $db->getDescription());
+ 			$html = str_replace( "\n", ' ', $html );
+-			$long = fix_newlines( (string) $db->getDescription() );
+-			$long = str_replace(
+-				'  - ',
+-				"\n  - ",
+-				$long
+-			);
+-			$long = preg_replace_callback(
+-				'# ([1-9])\. #',
+-				static function( array $matches ) : string {
+-					return "\n {$matches[1]}. ";
+-				},
+-				$long
+-			);
+ 			$doc = [
+ 				'description' => str_replace( "\n", ' ', $summary ),
+-				'long_description' => $long,
++				'long_description' => (string) $db->getDescription(),
+ 				'tags' => $tags,
+-				'long_description_html' => $html,
++				'long_description_html' => '',
+ 			];
+ 			$out = [];
+
diff --git a/plugins/woocommerce/client/blocks/composer.json b/plugins/woocommerce/client/blocks/composer.json
new file mode 100644
index 00000000000..cfdf5815224
--- /dev/null
+++ b/plugins/woocommerce/client/blocks/composer.json
@@ -0,0 +1,50 @@
+{
+	"name": "woocommerce/block-library",
+	"description": "Dev tooling for WooCommerce Blocks. Only used to run `pnpm build:docs`, which regenerates the hook docs from the PHP sources in plugins/woocommerce/src.",
+	"license": "GPL-3.0-or-later",
+	"prefer-stable": true,
+	"minimum-stability": "dev",
+	"require-dev": {
+		"wp-hooks/generator": "1.0.2",
+		"cweagans/composer-patches": "^1.7"
+	},
+	"config": {
+		"allow-plugins": {
+			"cweagans/composer-patches": true
+		},
+		"platform": {
+			"php": "8.3.0"
+		},
+		"platform-check": false
+	},
+	"extra": {
+		"composer-exit-on-patch-failure": true,
+		"patches": {
+			"wp-hooks/generator": {
+				"Keep @return/@throws tag types, warn instead of fatal on unknown hook doc tags, and emit raw docblock Markdown instead of Parsedown HTML": "bin/hook-docs/wp-hooks-generator.patch"
+			}
+		},
+		"wp-hooks": {
+			"ignore-files": [
+				"src/Abilities/",
+				"src/Admin/",
+				"src/Api/",
+				"src/Autoloader.php",
+				"src/Caches/",
+				"src/Caching/",
+				"src/Checkout/",
+				"src/Container.php",
+				"src/Database/",
+				"src/Deprecated.php",
+				"src/Enums/",
+				"src/Gateways/",
+				"src/Internal/",
+				"src/LayoutTemplates/",
+				"src/Packages.php",
+				"src/Proxies/",
+				"src/Utilities/",
+				"src/Vendor/"
+			]
+		}
+	}
+}
diff --git a/plugins/woocommerce/client/blocks/composer.lock b/plugins/woocommerce/client/blocks/composer.lock
new file mode 100644
index 00000000000..695b2c6b0d6
--- /dev/null
+++ b/plugins/woocommerce/client/blocks/composer.lock
@@ -0,0 +1,561 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "3a6027aaf32af0d0fa9a1fed39cebdcd",
+    "packages": [],
+    "packages-dev": [
+        {
+            "name": "cweagans/composer-patches",
+            "version": "1.7.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/cweagans/composer-patches.git",
+                "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/cweagans/composer-patches/zipball/e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
+                "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.0 || ^2.0",
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "composer/composer": "~1.0 || ~2.0",
+                "phpunit/phpunit": "~4.6"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "cweagans\\Composer\\Patches"
+            },
+            "autoload": {
+                "psr-4": {
+                    "cweagans\\Composer\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Cameron Eagans",
+                    "email": "me@cweagans.net"
+                }
+            ],
+            "description": "Provides a way to patch Composer packages.",
+            "support": {
+                "issues": "https://github.com/cweagans/composer-patches/issues",
+                "source": "https://github.com/cweagans/composer-patches/tree/1.7.3"
+            },
+            "time": "2022-12-20T22:53:13+00:00"
+        },
+        {
+            "name": "doctrine/deprecations",
+            "version": "1.1.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/deprecations.git",
+                "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",
+                "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<=7.5 || >=14"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^9 || ^12 || ^14",
+                "phpstan/phpstan": "1.4.10 || 2.1.30",
+                "phpstan/phpstan-phpunit": "^1.0 || ^2",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0",
+                "psr/log": "^1 || ^2 || ^3"
+            },
+            "suggest": {
+                "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Deprecations\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+            "homepage": "https://www.doctrine-project.org/",
+            "support": {
+                "issues": "https://github.com/doctrine/deprecations/issues",
+                "source": "https://github.com/doctrine/deprecations/tree/1.1.6"
+            },
+            "time": "2026-02-07T07:09:04+00:00"
+        },
+        {
+            "name": "erusev/parsedown",
+            "version": "1.8.0-beta-7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/erusev/parsedown.git",
+                "reference": "fe7a50eceb4a3c867cc9fa9c0aa906b1067d1955"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/erusev/parsedown/zipball/fe7a50eceb4a3c867cc9fa9c0aa906b1067d1955",
+                "reference": "fe7a50eceb4a3c867cc9fa9c0aa906b1067d1955",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Parsedown": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Emanuil Rusev",
+                    "email": "hello@erusev.com",
+                    "homepage": "http://erusev.com"
+                }
+            ],
+            "description": "Parser for Markdown.",
+            "homepage": "http://parsedown.org",
+            "keywords": [
+                "markdown",
+                "parser"
+            ],
+            "support": {
+                "issues": "https://github.com/erusev/parsedown/issues",
+                "source": "https://github.com/erusev/parsedown/tree/1.8.0-beta-7"
+            },
+            "time": "2019-03-17T18:47:21+00:00"
+        },
+        {
+            "name": "nikic/php-parser",
+            "version": "v5.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/PHP-Parser.git",
+                "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b",
+                "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-json": "*",
+                "ext-tokenizer": "*",
+                "php": ">=7.4"
+            },
+            "require-dev": {
+                "ircmaxell/php-yacc": "^0.0.7",
+                "phpunit/phpunit": "^9.0"
+            },
+            "bin": [
+                "bin/php-parse"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpParser\\": "lib/PhpParser"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Nikita Popov"
+                }
+            ],
+            "description": "A PHP parser written in PHP",
+            "keywords": [
+                "parser",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/nikic/PHP-Parser/issues",
+                "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1"
+            },
+            "time": "2024-10-08T18:51:32+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-common",
+            "version": "2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+                "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+                "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-2.x": "2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jaap van Otterdijk",
+                    "email": "opensource@ijaap.nl"
+                }
+            ],
+            "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+            "homepage": "http://www.phpdoc.org",
+            "keywords": [
+                "FQSEN",
+                "phpDocumentor",
+                "phpdoc",
+                "reflection",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+                "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+            },
+            "time": "2020-06-27T09:03:43+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-docblock",
+            "version": "5.5.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+                "reference": "0c70d2c566e899666f367ab7b80986beb3581e6f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/0c70d2c566e899666f367ab7b80986beb3581e6f",
+                "reference": "0c70d2c566e899666f367ab7b80986beb3581e6f",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/deprecations": "^1.1",
+                "ext-filter": "*",
+                "php": "^7.4 || ^8.0",
+                "phpdocumentor/reflection-common": "^2.2",
+                "phpdocumentor/type-resolver": "^1.7",
+                "phpstan/phpdoc-parser": "^1.7",
+                "webmozart/assert": "^1.9.1"
+            },
+            "require-dev": {
+                "mockery/mockery": "~1.3.5 || ~1.6.0",
+                "phpstan/extension-installer": "^1.1",
+                "phpstan/phpstan": "^1.8",
+                "phpstan/phpstan-mockery": "^1.1",
+                "phpstan/phpstan-webmozart-assert": "^1.2",
+                "phpunit/phpunit": "^9.5",
+                "psalm/phar": "^5.26"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "me@mikevanriel.com"
+                },
+                {
+                    "name": "Jaap van Otterdijk",
+                    "email": "opensource@ijaap.nl"
+                }
+            ],
+            "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+            "support": {
+                "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+                "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.5.1"
+            },
+            "time": "2024-11-06T11:58:54+00:00"
+        },
+        {
+            "name": "phpdocumentor/type-resolver",
+            "version": "1.12.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/TypeResolver.git",
+                "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195",
+                "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/deprecations": "^1.0",
+                "php": "^7.3 || ^8.0",
+                "phpdocumentor/reflection-common": "^2.0",
+                "phpstan/phpdoc-parser": "^1.18|^2.0"
+            },
+            "require-dev": {
+                "ext-tokenizer": "*",
+                "phpbench/phpbench": "^1.2",
+                "phpstan/extension-installer": "^1.1",
+                "phpstan/phpstan": "^1.8",
+                "phpstan/phpstan-phpunit": "^1.1",
+                "phpunit/phpunit": "^9.5",
+                "rector/rector": "^0.13.9",
+                "vimeo/psalm": "^4.25"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-1.x": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "me@mikevanriel.com"
+                }
+            ],
+            "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+            "support": {
+                "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+                "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0"
+            },
+            "time": "2025-11-21T15:09:14+00:00"
+        },
+        {
+            "name": "phpstan/phpdoc-parser",
+            "version": "1.33.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpdoc-parser.git",
+                "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140",
+                "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/annotations": "^2.0",
+                "nikic/php-parser": "^4.15",
+                "php-parallel-lint/php-parallel-lint": "^1.2",
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^1.5",
+                "phpstan/phpstan-phpunit": "^1.1",
+                "phpstan/phpstan-strict-rules": "^1.0",
+                "phpunit/phpunit": "^9.5",
+                "symfony/process": "^5.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\PhpDocParser\\": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "PHPDoc parser with support for nullable, intersection and generic types",
+            "support": {
+                "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+                "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0"
+            },
+            "time": "2024-10-13T11:25:22+00:00"
+        },
+        {
+            "name": "webmozart/assert",
+            "version": "1.12.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/webmozarts/assert.git",
+                "reference": "9be6926d8b485f55b9229203f962b51ed377ba68"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68",
+                "reference": "9be6926d8b485f55b9229203f962b51ed377ba68",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-date": "*",
+                "ext-filter": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "suggest": {
+                "ext-intl": "",
+                "ext-simplexml": "",
+                "ext-spl": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.10-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Webmozart\\Assert\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                }
+            ],
+            "description": "Assertions to validate method input/output with nice error messages.",
+            "keywords": [
+                "assert",
+                "check",
+                "validate"
+            ],
+            "support": {
+                "issues": "https://github.com/webmozarts/assert/issues",
+                "source": "https://github.com/webmozarts/assert/tree/1.12.1"
+            },
+            "time": "2025-10-29T15:56:20+00:00"
+        },
+        {
+            "name": "wp-hooks/generator",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/wp-hooks/generator.git",
+                "reference": "616dad61a9c50ba27d047035dcc5e8b4a1515d80"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/wp-hooks/generator/zipball/616dad61a9c50ba27d047035dcc5e8b4a1515d80",
+                "reference": "616dad61a9c50ba27d047035dcc5e8b4a1515d80",
+                "shasum": ""
+            },
+            "require": {
+                "erusev/parsedown": "1.8.0-beta-7",
+                "ext-libxml": "*",
+                "nikic/php-parser": "5.3.1",
+                "php": ">=8.3",
+                "phpdocumentor/reflection-docblock": "5.5.1"
+            },
+            "replace": {
+                "johnbillion/wp-hooks-generator": "*"
+            },
+            "require-dev": {
+                "oomphinc/composer-installers-extender": "^2",
+                "opis/json-schema": "2.3.0"
+            },
+            "bin": [
+                "bin/wp-hooks-generator"
+            ],
+            "type": "library",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "GPL-3.0-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "John Blackbourn",
+                    "homepage": "https://johnblackbourn.com/"
+                }
+            ],
+            "description": "Generates a JSON representation of the WordPress actions and filters in your code",
+            "support": {
+                "issues": "https://github.com/wp-hooks/generator/issues",
+                "source": "https://github.com/wp-hooks/generator/tree/1.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sponsors/johnbillion",
+                    "type": "github"
+                }
+            ],
+            "time": "2026-05-22T10:32:18+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "dev",
+    "stability-flags": {},
+    "prefer-stable": true,
+    "prefer-lowest": false,
+    "platform": {},
+    "platform-dev": {},
+    "platform-overrides": {
+        "php": "8.3.0"
+    },
+    "plugin-api-version": "2.9.0"
+}
diff --git a/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md b/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md
index 4fa9c3629a3..4b22828d8fb 100644
--- a/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md
+++ b/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/actions.md
@@ -1,3 +1,4 @@
+<!-- DO NOT UPDATE THIS DOC DIRECTLY -->

 <!-- Use `npm run build:docs` to automatically build hook documentation -->

@@ -5,15 +6,25 @@

 ## Table of Contents

-
 - [deprecated_function_run](#deprecated_function_run)
 - [woocommerce_add_to_cart](#woocommerce_add_to_cart)
+- [woocommerce_after_add_to_cart_button](#woocommerce_after_add_to_cart_button)
+- [woocommerce_after_add_to_cart_form](#woocommerce_after_add_to_cart_form)
+- [woocommerce_after_add_to_cart_quantity](#woocommerce_after_add_to_cart_quantity)
 - [woocommerce_after_main_content](#woocommerce_after_main_content)
 - [woocommerce_after_shop_loop](#woocommerce_after_shop_loop)
+- [woocommerce_after_single_variation](#woocommerce_after_single_variation)
+- [woocommerce_after_variations_form](#woocommerce_after_variations_form)
+- [woocommerce_after_variations_table](#woocommerce_after_variations_table)
 - [woocommerce_applied_coupon](#woocommerce_applied_coupon)
 - [woocommerce_archive_description](#woocommerce_archive_description)
+- [woocommerce_before_add_to_cart_button](#woocommerce_before_add_to_cart_button)
+- [woocommerce_before_add_to_cart_form](#woocommerce_before_add_to_cart_form)
+- [woocommerce_before_add_to_cart_quantity](#woocommerce_before_add_to_cart_quantity)
 - [woocommerce_before_main_content](#woocommerce_before_main_content)
 - [woocommerce_before_shop_loop](#woocommerce_before_shop_loop)
+- [woocommerce_before_single_variation](#woocommerce_before_single_variation)
+- [woocommerce_before_variations_form](#woocommerce_before_variations_form)
 - [woocommerce_blocks_cart_enqueue_data](#woocommerce_blocks_cart_enqueue_data)
 - [woocommerce_blocks_checkout_enqueue_data](#woocommerce_blocks_checkout_enqueue_data)
 - [woocommerce_blocks_enqueue_cart_block_scripts_after](#woocommerce_blocks_enqueue_cart_block_scripts_after)
@@ -21,24 +32,31 @@
 - [woocommerce_blocks_enqueue_checkout_block_scripts_after](#woocommerce_blocks_enqueue_checkout_block_scripts_after)
 - [woocommerce_blocks_enqueue_checkout_block_scripts_before](#woocommerce_blocks_enqueue_checkout_block_scripts_before)
 - [woocommerce_blocks_loaded](#woocommerce_blocks_loaded)
-- [woocommerce_blocks_{$this->registry_identifier}_registration](#woocommerce_blocks_this-registry_identifier_registration)
+- [`woocommerce_blocks_validate_location_{$location}_fields`](#woocommerce_blocks_validate_location_location_fields)
+- [`woocommerce_blocks_{$this->registry_identifier}_registration`](#woocommerce_blocks_this-registry_identifier_registration)
 - [woocommerce_check_cart_items](#woocommerce_check_cart_items)
-- [woocommerce_created_customer](#woocommerce_created_customer)
+- [woocommerce_checkout_validate_order_before_payment](#woocommerce_checkout_validate_order_before_payment)
 - [woocommerce_no_products_found](#woocommerce_no_products_found)
-- [woocommerce_register_post](#woocommerce_register_post)
+- [woocommerce_rest_checkout_process_payment_with_context](#woocommerce_rest_checkout_process_payment_with_context)
+- [woocommerce_set_additional_field_value](#woocommerce_set_additional_field_value)
 - [woocommerce_shop_loop](#woocommerce_shop_loop)
+- [woocommerce_single_variation](#woocommerce_single_variation)
 - [woocommerce_store_api_cart_errors](#woocommerce_store_api_cart_errors)
 - [woocommerce_store_api_cart_select_shipping_rate](#woocommerce_store_api_cart_select_shipping_rate)
 - [woocommerce_store_api_cart_update_customer_from_request](#woocommerce_store_api_cart_update_customer_from_request)
 - [woocommerce_store_api_cart_update_order_from_request](#woocommerce_store_api_cart_update_order_from_request)
+- [woocommerce_store_api_checkout_order_created](#woocommerce_store_api_checkout_order_created)
 - [woocommerce_store_api_checkout_order_processed](#woocommerce_store_api_checkout_order_processed)
 - [woocommerce_store_api_checkout_update_customer_from_request](#woocommerce_store_api_checkout_update_customer_from_request)
+- [woocommerce_store_api_checkout_update_draft](#woocommerce_store_api_checkout_update_draft)
+- [woocommerce_store_api_checkout_update_order_from_request](#woocommerce_store_api_checkout_update_order_from_request)
 - [woocommerce_store_api_checkout_update_order_meta](#woocommerce_store_api_checkout_update_order_meta)
 - [woocommerce_store_api_rate_limit_exceeded](#woocommerce_store_api_rate_limit_exceeded)
 - [woocommerce_store_api_validate_add_to_cart](#woocommerce_store_api_validate_add_to_cart)
 - [woocommerce_store_api_validate_cart_item](#woocommerce_store_api_validate_cart_item)
-- [woocommerce_{$product->get_type()}_add_to_cart](#woocommerce_product-get_type_add_to_cart)
-- [{$hook}](#hook)
+- [woocommerce_validate_additional_field](#woocommerce_validate_additional_field)
+- [`woocommerce_{$product->get_type()}_add_to_cart`](#woocommerce_product-get_type_add_to_cart)
+- [`woocommerce_{$product_type}_add_to_cart`](#woocommerce_product_type_add_to_cart)

 ---

@@ -53,8 +71,7 @@ do_action( 'deprecated_function_run' )

 ### Source

-
-- [Domain/Bootstrap.php](../../../../../../../woocommerce/src/Blocks/Domain/Bootstrap.php)
+- [Blocks/Domain/Bootstrap.php](../../../../../../src/Blocks/Domain/Bootstrap.php)

 ---

@@ -64,11 +81,11 @@ do_action( 'deprecated_function_run' )
 Fires when an item is added to the cart.

 ```php
-do_action( 'woocommerce_add_to_cart', string $cart_id, integer $product_id, integer $request_quantity, integer $variation_id, array $variation, array $cart_item_data )
+do_action( 'woocommerce_add_to_cart', string $cart_id, int $product_id, int $request_quantity, int $variation_id, array $variation, array $cart_item_data )
 ```


-**Note: Matches action name in WooCommerce core.**
+**Note:** Matches action name in WooCommerce core.

 ### Description

@@ -79,16 +96,60 @@ This hook fires when an item is added to the cart. This is triggered from the St
 | Argument | Type | Description |
 | -------- | ---- | ----------- |
 | $cart_id | string | ID of the item in the cart. |
-| $product_id | integer | ID of the product added to the cart. |
-| $request_quantity | integer | Quantity of the item added to the cart. |
-| $variation_id | integer | Variation ID of the product added to the cart. |
+| $product_id | int | ID of the product added to the cart. |
+| $request_quantity | int | Quantity of the item added to the cart. |
+| $variation_id | int | Variation ID of the product added to the cart. |
 | $variation | array | Array of variation data. |
 | $cart_item_data | array | Array of other cart item data. |

 ### Source

+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)
+
+---
+
+## woocommerce_after_add_to_cart_button
+
+
+Hook: woocommerce_after_add_to_cart_button.
+
+```php
+do_action( 'woocommerce_after_add_to_cart_button' )
+```
+
+### Source

-- [StoreApi/Utilities/CartController.php](../../../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)
+
+---
+
+## woocommerce_after_add_to_cart_form
+
+
+Hook: woocommerce_after_add_to_cart_form.
+
+```php
+do_action( 'woocommerce_after_add_to_cart_form' )
+```
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)
+
+---
+
+## woocommerce_after_add_to_cart_quantity
+
+
+Hook: woocommerce_after_add_to_cart_quantity.
+
+```php
+do_action( 'woocommerce_after_add_to_cart_quantity' )
+```
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)

 ---

@@ -107,14 +168,11 @@ Called after rendering the main content for a product.

 ### See

-
 - woocommerce_output_content_wrapper_end() - Outputs closing DIV for the content (priority 10)

 ### Source

-
-- [BlockTypes/ClassicTemplate.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
-- [BlockTypes/ClassicTemplate.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
+- [Blocks/BlockTypes/ClassicTemplate.php](../../../../../../src/Blocks/BlockTypes/ClassicTemplate.php)

 ---

@@ -129,13 +187,56 @@ do_action( 'woocommerce_after_shop_loop' )

 ### See

-
 - woocommerce_pagination() - Renders pagination (priority 10)

 ### Source

+- [Blocks/BlockTypes/ClassicTemplate.php](../../../../../../src/Blocks/BlockTypes/ClassicTemplate.php)
+
+---
+
+## woocommerce_after_single_variation
+
+
+Hook: woocommerce_after_single_variation.
+
+```php
+do_action( 'woocommerce_after_single_variation' )
+```
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)
+
+---
+
+## woocommerce_after_variations_form
+
+
+Hook: woocommerce_after_variations_form.
+
+```php
+do_action( 'woocommerce_after_variations_form' )
+```
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)
+
+---
+
+## woocommerce_after_variations_table
+
+
+Hook: woocommerce_after_variations_table.
+
+```php
+do_action( 'woocommerce_after_variations_table' )
+```
+
+### Source

-- [BlockTypes/ClassicTemplate.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)

 ---

@@ -149,7 +250,7 @@ do_action( 'woocommerce_applied_coupon', string $coupon_code )
 ```


-**Note: Matches action name in WooCommerce core.**
+**Note:** Matches action name in WooCommerce core.

 ### Parameters

@@ -159,8 +260,7 @@ do_action( 'woocommerce_applied_coupon', string $coupon_code )

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

@@ -175,14 +275,57 @@ do_action( 'woocommerce_archive_description' )

 ### See

-
 - woocommerce_taxonomy_archive_description() - Renders the taxonomy archive description (priority 10)
 - woocommerce_product_archive_description() - Renders the product archive description (priority 10)

 ### Source

+- [Blocks/BlockTypes/ClassicTemplate.php](../../../../../../src/Blocks/BlockTypes/ClassicTemplate.php)
+
+---
+
+## woocommerce_before_add_to_cart_button
+
+
+Hook: woocommerce_before_add_to_cart_button.
+
+```php
+do_action( 'woocommerce_before_add_to_cart_button' )
+```
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)
+
+---
+
+## woocommerce_before_add_to_cart_form
+
+
+Hook: woocommerce_before_add_to_cart_form.
+
+```php
+do_action( 'woocommerce_before_add_to_cart_form' )
+```
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)
+
+---
+
+## woocommerce_before_add_to_cart_quantity
+
+
+Hook: woocommerce_before_add_to_cart_quantity.
+
+```php
+do_action( 'woocommerce_before_add_to_cart_quantity' )
+```
+
+### Source

-- [BlockTypes/ClassicTemplate.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)

 ---

@@ -201,16 +344,13 @@ Called before rendering the main content for a product.

 ### See

-
 - woocommerce_output_content_wrapper() - Outputs opening DIV for the content (priority 10)
 - woocommerce_breadcrumb() - Outputs breadcrumb trail to the current product (priority 20)
 - WC_Structured_Data::generate_website_data() - Outputs schema markup (priority 30)

 ### Source

-
-- [BlockTypes/ClassicTemplate.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
-- [BlockTypes/ClassicTemplate.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
+- [Blocks/BlockTypes/ClassicTemplate.php](../../../../../../src/Blocks/BlockTypes/ClassicTemplate.php)

 ---

@@ -225,15 +365,43 @@ do_action( 'woocommerce_before_shop_loop' )

 ### See

-
 - woocommerce_output_all_notices() - Render error notices (priority 10)
 - woocommerce_result_count() - Show number of results found (priority 20)
 - woocommerce_catalog_ordering() - Show form to control sort order (priority 30)

 ### Source

+- [Blocks/BlockTypes/ClassicTemplate.php](../../../../../../src/Blocks/BlockTypes/ClassicTemplate.php)
+
+---
+
+## woocommerce_before_single_variation
+
+
+Hook: woocommerce_before_single_variation.
+
+```php
+do_action( 'woocommerce_before_single_variation' )
+```
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)
+
+---
+
+## woocommerce_before_variations_form

-- [BlockTypes/ClassicTemplate.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
+
+Hook: woocommerce_before_variations_form.
+
+```php
+do_action( 'woocommerce_before_variations_form' )
+```
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)

 ---

@@ -248,9 +416,8 @@ do_action( 'woocommerce_blocks_cart_enqueue_data' )

 ### Source

-
-- [BlockTypes/MiniCart.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/MiniCart.php)
-- [BlockTypes/Cart.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/Cart.php)
+- [Blocks/BlockTypes/Cart.php](../../../../../../src/Blocks/BlockTypes/Cart.php)
+- [Blocks/BlockTypes/MiniCart.php](../../../../../../src/Blocks/BlockTypes/MiniCart.php)

 ---

@@ -265,8 +432,7 @@ do_action( 'woocommerce_blocks_checkout_enqueue_data' )

 ### Source

-
-- [BlockTypes/Checkout.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/Checkout.php)
+- [Blocks/BlockTypes/Checkout.php](../../../../../../src/Blocks/BlockTypes/Checkout.php)

 ---

@@ -281,8 +447,7 @@ do_action( 'woocommerce_blocks_enqueue_cart_block_scripts_after' )

 ### Source

-
-- [BlockTypes/Cart.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/Cart.php)
+- [Blocks/BlockTypes/Cart.php](../../../../../../src/Blocks/BlockTypes/Cart.php)

 ---

@@ -297,8 +462,7 @@ do_action( 'woocommerce_blocks_enqueue_cart_block_scripts_before' )

 ### Source

-
-- [BlockTypes/Cart.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/Cart.php)
+- [Blocks/BlockTypes/Cart.php](../../../../../../src/Blocks/BlockTypes/Cart.php)

 ---

@@ -313,8 +477,7 @@ do_action( 'woocommerce_blocks_enqueue_checkout_block_scripts_after' )

 ### Source

-
-- [BlockTypes/Checkout.php](../../../../../../../woocommerce/src/BLocks/BlockTypes/Checkout.php)
+- [Blocks/BlockTypes/Checkout.php](../../../../../../src/Blocks/BlockTypes/Checkout.php)

 ---

@@ -329,8 +492,7 @@ do_action( 'woocommerce_blocks_enqueue_checkout_block_scripts_before' )

 ### Source

-
-- [BlockTypes/Checkout.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/Checkout.php)
+- [Blocks/BlockTypes/Checkout.php](../../../../../../src/Blocks/BlockTypes/Checkout.php)

 ---

@@ -345,22 +507,46 @@ do_action( 'woocommerce_blocks_loaded' )

 ### Description

-This hook is intended to be used as a safe event hook for when the plugin has been loaded, and all dependency requirements have been met. To ensure blocks are initialized, you must use the `woocommerce_blocks_loaded` hook instead of the `plugins_loaded` hook. This is because the functions hooked into plugins_loaded on the same priority load in an inconsistent and unpredictable manner.
+This hook is intended to be used as a safe event hook for when the plugin has been loaded, and all dependency requirements have been met.
+
+To ensure blocks are initialized, you must use the `woocommerce_blocks_loaded` hook instead of the `plugins_loaded` hook. This is because the functions hooked into plugins_loaded on the same priority load in an inconsistent and unpredictable manner.

 ### Source

+- [Blocks/Domain/Bootstrap.php](../../../../../../src/Blocks/Domain/Bootstrap.php)
+
+---
+
+## `woocommerce_blocks_validate_location_{$location}_fields`

-- [Domain/Bootstrap.php](../../../../../../../woocommerce/src/Blocks/Domain/Bootstrap.php)
+
+Pass an error object to allow validation of an additional field.
+
+```php
+do_action( 'woocommerce_blocks_validate_location_{$location}_fields', \WP_Error $errors, mixed $fields, string $group )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $errors | \WP_Error | A WP_Error object that extensions may add errors to. |
+| $fields | mixed | List of fields (key value pairs) in this location. |
+| $group | string | The group of this location (shipping\|billing\|other). |
+
+### Source
+
+- [Blocks/Domain/Services/CheckoutFields.php](../../../../../../src/Blocks/Domain/Services/CheckoutFields.php)

 ---

-## woocommerce_blocks_{$this->registry_identifier}_registration
+## `woocommerce_blocks_{$this->registry_identifier}_registration`


 Fires when the IntegrationRegistry is initialized.

 ```php
-do_action( 'woocommerce_blocks_{$this->registry_identifier}_registration', \Automattic\WooCommerce\Blocks\Integrations\IntegrationRegistry $this )
+do_action( 'woocommerce_blocks_{$this->registry_identifier}_registration', \IntegrationRegistry $this )
 ```

 ### Description
@@ -371,12 +557,11 @@ Runs before integrations are initialized allowing new integration to be register

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $this | \Automattic\WooCommerce\Blocks\Integrations\IntegrationRegistry | Instance of the IntegrationRegistry class which exposes the IntegrationRegistry::register() method. |
+| $this | \IntegrationRegistry | Instance of the IntegrationRegistry class which exposes the IntegrationRegistry::register() method. |

 ### Source

-
-- [Integrations/IntegrationRegistry.php](../../../../../../../woocommerce/src/Blocks/Integrations/IntegrationRegistry.php)
+- [Blocks/Integrations/IntegrationRegistry.php](../../../../../../src/Blocks/Integrations/IntegrationRegistry.php)

 ---

@@ -389,11 +574,11 @@ Fires when cart items are being validated.
 do_action( 'woocommerce_check_cart_items' )
 ```

-<!-- markdownlint-disable-next-line MD036 -->
-**Deprecated: This hook is deprecated and will be removed**

-<!-- markdownlint-disable-next-line MD036 -->
-**Note: Matches action name in WooCommerce core.**
+**Deprecated:** This hook is deprecated and will be removed
+
+
+**Note:** Matches action name in WooCommerce core.

 ### Description

@@ -401,39 +586,33 @@ Allow 3rd parties to validate cart items. This is a legacy hook from Woo core. T

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

-## woocommerce_created_customer
+## woocommerce_checkout_validate_order_before_payment


-Fires after a customer account has been registered.
+Allow plugins to perform custom validation before payment.

 ```php
-do_action( 'woocommerce_created_customer', integer $customer_id, array $new_customer_data, string $password_generated )
+do_action( 'woocommerce_checkout_validate_order_before_payment', \WC_Order $order, \WP_Error $validation_errors )
 ```

-
-**Note: Matches filter name in WooCommerce core.**
-
 ### Description

-This hook fires after customer accounts are created and passes the customer data.
+Plugins can add errors to the $validation_errors object.

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $customer_id | integer | New customer (user) ID. |
-| $new_customer_data | array | Array of customer (user) data. |
-| $password_generated | string | The generated password for the account. |
+| $order | \WC_Order | The order object. |
+| $validation_errors | \WP_Error | WP_Error object to add custom errors to. |

 ### Source

-
-- [StoreApi/Routes/V1/Checkout.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/Checkout.php)
+- [StoreApi/Utilities/OrderController.php](../../../../../../src/StoreApi/Utilities/OrderController.php)

 ---

@@ -448,44 +627,62 @@ do_action( 'woocommerce_no_products_found' )

 ### See

-
 - wc_no_products_found() - Default no products found content (priority 10)

 ### Source

-
-- [BlockTypes/ClassicTemplate.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
+- [Blocks/BlockTypes/ClassicTemplate.php](../../../../../../src/Blocks/BlockTypes/ClassicTemplate.php)

 ---

-## woocommerce_register_post
+## woocommerce_rest_checkout_process_payment_with_context


-Fires before a customer account is registered.
+Process payment with context.

 ```php
-do_action( 'woocommerce_register_post', string $username, string $user_email, \WP_Error $errors )
+do_action_ref_array( 'woocommerce_rest_checkout_process_payment_with_context', [ \PaymentContext $context, \PaymentResult $payment_result ] )
 ```

+### Parameters

-**Note: Matches filter name in WooCommerce core.**
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $context | \PaymentContext | Holds context for the payment, including order ID and payment method. |
+| $payment_result | \PaymentResult | Result object for the transaction. |
+
+### Exceptions
+
+
+`\Exception` If there is an error taking payment, an \Exception object can be thrown with an error message.
+
+### Source
+
+- [StoreApi/Utilities/CheckoutTrait.php](../../../../../../src/StoreApi/Utilities/CheckoutTrait.php)
+
+---
+
+## woocommerce_set_additional_field_value

-### Description

-This hook fires before customer accounts are created and passes the form data (username, email) and an array of errors. This could be used to add extra validation logic and append errors to the array.
+Allow reacting for saving an additional field value.
+
+```php
+do_action( 'woocommerce_set_additional_field_value', string $key, mixed $value, string $group, \WC_Customer|\WC_Order $wc_object )
+```

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $username | string | Customer username. |
-| $user_email | string | Customer email address. |
-| $errors | \WP_Error | Error object. |
+| $key | string | The key of the field being saved. |
+| $value | mixed | The value of the field being saved. |
+| $group | string | The group of this location (shipping\|billing\|other). |
+| $wc_object | \WC_Customer, \WC_Order | The object to set the field value for. |

 ### Source

-
-- [StoreApi/Routes/V1/Checkout.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/Checkout.php)
+- [Blocks/Domain/Services/CheckoutFields.php](../../../../../../src/Blocks/Domain/Services/CheckoutFields.php)

 ---

@@ -500,8 +697,22 @@ do_action( 'woocommerce_shop_loop' )

 ### Source

+- [Blocks/BlockTypes/ClassicTemplate.php](../../../../../../src/Blocks/BlockTypes/ClassicTemplate.php)

-- [BlockTypes/ClassicTemplate.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
+---
+
+## woocommerce_single_variation
+
+
+Hook: woocommerce_single_variation.
+
+```php
+do_action( 'woocommerce_single_variation' )
+```
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)

 ---

@@ -545,8 +756,7 @@ add_action( 'woocommerce_store_api_cart_errors', 'my_function_callback', 10 );

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

@@ -573,8 +783,7 @@ This allows extensions to perform addition actions after a shipping method has b

 ### Source

-
-- [StoreApi/Routes/V1/CartSelectShippingRate.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/CartSelectShippingRate.php)
+- [StoreApi/Routes/V1/CartSelectShippingRate.php](../../../../../../src/StoreApi/Routes/V1/CartSelectShippingRate.php)

 ---

@@ -596,8 +805,7 @@ do_action( 'woocommerce_store_api_cart_update_customer_from_request', \WC_Custom

 ### Source

-
-- [StoreApi/Routes/V1/CartUpdateCustomer.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/CartUpdateCustomer.php)
+- [StoreApi/Routes/V1/CartUpdateCustomer.php](../../../../../../src/StoreApi/Routes/V1/CartUpdateCustomer.php)

 ---

@@ -620,8 +828,32 @@ do_action( 'woocommerce_store_api_cart_update_order_from_request', \WC_Order $dr

 ### Source

+- [StoreApi/Routes/V1/AbstractCartRoute.php](../../../../../../src/StoreApi/Routes/V1/AbstractCartRoute.php)
+
+---
+
+## woocommerce_store_api_checkout_order_created
+
+
+Fires once when the Store API checkout draft order is first materialised.
+
+```php
+do_action( 'woocommerce_store_api_checkout_order_created', \WC_Order $order )
+```
+
+### Description
+
+Use this hook for first-touch logic that should only run when the draft order is initially created (e.g. analytics, abandoned-cart trackers). As of WooCommerce 10.8.0 the Store API defers draft order creation to place-order time, so this action fires once at POST rather than on the first PATCH.
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $order | \WC_Order | Order object. |
+
+### Source

-- [StoreApi/Routes/V1/AbstractCartRoute.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/AbstractCartRoute.php)
+- [StoreApi/Routes/V1/Checkout.php](../../../../../../src/StoreApi/Routes/V1/Checkout.php)

 ---

@@ -636,7 +868,9 @@ do_action( 'woocommerce_store_api_checkout_order_processed', \WC_Order $order )

 ### Description

-This hook informs extensions that $order has completed processing and is ready for payment. This is similar to existing core hook woocommerce_checkout_order_processed. We're using a new action:
+This hook informs extensions that $order has completed processing and is ready for payment.
+
+This is similar to existing core hook woocommerce_checkout_order_processed. We're using a new action:

 - To keep the interface focused (only pass $order, not passing request data).
 - This also explicitly indicates these orders are from checkout block/StoreAPI.
@@ -664,14 +898,12 @@ add_action( 'woocommerce_blocks_checkout_order_processed', 'my_function_callback

 ### See

-
-- [#3238](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3238)
+- <https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3238>

 ### Source

-
-- [StoreApi/Routes/V1/CheckoutOrder.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/CheckoutOrder.php)
-- [StoreApi/Routes/V1/Checkout.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/Checkout.php)
+- [StoreApi/Routes/V1/CheckoutOrder.php](../../../../../../src/StoreApi/Routes/V1/CheckoutOrder.php)
+- [StoreApi/Routes/V1/Checkout.php](../../../../../../src/StoreApi/Routes/V1/Checkout.php)

 ---

@@ -693,16 +925,68 @@ do_action( 'woocommerce_store_api_checkout_update_customer_from_request', \WC_Cu

 ### Source

+- [StoreApi/Routes/V1/CheckoutOrder.php](../../../../../../src/StoreApi/Routes/V1/CheckoutOrder.php)
+- [StoreApi/Routes/V1/Checkout.php](../../../../../../src/StoreApi/Routes/V1/Checkout.php)
+
+---
+
+## woocommerce_store_api_checkout_update_draft
+
+
+Fires after a Store API checkout PATCH request has been validated and live customer/session state has been updated, before the response is returned.
+
+```php
+do_action( 'woocommerce_store_api_checkout_update_draft', \WP_REST_Request $request )
+```
+
+### Description
+
+Hook this action when an extension needs to observe live checkout state — e.g. abandoned-cart trackers, side-panel previews, conditional shipping or payment validators, or anything else that needs to react to every customer interaction with the form.
+
+No `WC_Order` exists at this point under deferred draft order creation. Read checkout state from `WC()->cart`, `WC()->customer`, and the supplied `$request`, and persist any extension-owned state to `WC()->session`. To apply that state to the real order at place-order time, hook `woocommerce_store_api_checkout_update_order_meta` or `woocommerce_store_api_checkout_update_order_from_request` — both fire against the real, persisted order at POST exactly as they always have.
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $request | \WP_REST_Request | The current PATCH request. |
+
+### Source
+
+- [StoreApi/Routes/V1/Checkout.php](../../../../../../src/StoreApi/Routes/V1/Checkout.php)
+
+---
+
+## woocommerce_store_api_checkout_update_order_from_request
+
+
+Fires when the Checkout Block/Store API updates an order's from the API request data.
+
+```php
+do_action( 'woocommerce_store_api_checkout_update_order_from_request', \WC_Order $order, \WP_REST_Request $request )
+```
+
+### Description
+
+This hook gives extensions the chance to update orders based on the data in the request. This can be used in conjunction with the ExtendSchema class to post custom data and then process it.

-- [StoreApi/Routes/V1/CheckoutOrder.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/CheckoutOrder.php)
-- [StoreApi/Routes/V1/Checkout.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/Checkout.php)
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $order | \WC_Order | Order object. |
+| $request | \WP_REST_Request | Full details about the request. |
+
+### Source
+
+- [StoreApi/Utilities/CheckoutTrait.php](../../../../../../src/StoreApi/Utilities/CheckoutTrait.php)

 ---

 ## woocommerce_store_api_checkout_update_order_meta


-Fires when the Checkout Block/Store API updates an order's metadata.
+Fires when the Checkout Block/Store API updates an order's meta data.

 ```php
 do_action( 'woocommerce_store_api_checkout_update_order_meta', \WC_Order $order )
@@ -710,7 +994,9 @@ do_action( 'woocommerce_store_api_checkout_update_order_meta', \WC_Order $order

 ### Description

-This hook gives extensions the chance to add or update metadata on the $order. Throwing an exception from a callback attached to this action will make the Checkout Block render in a warning state, effectively preventing checkout. This is similar to existing core hook woocommerce_checkout_update_order_meta. We're using a new action:
+This hook gives extensions the chance to add or update meta data on the $order. Throwing an exception from a callback attached to this action will make the Checkout Block render in a warning state, effectively preventing checkout.
+
+This is similar to existing core hook woocommerce_checkout_update_order_meta. We're using a new action:

 - To keep the interface focused (only pass $order, not passing request data).
 - This also explicitly indicates these orders are from checkout block/StoreAPI.
@@ -723,13 +1009,11 @@ This hook gives extensions the chance to add or update metadata on the $order. T

 ### See

-
-- [#3686](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3686)
+- <https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3686>

 ### Source

-
-- [StoreApi/Routes/V1/Checkout.php](../../../../../../../woocommerce/src/StoreApi/Routes/V1/Checkout.php)
+- [StoreApi/Routes/V1/Checkout.php](../../../../../../src/StoreApi/Routes/V1/Checkout.php)

 ---

@@ -747,11 +1031,11 @@ do_action( 'woocommerce_store_api_rate_limit_exceeded', string $ip_address, stri
 | Argument | Type | Description |
 | -------- | ---- | ----------- |
 | $ip_address | string | The IP address of the request. |
+| $action_id | string | The grouping identifier to the request. |

 ### Source

-
-- [StoreApi/Authentication.php](../../../../../../../woocommerce/src/StoreApi/Authentication.php)
+- [StoreApi/Authentication.php](../../../../../../src/StoreApi/Authentication.php)

 ---

@@ -777,8 +1061,7 @@ Fire action to validate add to cart. Functions hooking into this should throw an

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

@@ -800,12 +1083,34 @@ do_action( 'woocommerce_store_api_validate_cart_item', \WC_Product $product, arr

 ### Source

+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)
+
+---
+
+## woocommerce_validate_additional_field
+

-- [StoreApi/Utilities/CartController.php](../../../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+Pass an error object to allow validation of an additional field.
+
+```php
+do_action( 'woocommerce_validate_additional_field', \WP_Error $errors, string $field_key, mixed $field_value )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $errors | \WP_Error | A WP_Error object that extensions may add errors to. |
+| $field_key | string | Key of the field being sanitized. |
+| $field_value | mixed | The value of the field being validated. |
+
+### Source
+
+- [Blocks/Domain/Services/CheckoutFields.php](../../../../../../src/Blocks/Domain/Services/CheckoutFields.php)

 ---

-## woocommerce_{$product->get_type()}_add_to_cart
+## `woocommerce_{$product->get_type()}_add_to_cart`


 Trigger the single product add to cart action for each product type.
@@ -816,24 +1121,22 @@ do_action( 'woocommerce_{$product->get_type()}_add_to_cart' )

 ### Source

-
-- [BlockTypes/AddToCartForm.php](../../../../../../../woocommerce/src/Blocks/BlockTypes/AddToCartForm.php)
+- [Blocks/BlockTypes/AddToCartForm.php](../../../../../../src/Blocks/BlockTypes/AddToCartForm.php)

 ---

-## {$hook}
+## `woocommerce_{$product_type}_add_to_cart`


-Action to render the content of a hook.
+Trigger the single product add to cart action that prints the markup.

 ```php
-do_action( '{$hook}' )
+do_action( 'woocommerce_{$product_type}_add_to_cart' )
 ```

 ### Source

-
-- [Templates/AbstractTemplateCompatibility.php](../../../../../../../woocommerce/src/Blocks/Templates/AbstractTemplateCompatibility.php)
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)

 ---
 <!-- FEEDBACK -->
@@ -845,4 +1148,3 @@ do_action( '{$hook}' )
 🐞 Found a mistake, or have a suggestion? [Leave feedback about this document here.](https://github.com/woocommerce/woocommerce/issues/new?assignees=&labels=type%3A+documentation&template=suggestion-for-documentation-improvement-correction.md&title=Feedback%20on%20./docs/third-party-developers/extensibility/hooks/actions.md)

 <!-- /FEEDBACK -->
-
diff --git a/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md b/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md
index bc4bb76820b..f96c32c75c0 100644
--- a/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md
+++ b/plugins/woocommerce/client/blocks/docs/third-party-developers/extensibility/hooks/filters.md
@@ -6,48 +6,77 @@

 ## Table of Contents

-
 - [__experimental_woocommerce_blocks_add_data_attributes_to_block](#__experimental_woocommerce_blocks_add_data_attributes_to_block)
 - [__experimental_woocommerce_blocks_add_data_attributes_to_namespace](#__experimental_woocommerce_blocks_add_data_attributes_to_namespace)
 - [__experimental_woocommerce_blocks_payment_gateway_features_list](#__experimental_woocommerce_blocks_payment_gateway_features_list)
+- [__experimental_woocommerce_store_api_batch_request_methods](#__experimental_woocommerce_store_api_batch_request_methods)
+- [`__experimental_woocommerce_{$product_type}_add_to_cart_with_options_block_template_part`](#__experimental_woocommerce_product_type_add_to_cart_with_options_block_template_part)
+- [comment_text](#comment_text)
 - [deprecated_function_trigger_error](#deprecated_function_trigger_error)
-- [loop_shop_per_page](#loop_shop_per_page)
 - [wc_session_expiration](#wc_session_expiration)
 - [woocommerce_add_cart_item](#woocommerce_add_cart_item)
 - [woocommerce_add_cart_item_data](#woocommerce_add_cart_item_data)
+- [woocommerce_add_to_cart_form_action](#woocommerce_add_to_cart_form_action)
 - [woocommerce_add_to_cart_quantity](#woocommerce_add_to_cart_quantity)
 - [woocommerce_add_to_cart_sold_individually_quantity](#woocommerce_add_to_cart_sold_individually_quantity)
 - [woocommerce_add_to_cart_validation](#woocommerce_add_to_cart_validation)
 - [woocommerce_adjust_non_base_location_prices](#woocommerce_adjust_non_base_location_prices)
-- [woocommerce_apply_base_tax_for_local_pickup](#woocommerce_apply_base_tax_for_local_pickup)
 - [woocommerce_apply_individual_use_coupon](#woocommerce_apply_individual_use_coupon)
 - [woocommerce_apply_with_individual_use_coupon](#woocommerce_apply_with_individual_use_coupon)
 - [woocommerce_blocks_hook_compatibility_additional_data](#woocommerce_blocks_hook_compatibility_additional_data)
+- [woocommerce_blocks_pre_get_routes_from_namespace](#woocommerce_blocks_pre_get_routes_from_namespace)
+- [woocommerce_blocks_product_filters_selected_items](#woocommerce_blocks_product_filters_selected_items)
+- [woocommerce_blocks_product_grid_add_to_cart_attributes](#woocommerce_blocks_product_grid_add_to_cart_attributes)
 - [woocommerce_blocks_product_grid_is_cacheable](#woocommerce_blocks_product_grid_is_cacheable)
 - [woocommerce_blocks_product_grid_item_html](#woocommerce_blocks_product_grid_item_html)
 - [woocommerce_blocks_register_script_dependencies](#woocommerce_blocks_register_script_dependencies)
+- [woocommerce_breadcrumb_home_url](#woocommerce_breadcrumb_home_url)
+- [woocommerce_breadcrumb_main_term](#woocommerce_breadcrumb_main_term)
+- [woocommerce_breadcrumb_product_terms_args](#woocommerce_breadcrumb_product_terms_args)
 - [woocommerce_cart_contents_changed](#woocommerce_cart_contents_changed)
 - [woocommerce_cart_item_permalink](#woocommerce_cart_item_permalink)
+- [woocommerce_checkout_must_be_logged_in_message](#woocommerce_checkout_must_be_logged_in_message)
+- [woocommerce_delete_expired_draft_orders_batch_size](#woocommerce_delete_expired_draft_orders_batch_size)
 - [woocommerce_disable_compatibility_layer](#woocommerce_disable_compatibility_layer)
+- [woocommerce_filter_fields_for_order_confirmation](#woocommerce_filter_fields_for_order_confirmation)
 - [woocommerce_ga_disable_tracking](#woocommerce_ga_disable_tracking)
+- [woocommerce_get_block_types](#woocommerce_get_block_types)
+- [woocommerce_get_breadcrumb](#woocommerce_get_breadcrumb)
+- [`woocommerce_get_default_value_for_{$key}`](#woocommerce_get_default_value_for_key)
+- [`woocommerce_get_default_value_for_{$missing_field}`](#woocommerce_get_default_value_for_missing_field)
 - [woocommerce_get_item_data](#woocommerce_get_item_data)
+- [woocommerce_hooked_blocks_pattern_exclude_list](#woocommerce_hooked_blocks_pattern_exclude_list)
+- [woocommerce_hydration_dispatch_request](#woocommerce_hydration_dispatch_request)
+- [woocommerce_hydration_request_after_callbacks](#woocommerce_hydration_request_after_callbacks)
 - [woocommerce_loop_add_to_cart_args](#woocommerce_loop_add_to_cart_args)
 - [woocommerce_loop_add_to_cart_link](#woocommerce_loop_add_to_cart_link)
-- [woocommerce_new_customer_data](#woocommerce_new_customer_data)
+- [woocommerce_order_email_verification_grace_period](#woocommerce_order_email_verification_grace_period)
+- [woocommerce_order_email_verification_required](#woocommerce_order_email_verification_required)
+- [woocommerce_order_received_verify_known_shoppers](#woocommerce_order_received_verify_known_shoppers)
+- [woocommerce_order_shipping_to_display_tax_label](#woocommerce_order_shipping_to_display_tax_label)
 - [woocommerce_pay_order_product_has_enough_stock](#woocommerce_pay_order_product_has_enough_stock)
 - [woocommerce_pay_order_product_in_stock](#woocommerce_pay_order_product_in_stock)
-- [woocommerce_registration_errors](#woocommerce_registration_errors)
+- [woocommerce_product_details_hooked_blocks](#woocommerce_product_details_hooked_blocks)
+- [woocommerce_product_image_loading_attr](#woocommerce_product_image_loading_attr)
+- [woocommerce_product_review_comment_form_args](#woocommerce_product_review_comment_form_args)
+- [woocommerce_product_tabs](#woocommerce_product_tabs)
+- [woocommerce_quantity_input_placeholder](#woocommerce_quantity_input_placeholder)
+- [woocommerce_return_previous_exceptions](#woocommerce_return_previous_exceptions)
+- [woocommerce_sale_badge_text](#woocommerce_sale_badge_text)
+- [woocommerce_sanitize_additional_field](#woocommerce_sanitize_additional_field)
 - [woocommerce_shared_settings](#woocommerce_shared_settings)
-- [woocommerce_shipping_package_name](#woocommerce_shipping_package_name)
-- [woocommerce_shipping_{$this->id}_is_available](#woocommerce_shipping_this-id_is_available)
+- [woocommerce_should_register_blocks](#woocommerce_should_register_blocks)
 - [woocommerce_show_page_title](#woocommerce_show_page_title)
-- [woocommerce_single_product_image_thumbnail_html](#woocommerce_single_product_image_thumbnail_html)
+- [woocommerce_sortable_taxonomies](#woocommerce_sortable_taxonomies)
 - [woocommerce_store_api_add_to_cart_data](#woocommerce_store_api_add_to_cart_data)
-- [woocommerce_store_api_disable_nonce_check](#woocommerce_store_api_disable_nonce_check)
 - [woocommerce_store_api_cart_item_images](#woocommerce_store_api_cart_item_images)
-- [woocommerce_store_api_product_quantity_limit](#woocommerce_store_api_product_quantity_limit)
-- [woocommerce_store_api_product_quantity_{$value_type}](#woocommerce_store_api_product_quantity_value_type)
+- [woocommerce_store_api_disable_nonce_check](#woocommerce_store_api_disable_nonce_check)
+- [`woocommerce_store_api_product_quantity_{$value_type}`](#woocommerce_store_api_product_quantity_value_type)
+- [woocommerce_store_api_rate_limit_id](#woocommerce_store_api_rate_limit_id)
 - [woocommerce_store_api_rate_limit_options](#woocommerce_store_api_rate_limit_options)
+- [woocommerce_thankyou_order_received_title](#woocommerce_thankyou_order_received_title)
+- [woocommerce_use_block_notices_in_classic_theme](#woocommerce_use_block_notices_in_classic_theme)
+- [woocommerce_variation_option_name](#woocommerce_variation_option_name)

 ---

@@ -72,8 +101,7 @@ This hook defines which block names should have block name and attribute data- a

 ### Source

-
-- [BlockTypesController.php](../../../../../woocommerce/src/Blocks/BlockTypesController.php)
+- [Blocks/BlockTypesController.php](../../../../../../src/Blocks/BlockTypesController.php)

 ---

@@ -98,8 +126,7 @@ This hook defines which block namespaces should have block name and attribute `d

 ### Source

-
-- [BlockTypesController.php](../../../../../woocommerce/src/Blocks/BlockTypesController.php)
+- [Blocks/BlockTypesController.php](../../../../../../src/Blocks/BlockTypesController.php)

 ---

@@ -126,7 +153,7 @@ apply_filters( '__experimental_woocommerce_blocks_payment_gateway_features_list'

 ### Example

-## Payment Gateway Featured List
+#### Payment Gateway Featured List

 ```php
 // The action callback function.
@@ -144,47 +171,86 @@ add_filter( '__experimental_woocommerce_blocks_payment_gateway_features_list', '

 ### Source

-
-- [Payments/Integrations/PayPal.php](../../../../../woocommerce/src/Blocks/Payments/Integrations/PayPal.php)
+- [Blocks/Payments/Integrations/PayPal.php](../../../../../../src/Blocks/Payments/Integrations/PayPal.php)

 ---

-## deprecated_function_trigger_error
+## __experimental_woocommerce_store_api_batch_request_methods


-Filters whether to trigger an error for deprecated functions. (Same as WP core)
+Filters the allowed methods for store API batch requests.

 ```php
-apply_filters( 'deprecated_function_trigger_error', bool $trigger )
+apply_filters( '__experimental_woocommerce_store_api_batch_request_methods', string[] $methods )
 ```

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $trigger | bool | Whether to trigger the error for deprecated functions. Default true. |
+| $methods | string[] | Allowed methods. |

 ### Source

-
-- [Domain/Bootstrap.php](../../../../../woocommerce/src/Blocks/Domain/Bootstrap.php)
+- [StoreApi/Routes/V1/Batch.php](../../../../../../src/StoreApi/Routes/V1/Batch.php)

 ---

-## loop_shop_per_page
+## `__experimental_woocommerce_{$product_type}_add_to_cart_with_options_block_template_part`
+
+
+Experimental filter for extensions to register a block template part for a product type.
+
+```php
+apply_filters( '__experimental_woocommerce_{$product_type}_add_to_cart_with_options_block_template_part', string|bool $template_part_path, string $product_type )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $template_part_path | string, bool | The template part path if it exists |
+| $product_type | string | The product type |
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)

+---
+
+## comment_text


+This filter is documented in wp-includes/comment-template.php

 ```php
-apply_filters( 'loop_shop_per_page' )
+apply_filters( 'comment_text' )
 ```

 ### Source

+- [Blocks/BlockTypes/Reviews/ProductReviewContent.php](../../../../../../src/Blocks/BlockTypes/Reviews/ProductReviewContent.php)
+
+---
+
+## deprecated_function_trigger_error
+
+
+Filters whether to trigger an error for deprecated functions. (Same as WP core)
+
+```php
+apply_filters( 'deprecated_function_trigger_error', bool $trigger )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $trigger | bool | Whether to trigger the error for deprecated functions. Default true. |
+
+### Source

-- [BlockTypes/ProductQuery.php](../../../../../woocommerce/src/Blocks/BlockTypes/ProductQuery.php)
-- [BlockTypes/ProductCollection.php](../../../../../woocommerce/src/Blocks/BlockTypes/ProductCollection/Controller.php)
+- [Blocks/Domain/Bootstrap.php](../../../../../../src/Blocks/Domain/Bootstrap.php)

 ---

@@ -205,8 +271,7 @@ apply_filters( 'wc_session_expiration', int $expiration )

 ### Source

-
-- [StoreApi/Routes/V1/AbstractCartRoute.php](../../../../../woocommerce/src/StoreApi/Routes/V1/AbstractCartRoute.php)
+- [StoreApi/Utilities/CartTokenUtils.php](../../../../../../src/StoreApi/Utilities/CartTokenUtils.php)

 ---

@@ -220,7 +285,7 @@ apply_filters( 'woocommerce_add_cart_item', array $cart_item_data, string $cart_
 ```


-**Note: Matches filter name in WooCommerce core.**
+**Note:** Matches filter name in WooCommerce core.

 ### Parameters

@@ -236,8 +301,7 @@ apply_filters( 'woocommerce_add_cart_item', array $cart_item_data, string $cart_

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

@@ -247,20 +311,20 @@ apply_filters( 'woocommerce_add_cart_item', array $cart_item_data, string $cart_
 Filter cart item data for add to cart requests.

 ```php
-apply_filters( 'woocommerce_add_cart_item_data', array $cart_item_data, integer $product_id, integer $variation_id, integer $quantity )
+apply_filters( 'woocommerce_add_cart_item_data', array $cart_item_data, int $product_id, int $variation_id, int $quantity )
 ```


-**Note: Matches filter name in WooCommerce core.**
+**Note:** Matches filter name in WooCommerce core.

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
 | $cart_item_data | array | Array of other cart item data. |
-| $product_id | integer | ID of the product added to the cart. |
-| $variation_id | integer | Variation ID of the product added to the cart. |
-| $quantity | integer | Quantity of the item added to the cart. |
+| $product_id | int | ID of the product added to the cart. |
+| $variation_id | int | Variation ID of the product added to the cart. |
+| $quantity | int | Quantity of the item added to the cart. |

 ### Returns

@@ -269,8 +333,33 @@ apply_filters( 'woocommerce_add_cart_item_data', array $cart_item_data, integer

 ### Source

+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)
+
+---
+
+## woocommerce_add_to_cart_form_action
+
+
+Filter the add to cart form action.
+
+```php
+apply_filters( 'woocommerce_add_to_cart_form_action', string $action_url )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $action_url | string | The add to cart form action URL, defaulting to the current page. |
+
+### Returns
+
+
+`string` The add to cart form action URL.

-- [StoreApi/Utilities/CartController.php](../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)

 ---

@@ -280,20 +369,20 @@ apply_filters( 'woocommerce_add_cart_item_data', array $cart_item_data, integer
 Filters the change the quantity to add to cart.

 ```php
-apply_filters( 'woocommerce_add_to_cart_quantity', \Automattic\WooCommerce\Blocks\BlockTypes\number $default_quantity, \Automattic\WooCommerce\Blocks\BlockTypes\number $product_id )
+apply_filters( 'woocommerce_add_to_cart_quantity', int|float $default_quantity, int $product_id, int $variation_id )
 ```

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $default_quantity | \Automattic\WooCommerce\Blocks\BlockTypes\number | The default quantity. |
-| $product_id | \Automattic\WooCommerce\Blocks\BlockTypes\number | The product id. |
+| $default_quantity | int, float | The default quantity. |
+| $product_id | int | The product id. |
+| $variation_id | int | The variation ID. Always 0 in this context. |

 ### Source

-
-- [BlockTypes/ProductButton.php](../../../../../woocommerce/src/Blocks/BlockTypes/ProductButton.php)
+- [Blocks/BlockTypes/ProductButton.php](../../../../../../src/Blocks/BlockTypes/ProductButton.php)

 ---

@@ -303,31 +392,30 @@ apply_filters( 'woocommerce_add_to_cart_quantity', \Automattic\WooCommerce\Block
 Filter sold individually quantity for add to cart requests.

 ```php
-apply_filters( 'woocommerce_add_to_cart_sold_individually_quantity', integer $sold_individually_quantity, integer $quantity, integer $product_id, integer $variation_id, array $cart_item_data )
+apply_filters( 'woocommerce_add_to_cart_sold_individually_quantity', int $sold_individually_quantity, int $quantity, int $product_id, int $variation_id, array $cart_item_data )
 ```


-**Note: Matches filter name in WooCommerce core.**
+**Note:** Matches filter name in WooCommerce core.

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $sold_individually_quantity | integer | Defaults to 1. |
-| $quantity | integer | Quantity of the item added to the cart. |
-| $product_id | integer | ID of the product added to the cart. |
-| $variation_id | integer | Variation ID of the product added to the cart. |
+| $sold_individually_quantity | int | Defaults to 1. |
+| $quantity | int | Quantity of the item added to the cart. |
+| $product_id | int | ID of the product added to the cart. |
+| $variation_id | int | Variation ID of the product added to the cart. |
 | $cart_item_data | array | Array of other cart item data. |

 ### Returns


-`integer`
+`int`

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

@@ -337,11 +425,11 @@ apply_filters( 'woocommerce_add_to_cart_sold_individually_quantity', integer $so
 Filters if an item being added to the cart passed validation checks.

 ```php
-apply_filters( 'woocommerce_add_to_cart_validation', boolean $passed_validation, integer $product_id, integer $quantity, integer $variation_id, array $variation )
+apply_filters( 'woocommerce_add_to_cart_validation', bool $passed_validation, int $product_id, int $quantity, int $variation_id, array $variation )
 ```

-<!-- markdownlint-disable-next-line MD036 -->
-**Deprecated: This hook is deprecated and will be removed**
+
+**Deprecated:** This hook is deprecated and will be removed

 ### Description

@@ -351,21 +439,20 @@ Allow 3rd parties to validate if an item can be added to the cart. This is a leg

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $passed_validation | boolean | True if the item passed validation. |
-| $product_id | integer | Product ID being validated. |
-| $quantity | integer | Quantity added to the cart. |
-| $variation_id | integer | Variation ID being added to the cart. |
+| $passed_validation | bool | True if the item passed validation. |
+| $product_id | int | Product ID being validated. |
+| $quantity | int | Quantity added to the cart. |
+| $variation_id | int | Variation ID being added to the cart. |
 | $variation | array | Variation data. |

 ### Returns


-`boolean`
+`bool`

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

@@ -375,11 +462,11 @@ Allow 3rd parties to validate if an item can be added to the cart. This is a leg
 Filters if taxes should be removed from locations outside the store base location.

 ```php
-apply_filters( 'woocommerce_adjust_non_base_location_prices', boolean $adjust_non_base_location_prices )
+apply_filters( 'woocommerce_adjust_non_base_location_prices', bool $adjust_non_base_location_prices )
 ```


-**Note: Matches filter name in WooCommerce core.**
+**Note:** Matches filter name in WooCommerce core.

 ### Description

@@ -389,33 +476,17 @@ The woocommerce_adjust_non_base_location_prices filter can stop base taxes being

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $adjust_non_base_location_prices | boolean | True by default. |
+| $adjust_non_base_location_prices | bool | True by default. |

 ### Returns


-`boolean`
-
-### Source
-
-
-- [StoreApi/Utilities/ProductQuery.php](../../../../../woocommerce/src/StoreApi/Utilities/ProductQuery.php)
-
----
-
-## woocommerce_apply_base_tax_for_local_pickup
-
-
-
-
-```php
-apply_filters( 'woocommerce_apply_base_tax_for_local_pickup' )
-```
+`bool`

 ### Source

-
-- [Shipping/ShippingController.php](../../../../../woocommerce/src/Blocks/Shipping/ShippingController.php)
+- [Blocks/BlockTypes/ProductCollection/QueryBuilder.php](../../../../../../src/Blocks/BlockTypes/ProductCollection/QueryBuilder.php)
+- [StoreApi/Utilities/ProductQuery.php](../../../../../../src/StoreApi/Utilities/ProductQuery.php)

 ---

@@ -429,7 +500,7 @@ apply_filters( 'woocommerce_apply_individual_use_coupon', array $coupons, \WC_Co
 ```


-**Note: Matches filter name in WooCommerce core.**
+**Note:** Matches filter name in WooCommerce core.

 ### Parameters

@@ -446,8 +517,7 @@ apply_filters( 'woocommerce_apply_individual_use_coupon', array $coupons, \WC_Co

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

@@ -457,17 +527,17 @@ apply_filters( 'woocommerce_apply_individual_use_coupon', array $coupons, \WC_Co
 Filters if a coupon can be applied alongside other individual use coupons.

 ```php
-apply_filters( 'woocommerce_apply_with_individual_use_coupon', boolean $apply_with_individual_use_coupon, \WC_Coupon $coupon, \WC_Coupon $individual_use_coupon, array $applied_coupons )
+apply_filters( 'woocommerce_apply_with_individual_use_coupon', bool $apply_with_individual_use_coupon, \WC_Coupon $coupon, \WC_Coupon $individual_use_coupon, array $applied_coupons )
 ```


-**Note: Matches filter name in WooCommerce core.**
+**Note:** Matches filter name in WooCommerce core.

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $apply_with_individual_use_coupon | boolean | Defaults to false. |
+| $apply_with_individual_use_coupon | bool | Defaults to false. |
 | $coupon | \WC_Coupon | Coupon object applied to the cart. |
 | $individual_use_coupon | \WC_Coupon | Individual use coupon already applied to the cart. |
 | $applied_coupons | array | Array of applied coupons already applied to the cart. |
@@ -475,12 +545,11 @@ apply_filters( 'woocommerce_apply_with_individual_use_coupon', boolean $apply_wi
 ### Returns


-`boolean`
+`bool`

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

@@ -490,44 +559,109 @@ apply_filters( 'woocommerce_apply_with_individual_use_coupon', boolean $apply_wi
 When extensions implement their equivalent blocks of the template hook functions, they can use this filter to register their old hooked data here, so in the blockified template, the old hooked functions can be removed in favor of the new blocks while keeping the old hooked functions working in classic templates.

 ```php
-apply_filters( 'woocommerce_blocks_hook_compatibility_additional_data', array $data )
+apply_filters( 'woocommerce_blocks_hook_compatibility_additional_data', array $data, string $class_name )
 ```

 ### Description

-Accepts an array of hooked data. The array should be in the following format: [ [ hook =&gt; &lt;hook-name&gt;, function =&gt; &lt;function-name&gt;, priority =&gt; &lt;priority&gt;, ], ... ] Where:
+Accepts an array of hooked data. The array should be in the following format: [ [ hook => `<hook-name>`, function => `<function-name>`, priority => `<priority>`, ], ... ] Where:

-- `hook-name` is the name of the hook that has the functions hooked to.
-- `function-name` is the hooked function name.
-- `priority` is the priority of the hooked function.
+- hook-name is the name of the hook that have the functions hooked to.
+- function-name is the hooked function name.
+- priority is the priority of the hooked function.

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
 | $data | array | Additional hooked data. Default to empty |
+| $class_name | string | Class name within which the hook is called. Either ArchiveProductTemplatesCompatibility or SingleProductTemplateCompatibility. |
+
+### Source
+
+- [Blocks/Templates/AbstractTemplateCompatibility.php](../../../../../../src/Blocks/Templates/AbstractTemplateCompatibility.php)
+
+---
+
+## woocommerce_blocks_pre_get_routes_from_namespace
+
+
+Gives opportunity to return routes without invoking the compute intensive REST API.
+
+```php
+apply_filters( 'woocommerce_blocks_pre_get_routes_from_namespace', array $routes, string $namespace, string $context )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $routes | array | Array of routes. |
+| $namespace | string | Namespace for routes. |
+| $context | string | Context, can be edit or view. |
+
+### Source
+
+- [Blocks/BlockTypes/AbstractBlock.php](../../../../../../src/Blocks/BlockTypes/AbstractBlock.php)
+
+---
+
+## woocommerce_blocks_product_filters_selected_items
+
+
+Filter hook to modify the selected filter items.
+
+```php
+apply_filters( 'woocommerce_blocks_product_filters_selected_items' )
+```

 ### Source

+- [Blocks/BlockTypes/ProductFilters.php](../../../../../../src/Blocks/BlockTypes/ProductFilters.php)
+
+---
+
+## woocommerce_blocks_product_grid_add_to_cart_attributes
+
+
+Filter to manipulate (add/modify/remove) attributes in the HTML code of the generated add to cart button.
+
+```php
+apply_filters( 'woocommerce_blocks_product_grid_add_to_cart_attributes', array $attributes, \WC_Product $product )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $attributes | array | An associative array containing default HTML attributes of the add to cart button. |
+| $product | \WC_Product | The WC_Product instance of the product that will be added to the cart once the button is pressed. |
+
+### Returns
+
+
+`array` Returns an associative array derived from the default array passed as an argument and added the extra HTML attributes.
+
+### Source

-- [Templates/AbstractTemplateCompatibility.php](../../../../../woocommerce/src/Blocks/Templates/AbstractTemplateCompatibility.php)
+- [Blocks/BlockTypes/AbstractProductGrid.php](../../../../../../src/Blocks/BlockTypes/AbstractProductGrid.php)

 ---

 ## woocommerce_blocks_product_grid_is_cacheable


-Filters whether the product grid is cacheable.
+Filters whether or not the product grid is cacheable.

 ```php
-apply_filters( 'woocommerce_blocks_product_grid_is_cacheable', boolean $is_cacheable, array $query_args )
+apply_filters( 'woocommerce_blocks_product_grid_is_cacheable', bool $is_cacheable, array $query_args )
 ```

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $is_cacheable | boolean | The list of script dependencies. |
+| $is_cacheable | bool | The list of script dependencies. |
 | $query_args | array | Query args for the products query passed to BlocksWpQuery. |

 ### Returns
@@ -537,8 +671,7 @@ apply_filters( 'woocommerce_blocks_product_grid_is_cacheable', boolean $is_cache

 ### Source

-
-- [BlockTypes/AbstractProductGrid.php](../../../../../woocommerce/src/Blocks/BlockTypes/AbstractProductGrid.php)
+- [Blocks/BlockTypes/AbstractProductGrid.php](../../../../../../src/Blocks/BlockTypes/AbstractProductGrid.php)

 ---

@@ -566,8 +699,7 @@ apply_filters( 'woocommerce_blocks_product_grid_item_html', string $html, array

 ### Source

-
-- [BlockTypes/AbstractProductGrid.php](../../../../../woocommerce/src/Blocks/BlockTypes/AbstractProductGrid.php)
+- [Blocks/BlockTypes/AbstractProductGrid.php](../../../../../../src/Blocks/BlockTypes/AbstractProductGrid.php)

 ---

@@ -594,8 +726,71 @@ apply_filters( 'woocommerce_blocks_register_script_dependencies', array $depende

 ### Source

+- [Blocks/Assets/Api.php](../../../../../../src/Blocks/Assets/Api.php)
+
+---
+
+## woocommerce_breadcrumb_home_url
+
+
+Filters the Home breadcrumb URL.
+
+```php
+apply_filters( 'woocommerce_breadcrumb_home_url', string $url )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $url | string | The Home breadcrumb URL. |
+
+### Source
+
+- [Blocks/CoreBreadcrumbsCompatibility.php](../../../../../../src/Blocks/CoreBreadcrumbsCompatibility.php)
+
+---
+
+## woocommerce_breadcrumb_main_term
+
+
+Filters the main term used in product breadcrumbs.
+
+```php
+apply_filters( 'woocommerce_breadcrumb_main_term', \WP_Term $main_term, \WP_Term[] $terms )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $main_term | \WP_Term | The main term to be used in breadcrumbs. |
+| $terms | \WP_Term[] | Array of all product category terms. |
+
+### Source
+
+- [Blocks/CoreBreadcrumbsCompatibility.php](../../../../../../src/Blocks/CoreBreadcrumbsCompatibility.php)
+
+---
+
+## woocommerce_breadcrumb_product_terms_args
+
+
+Filters the arguments used to fetch product terms for breadcrumbs.
+
+```php
+apply_filters( 'woocommerce_breadcrumb_product_terms_args', array $args )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $args | array | Array of arguments for `wc_get_product_terms()`. |
+
+### Source

-- [Assets/Api.php](../../../../../woocommerce/src/Blocks/Assets/Api.php)
+- [Blocks/CoreBreadcrumbsCompatibility.php](../../../../../../src/Blocks/CoreBreadcrumbsCompatibility.php)

 ---

@@ -609,7 +804,7 @@ apply_filters( 'woocommerce_cart_contents_changed', array $cart_contents )
 ```


-**Note: Matches filter name in WooCommerce core.**
+**Note:** Matches filter name in WooCommerce core.

 ### Parameters

@@ -624,8 +819,7 @@ apply_filters( 'woocommerce_cart_contents_changed', array $cart_contents )

 ### Source

-
-- [StoreApi/Utilities/CartController.php](../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+- [StoreApi/Utilities/CartController.php](../../../../../../src/StoreApi/Utilities/CartController.php)

 ---

@@ -652,399 +846,726 @@ This is a hook taken from the legacy cart/mini-cart templates that allows the pe

 ### Source

-
-- [StoreApi/Schemas/V1/CartItemSchema.php](../../../../../woocommerce/src/StoreApi/Schemas/V1/CartItemSchema.php)
+- [StoreApi/Schemas/V1/CartItemSchema.php](../../../../../../src/StoreApi/Schemas/V1/CartItemSchema.php)

 ---

-## woocommerce_disable_compatibility_layer
+## woocommerce_checkout_must_be_logged_in_message


-Filter to disable the compatibility layer for the blockified templates.
+Filter to customize the checkout message when a user must be logged in.

 ```php
-apply_filters( 'woocommerce_disable_compatibility_layer', \Automattic\WooCommerce\Blocks\Templates\boolean. $argument0 )
+apply_filters( 'woocommerce_checkout_must_be_logged_in_message', string $message )
 ```

-### Description
-
-This hook allows to disable the compatibility layer for the blockified.
-
 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| 1 | \Automattic\WooCommerce\Blocks\Templates\boolean. | |
+| $message | string | Message to display when a user must be logged in to check out. |

 ### Source

-
-- [Templates/AbstractTemplateCompatibility.php](../../../../../woocommerce/src/Blocks/Templates/AbstractTemplateCompatibility.php)
-- [Templates/AbstractTemplateCompatibility.php](../../../../../woocommerce/src/Blocks/Templates/AbstractTemplateCompatibility.php)
+- [StoreApi/Routes/V1/Checkout.php](../../../../../../src/StoreApi/Routes/V1/Checkout.php)

 ---

-## woocommerce_ga_disable_tracking
+## woocommerce_delete_expired_draft_orders_batch_size


-Filter to disable Google Analytics tracking.
+Filters the number of draft orders deleted per batch during cleanup.

 ```php
-apply_filters( 'woocommerce_ga_disable_tracking', boolean $disable_tracking )
+apply_filters( 'woocommerce_delete_expired_draft_orders_batch_size', int $batch_size )
 ```

+### Description

-**Note: Matches filter name in GA extension.**
+Increasing this value can help improve deletion throughput for high-volume or busy stores when the cleanup task cannot keep up with the draft orders backlog.

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $disable_tracking | boolean | If true, tracking will be disabled. |
+| $batch_size | int | Number of draft orders to delete per batch. Default 20. |

 ### Source

-
-- [Domain/Services/GoogleAnalytics.php](../../../../../woocommerce/src/Blocks/Domain/Services/GoogleAnalytics.php)
+- [Blocks/Domain/Services/DraftOrders.php](../../../../../../src/Blocks/Domain/Services/DraftOrders.php)

 ---

-## woocommerce_get_item_data
+## woocommerce_disable_compatibility_layer


-Filters cart item data.
+Filter to disable the compatibility layer for the blockified templates.

 ```php
-apply_filters( 'woocommerce_get_item_data', array $item_data, array $cart_item )
+apply_filters( 'woocommerce_disable_compatibility_layer', bool $is_disabled_compatibility_layer )
 ```

-
-**Note: Matches filter name in WooCommerce core.**
-
 ### Description

-Filters the variation option name for custom option slugs.
+This hook allows to disable the compatibility layer for the blockified templates.

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $item_data | array | Cart item data. Empty by default. |
-| $cart_item | array | Cart item array. |
-
-### Returns
-
-
-`array`
+| $is_disabled_compatibility_layer | bool | Whether the compatibility layer should be disabled. |

 ### Source

-
-- [StoreApi/Schemas/V1/CartItemSchema.php](../../../../../woocommerce/src/StoreApi/Schemas/V1/CartItemSchema.php)
+- [Blocks/Templates/AbstractTemplateCompatibility.php](../../../../../../src/Blocks/Templates/AbstractTemplateCompatibility.php)
+- [Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/AddToCartWithOptions.php)
+- [Blocks/BlockTypes/ProductDetails.php](../../../../../../src/Blocks/BlockTypes/ProductDetails.php)

 ---

-## woocommerce_loop_add_to_cart_args
+## woocommerce_filter_fields_for_order_confirmation


-Allow filtering of the add to cart button arguments.
+Filter fields for order confirmation (thank you page, email).

 ```php
-apply_filters( 'woocommerce_loop_add_to_cart_args' )
+apply_filters( 'woocommerce_filter_fields_for_order_confirmation', bool $show_field, array $field, array $fields, array $context, \CheckoutFields $instance )
 ```

-### Source
+### Description
+
+Used in methods: WC_Email::additional_checkout_fields WC_Email::additional_address_fields CheckoutFieldsFrontend::render_order_other_fields CheckoutFieldsFrontend::render_order_address_fields AdditionalFields::render_content BillingAddress::render_content ShippingAddress::render_content
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $show_field | bool | Whether the field should be shown. |
+| $field | array | Field data. |
+| $fields | array | All fields for better context when field should be shown or hidden based on other fields values. |
+| $context | array | Additional context for the filter. Data depends in which method filter_fields_for_order_confirmation is called. |
+| $instance | \CheckoutFields | The CheckoutFields instance. |

+### Source

-- [BlockTypes/ProductButton.php](../../../../../woocommerce/src/Blocks/BlockTypes/ProductButton.php)
+- [Blocks/Domain/Services/CheckoutFields.php](../../../../../../src/Blocks/Domain/Services/CheckoutFields.php)

 ---

-## woocommerce_loop_add_to_cart_link
+## woocommerce_ga_disable_tracking


-Filters the add to cart button class.
+Filter to disable Google Analytics tracking.

 ```php
-apply_filters( 'woocommerce_loop_add_to_cart_link', string $class )
+apply_filters( 'woocommerce_ga_disable_tracking', bool $disable_tracking )
 ```

+
+**Note:** Matches filter name in GA extension.
+
 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $class | string | The class. |
+| $disable_tracking | bool | If true, tracking will be disabled. |

 ### Source

-
-- [BlockTypes/ProductButton.php](../../../../../woocommerce/src/Blocks/BlockTypes/ProductButton.php)
+- [Blocks/Domain/Services/GoogleAnalytics.php](../../../../../../src/Blocks/Domain/Services/GoogleAnalytics.php)

 ---

-## woocommerce_new_customer_data
+## woocommerce_get_block_types


-Filters customer data before a customer account is registered.
+Filters the list of allowed block types.

 ```php
-apply_filters( 'woocommerce_new_customer_data', array $add_to_cart_data )
+apply_filters( 'woocommerce_get_block_types', array $block_types )
 ```

-### Description
-
-This hook filters customer data. It allows user data to be changed, for example, username, password, email, first name, last name, and role.
-
 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $customer_data | array | An array of customer (user) data. |
-
-### Returns
-
-
-`array`
+| $block_types | array | List of block types. |

 ### Source

-
-- [StoreApi/Routes/V1/Checkout.php](../../../../../woocommerce/src/StoreApi/Routes/V1/Checkout.php)
+- [Blocks/BlockTypesController.php](../../../../../../src/Blocks/BlockTypesController.php)

 ---

-## woocommerce_pay_order_product_has_enough_stock
+## woocommerce_get_breadcrumb


-Filters whether or not the product has enough stock.
+Filters the breadcrumb trail array.

 ```php
-apply_filters( 'woocommerce_pay_order_product_has_enough_stock', boolean $argument0, \WC_Product $product, \WC_Order $order )
+apply_filters( 'woocommerce_get_breadcrumb', array $crumbs, \WC_Breadcrumb|null $breadcrumb )
 ```

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| 1 | boolean | True if has enough stock. |
-| $product | \WC_Product | Product. |
-| $order | \WC_Order | Order. |
+| $crumbs | array | The breadcrumb trail. |
+| $breadcrumb | \WC_Breadcrumb, null | The breadcrumb object (null when called from Core block). |

 ### Source

-
-- [StoreApi/Utilities/OrderController.php](../../../../../woocommerce/src/StoreApi/Utilities/OrderController.php)
+- [Blocks/CoreBreadcrumbsCompatibility.php](../../../../../../src/Blocks/CoreBreadcrumbsCompatibility.php)

 ---

-## woocommerce_pay_order_product_in_stock
+## `woocommerce_get_default_value_for_{$key}`


-Filters whether or not the product is in stock for this pay for order.
+Allow providing a default value for additional fields if no value is already set.

 ```php
-apply_filters( 'woocommerce_pay_order_product_in_stock', boolean $argument0, \WC_Product $product, \WC_Order $order )
+apply_filters( 'woocommerce_get_default_value_for_{$key}', null $value, string $group, \WC_Data $wc_object )
 ```

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| 1 | boolean | True if in stock. |
-| $product | \WC_Product | Product. |
-| $order | \WC_Order | Order. |
+| $value | null | The default value for the filter, always null. |
+| $group | string | The group of this key (shipping\|billing\|other). |
+| $wc_object | \WC_Data | The object to get the field value for. |

 ### Source

-
-- [StoreApi/Utilities/OrderController.php](../../../../../woocommerce/src/StoreApi/Utilities/OrderController.php)
+- [Blocks/Domain/Services/CheckoutFields.php](../../../../../../src/Blocks/Domain/Services/CheckoutFields.php)

 ---

-## woocommerce_registration_errors
+## `woocommerce_get_default_value_for_{$missing_field}`


-Filters registration errors before a customer account is registered.
+Allow providing a default value for additional fields if no value is already set.

 ```php
-apply_filters( 'woocommerce_registration_errors', \WP_Error $errors, string $username, string $user_email )
+apply_filters( 'woocommerce_get_default_value_for_{$missing_field}', null $value, string $group, \WC_Data $wc_object )
 ```

-
-**Note: Matches filter name in WooCommerce core.**
-
-### Description
-
-This hook filters registration errors. This can be used to manipulate the array of errors before they are displayed.
-
 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $errors | \WP_Error | Error object. |
-| $username | string | Customer username. |
-| $user_email | string | Customer email address. |
-
-### Returns
-
-
-`\WP_Error`
+| $value | null | The default value for the filter, always null. |
+| $group | string | The group of this key (shipping\|billing\|other). |
+| $wc_object | \WC_Data | The object to get the field value for. |

 ### Source

+- [Blocks/Domain/Services/CheckoutFields.php](../../../../../../src/Blocks/Domain/Services/CheckoutFields.php)

-- [StoreApi/Routes/V1/Checkout.php](../../../../../woocommerce/src/StoreApi/Routes/V1/Checkout.php)
+---
+
+## woocommerce_get_item_data
+
+
+Filters cart item data.
+
+```php
+apply_filters( 'woocommerce_get_item_data', array $item_data, array $cart_item )
+```
+
+
+**Note:** Matches filter name in WooCommerce core.
+
+### Description
+
+Filters the variation option name for custom option slugs.
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $item_data | array | Cart item data. Empty by default. |
+| $cart_item | array | Cart item array. |
+
+### Returns
+
+
+`array`
+
+### Source
+
+- [StoreApi/Schemas/V1/CartItemSchema.php](../../../../../../src/StoreApi/Schemas/V1/CartItemSchema.php)

 ---

-## ~~woocommerce_shared_settings~~
+## woocommerce_hooked_blocks_pattern_exclude_list


-Filters the array of shared settings.
+A list of pattern slugs to exclude from auto-insert (useful when there are patterns that have a very specific location for the block) Note: The patterns that are currently excluded are the ones that don't work well with the mini-cart block or customer-account block.

 ```php
-apply_filters( 'woocommerce_shared_settings', array $data )
+apply_filters( 'woocommerce_hooked_blocks_pattern_exclude_list' )
 ```

-<!-- markdownlint-disable-next-line MD036 -->
-**Deprecated: This hook is deprecated and will be removed**
+### Source
+
+- [Blocks/Utils/BlockHooksTrait.php](../../../../../../src/Blocks/Utils/BlockHooksTrait.php)
+
+---
+
+## woocommerce_hydration_dispatch_request
+
+
+Similar to WP core's `rest_dispatch_request` filter, this allows plugin to override hydrating the request.
+
+```php
+apply_filters( 'woocommerce_hydration_dispatch_request', mixed $hydration_result, \WP_REST_Request $request, string $path, array $handler )
+```

 ### Description

-Low level hook for registration of new data late in the cycle. This is deprecated. Instead, use the data api:
+Allows backward compatibility with the `rest_dispatch_request` filter by providing the same arguments.
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $hydration_result | mixed | Result of the hydration. If not null, this will be used as the response. |
+| $request | \WP_REST_Request | Request used to generate the response. |
+| $path | string | Request path matched for the request.. |
+| $handler | array | Route handler used for the request. |
+
+### Source
+
+- [Blocks/Domain/Services/Hydration.php](../../../../../../src/Blocks/Domain/Services/Hydration.php)
+
+---
+
+## woocommerce_hydration_request_after_callbacks
+
+
+Similar to WP core's `rest_request_after_callbacks` filter, this allows to modify the response after it has been generated.

 ```php
-Automattic\WooCommerce\Blocks\Package::container()->get( Automattic\WooCommerce\Blocks\Assets\AssetDataRegistry::class )->add( $key, $value )
+apply_filters( 'woocommerce_hydration_request_after_callbacks', \WP_REST_Response|\WP_HTTP_Response|\WP_Error|mixed $response, array $handler, \WP_REST_Request $request )
 ```

+### Description
+
+Allows backward compatibility with the `rest_request_after_callbacks` filter by providing the same arguments.
+
 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $data | array | Settings data. |
+| $response | \WP_REST_Response, \WP_HTTP_Response, \WP_Error, mixed | Result to send to the client. Usually a WP_REST_Response or WP_Error. |
+| $handler | array | Route handler used for the request. |
+| $request | \WP_REST_Request | Request used to generate the response. |

-### Returns
+### Source

+- [Blocks/Domain/Services/Hydration.php](../../../../../../src/Blocks/Domain/Services/Hydration.php)

-`array`
+---
+
+## woocommerce_loop_add_to_cart_args
+
+
+Allow filtering of the add to cart button arguments.
+
+```php
+apply_filters( 'woocommerce_loop_add_to_cart_args' )
+```

 ### Source

+- [Blocks/BlockTypes/ProductButton.php](../../../../../../src/Blocks/BlockTypes/ProductButton.php)
+
+---
+
+## woocommerce_loop_add_to_cart_link
+

-- [Assets/AssetDataRegistry.php](../../../../../woocommerce/src/Blocks/Assets/AssetDataRegistry.php)
+Filters the add to cart button class.
+
+```php
+apply_filters( 'woocommerce_loop_add_to_cart_link', string $class )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $class | string | The class. |
+
+### Source
+
+- [Blocks/BlockTypes/ProductButton.php](../../../../../../src/Blocks/BlockTypes/ProductButton.php)

 ---

-## woocommerce_shipping_package_name
+## woocommerce_order_email_verification_grace_period


-Filters the shipping package name.
+Controls the grace period within which we do not require any sort of email verification step before rendering the 'order received' or 'order pay' pages.

 ```php
-apply_filters( 'woocommerce_shipping_package_name', string $shipping_package_name, string $package_id, array $package, int $total_packages )
+apply_filters( 'woocommerce_order_email_verification_grace_period', int $grace_period, \WC_Order $order, string $context )
 ```

+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $grace_period | int | Time in seconds after an order is placed before email verification may be required. |
+| $order | \WC_Order | The order for which this grace period is being assessed. |
+| $context | string | Indicates the context in which we might verify the email address. Typically 'order-pay' or 'order-received'. |
+
+### See
+
+- WC_Shortcode_Checkout::order_received()
+
+### Source
+
+- [Blocks/BlockTypes/OrderConfirmation/AbstractOrderConfirmationBlock.php](../../../../../../src/Blocks/BlockTypes/OrderConfirmation/AbstractOrderConfirmationBlock.php)
+
+---
+
+## woocommerce_order_email_verification_required
+

-**Note: Matches filter name in WooCommerce core.**
+Provides an opportunity to override the (potential) requirement for shoppers to verify their email address before we show information such as the order summary, or order payment page.
+
+```php
+apply_filters( 'woocommerce_order_email_verification_required', bool $email_verification_required, \WC_Order $order, string $context )
+```

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $shipping_package_name | string | Shipping package name. |
-| $package_id | string | Shipping package ID. |
-| $package | array | Shipping package from WooCommerce. |
-| $total_packages | int | Total number of shipping packages. |
+| $email_verification_required | bool | If email verification is required. |
+| $order | \WC_Order | The relevant order. |
+| $context | string | The context under which we are performing this check. |

-### Returns
+### See
+
+- WC_Shortcode_Checkout::order_received()
+
+### Source

+- [Blocks/BlockTypes/OrderConfirmation/AbstractOrderConfirmationBlock.php](../../../../../../src/Blocks/BlockTypes/OrderConfirmation/AbstractOrderConfirmationBlock.php)

-`string` Shipping package name.
+---
+
+## woocommerce_order_received_verify_known_shoppers
+
+
+Indicates if known (non-guest) shoppers need to be logged in before we let them access the order received page.
+
+```php
+apply_filters( 'woocommerce_order_received_verify_known_shoppers', bool $verify_known_shoppers )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $verify_known_shoppers | bool | If verification is required. |

 ### Source

+- [Blocks/BlockTypes/OrderConfirmation/AbstractOrderConfirmationBlock.php](../../../../../../src/Blocks/BlockTypes/OrderConfirmation/AbstractOrderConfirmationBlock.php)
+
+---
+
+## woocommerce_order_shipping_to_display_tax_label
+
+
+Hook to add tax label to pickup cost.
+
+```php
+apply_filters( 'woocommerce_order_shipping_to_display_tax_label', string $tax_label, \WC_Order $order, string $tax_display )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $tax_label | string | Tax label. |
+| $order | \WC_Order | Order object. |
+| $tax_display | string | Tax display. |
+
+### Returns
+
+
+`string`

-- [StoreApi/Utilities/CartController.php](../../../../../woocommerce/src/StoreApi/Utilities/CartController.php)
+### Source
+
+- [Blocks/Shipping/ShippingController.php](../../../../../../src/Blocks/Shipping/ShippingController.php)

 ---

-## woocommerce_shipping_{$this->id}_is_available
+## woocommerce_pay_order_product_has_enough_stock


+Filters whether or not the product has enough stock.

+```php
+apply_filters( 'woocommerce_pay_order_product_has_enough_stock', bool $has_enough_stock, \WC_Product $product, \WC_Order|\WC_Order_Refund|false $order )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $has_enough_stock | bool | True if has enough stock. |
+| $product | \WC_Product | Product. |
+| $order | \WC_Order, \WC_Order_Refund, false | Order. |
+
+### Source
+
+- [StoreApi/Utilities/OrderController.php](../../../../../../src/StoreApi/Utilities/OrderController.php)
+
+---
+
+## woocommerce_pay_order_product_in_stock
+
+
+Filters whether or not the product is in stock for this pay for order.

 ```php
-apply_filters( 'woocommerce_shipping_{$this->id}_is_available' )
+apply_filters( 'woocommerce_pay_order_product_in_stock', bool $is_in_stock, \WC_Product $product, \WC_Order|\WC_Order_Refund|false $order )
 ```

+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $is_in_stock | bool | True if in stock. |
+| $product | \WC_Product | Product. |
+| $order | \WC_Order, \WC_Order_Refund, false | Order. |
+
 ### Source

+- [StoreApi/Utilities/OrderController.php](../../../../../../src/StoreApi/Utilities/OrderController.php)
+
+---
+
+## woocommerce_product_details_hooked_blocks
+
+
+Filter the blocks that are hooked into the Product Details block.
+
+```php
+apply_filters( 'woocommerce_product_details_hooked_blocks', array $hooked_blocks )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $hooked_blocks | array | The blocks that are hooked into the Product Details block. |
+
+### Returns
+

-- [Shipping/PickupLocation.php](../../../../../woocommerce/src/Blocks/Shipping/PickupLocation.php)
+`array` The blocks that are hooked into the Product Details block.
+
+### Source
+
+- [Blocks/BlockTypes/ProductDetails.php](../../../../../../src/Blocks/BlockTypes/ProductDetails.php)

 ---

-## woocommerce_show_page_title
+## woocommerce_product_image_loading_attr


-Hook: woocommerce_show_page_title
+Filters the loading attribute for product images.

 ```php
-apply_filters( 'woocommerce_show_page_title' )
+apply_filters( 'woocommerce_product_image_loading_attr', string $loading_attr, int $image_id )
 ```

 ### Description

-Allows controlling the display of the page title.
+Allowed values are 'lazy', 'eager', and 'auto'. Any other value will result in default browser behavior.
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $loading_attr | string | The loading attribute. Default 'lazy'. |
+| $image_id | int | Target image ID. |

 ### Source

+- [Blocks/BlockTypes/ProductImage.php](../../../../../../src/Blocks/BlockTypes/ProductImage.php)
+
+---
+
+## woocommerce_product_review_comment_form_args
+
+
+Filters the comment form arguments.
+
+```php
+apply_filters( 'woocommerce_product_review_comment_form_args', array $comment_form, int $post_id )
+```

-- [BlockTypes/ClassicTemplate.php](../../../../../woocommerce/src/Blocks/BlockTypes/ClassicTemplate.php)
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $comment_form | array | The comment form arguments. |
+| $post_id | int | The post ID. |
+
+### Source
+
+- [Blocks/BlockTypes/Reviews/ProductReviewForm.php](../../../../../../src/Blocks/BlockTypes/Reviews/ProductReviewForm.php)

 ---

-## woocommerce_single_product_image_thumbnail_html
+## woocommerce_product_tabs


-Filter the HTML markup for a single product image thumbnail in the gallery.
+Filter the product tabs in the product details block.

 ```php
-apply_filters( 'woocommerce_single_product_image_thumbnail_html', string $thumbnail_html, int $attachment_id )
+apply_filters( 'woocommerce_product_tabs', array $tabs )
 ```

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $thumbnail_html | string | The HTML markup for the thumbnail. |
-| $attachment_id | int | The attachment ID of the thumbnail. |
+| $tabs | array | Array of product tabs. |

 ### Source

+- [Blocks/BlockTypes/ProductDetails.php](../../../../../../src/Blocks/BlockTypes/ProductDetails.php)
+
+---
+
+## woocommerce_quantity_input_placeholder
+
+
+Filter the placeholder value allowed for the product.
+
+```php
+apply_filters( 'woocommerce_quantity_input_placeholder', int $max_value, \WC_Product $product )
+```
+
+### Parameters

-- [BlockTypes/ProductGalleryThumbnails.php](../../../../../woocommerce/src/Blocks/BlockTypes/ProductGalleryThumbnails.php)
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $max_value | int | Maximum quantity value. |
+| $product | \WC_Product | Product object. |
+
+### Source
+
+- [Blocks/BlockTypes/AddToCartWithOptions/GroupedProductItemSelector.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/GroupedProductItemSelector.php)

 ---

-## woocommerce_store_api_add_to_cart_data
+## woocommerce_return_previous_exceptions


-Filters cart item data sent via the API before it is passed to the cart controller.
+Allows to check if WP_DEBUG mode is enabled before returning previous Exception.
+
+```php
+apply_filters( 'woocommerce_return_previous_exceptions', bool $ )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $ | bool | The WP_DEBUG mode. |
+
+### Source
+
+- [StoreApi/Utilities/CheckoutTrait.php](../../../../../../src/StoreApi/Utilities/CheckoutTrait.php)
+
+---
+
+## woocommerce_sale_badge_text
+
+
+Filters the product sale badge text.

 ```php
-apply_filters( 'woocommerce_store_api_add_to_cart_data', array $customer_data )
+apply_filters( 'woocommerce_sale_badge_text', string $sale_text, \WC_Product $product )
 ```

+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $sale_text | string | The sale badge text. |
+| $product | \WC_Product | The product object. |
+
+### Returns
+
+
+`string` The filtered sale badge text.
+
+### Source
+
+- [Blocks/BlockTypes/ProductSaleBadge.php](../../../../../../src/Blocks/BlockTypes/ProductSaleBadge.php)
+
+---
+
+## woocommerce_sanitize_additional_field
+
+
+Allow custom sanitization of an additional field.
+
+```php
+apply_filters( 'woocommerce_sanitize_additional_field', mixed $field_value, string $field_key )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $field_value | mixed | The value of the field being sanitized. |
+| $field_key | string | Key of the field being sanitized. |
+
+### Source
+
+- [Blocks/Domain/Services/CheckoutFields.php](../../../../../../src/Blocks/Domain/Services/CheckoutFields.php)
+
+---
+
+## ~~woocommerce_shared_settings~~
+
+
+Filters the array of shared settings.
+
+```php
+apply_filters( 'woocommerce_shared_settings', array $data )
+```
+
+
+**Deprecated:** This hook is deprecated and will be removed
+
 ### Description

-This hook filters cart items. It allows the request data to be changed, for example, quantity, or supplemental cart item data, before it is passed into CartController::add_to_cart and stored to session. CartController::add_to_cart only expects the keys id, quantity, variation, and cart_item_data, so other values may be ignored. CartController::add_to_cart (and core) do already have a filter hook called woocommerce_add_cart_item, but this does not have access to the original Store API request like this hook does.
+Low level hook for registration of new data late in the cycle. This is deprecated. Instead, use the data api:
+
+```php
+Automattic\WooCommerce\Blocks\Package::container()->get( Automattic\WooCommerce\Blocks\Assets\AssetDataRegistry::class )->add( $key, $value )
+```

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $customer_data | array | An array of customer (user) data. |
+| $data | array | Settings data. |

 ### Returns

@@ -1053,62 +1574,104 @@ This hook filters cart items. It allows the request data to be changed, for exam

 ### Source

+- [Blocks/Assets/AssetDataRegistry.php](../../../../../../src/Blocks/Assets/AssetDataRegistry.php)
+
+---
+
+## woocommerce_should_register_blocks
+
+
+Filters whether WooCommerce should register its block types and patterns for the current request.
+
+```php
+apply_filters( 'woocommerce_should_register_blocks', bool $should_register )
+```
+
+### Description
+
+Registration is skipped on known non-rendering contexts (the Store API and other WooCommerce REST namespaces, cron, AJAX, XML-RPC, favicon, robots.txt and XML sitemaps) as a performance optimisation. Product and variation descriptions rendered through do_blocks are already handled on demand (see the woocommerce_short_description hook in Bootstrap), so this filter is only needed to opt back in when an extension renders WooCommerce blocks some other way in one of those contexts.

-- [StoreApi/Routes/V1/CartAddItem.php](../../../../../woocommerce/src/StoreApi/Routes/V1/CartAddItem.php)
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $should_register | bool | Whether block types and patterns should be registered for this request. |
+
+### Source
+
+- [Blocks/Domain/BlockRegistrationContext.php](../../../../../../src/Blocks/Domain/BlockRegistrationContext.php)

 ---

-## woocommerce_store_api_disable_nonce_check
+## woocommerce_show_page_title


-Filters the Store API nonce check.
+Hook: woocommerce_show_page_title

 ```php
-apply_filters( 'woocommerce_store_api_disable_nonce_check', boolean $disable_nonce_check )
+apply_filters( 'woocommerce_show_page_title' )
 ```

 ### Description

-This can be used to disable the nonce check when testing API endpoints via a REST API client.
+Allows controlling the display of the page title.
+
+### Source
+
+- [Blocks/BlockTypes/ClassicTemplate.php](../../../../../../src/Blocks/BlockTypes/ClassicTemplate.php)
+
+---
+
+## woocommerce_sortable_taxonomies
+
+
+Filters the list of taxonomies that support custom ordering. Filter was introduced long ago is only documented in 10.6.0.
+
+```php
+apply_filters( 'woocommerce_sortable_taxonomies', array $sortable_taxonomies )
+```
+
+### Description
+
+First instance in plugins/woocommerce/includes/admin/class-wc-admin-assets.php.

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $disable_nonce_check | boolean | If true, nonce checks will be disabled. |
+| $sortable_taxonomies | array | List of taxonomy slugs that support custom ordering. |

 ### Returns


-`boolean`
+`array` List of taxonomy slugs that support custom ordering.

 ### Source

-
-- [StoreApi/Routes/V1/AbstractCartRoute.php](../../../../../woocommerce/src/StoreApi/Routes/V1/AbstractCartRoute.php)
+- [Blocks/BlockTypes/ProductFilterTaxonomy.php](../../../../../../src/Blocks/BlockTypes/ProductFilterTaxonomy.php)

 ---

-## woocommerce_store_api_cart_item_images
+## woocommerce_store_api_add_to_cart_data


-This hook allows the cart item images to be changed. This is specific to the cart endpoint.
+Filters cart item data sent via the API before it is passed to the cart controller.

 ```php
-apply_filters( 'woocommerce_store_api_cart_item_images', array $product_images, array $cart_item, string $cart_item_key )
+apply_filters( 'woocommerce_store_api_add_to_cart_data', array $add_to_cart_data )
 ```

 ### Description

-This hook allows the cart item images to be changed. This is specific to the cart endpoint.
+This hook filters cart items. It allows the request data to be changed, for example, quantity, or supplemental cart item data, before it is passed into CartController::add_to_cart and stored to session.
+
+CartController::add_to_cart only expects the keys id, quantity, variation, and cart_item_data, so other values may be ignored. CartController::add_to_cart (and core) do already have a filter hook called woocommerce_add_cart_item, but this does not have access to the original Store API request like this hook does.

 ### Parameters

-| Argument        | Type   | Description                                       |
-|-----------------|--------|---------------------------------------------------|
-| $product_images | array  | An array of images associated with the cart item. |
-| $cart_item      | array  | The cart item.                                    |
-| $cart_item_key  | string | The cart item key.                                |
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $add_to_cart_data | array | An array of cart item data. |

 ### Returns

@@ -1117,47 +1680,72 @@ This hook allows the cart item images to be changed. This is specific to the car

 ### Source

+- [StoreApi/Routes/V1/CartAddItem.php](../../../../../../src/StoreApi/Routes/V1/CartAddItem.php)
+
+---
+
+## woocommerce_store_api_cart_item_images
+
+
+Filter the cart product images.
+
+```php
+apply_filters( 'woocommerce_store_api_cart_item_images', array $product_images, array $cart_item, string $cart_item_key )
+```
+
+### Description

-- [StoreApi/Schemas/V1/CartItemSchema.php](../../../../../woocommerce/src/StoreApi/Schemas/V1/CartItemSchema.php)
+This hook allows the cart item images to be changed. This is specific to the cart endpoint.
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $product_images | array | Array of image objects, as defined in ImageAttachmentSchema. |
+| $cart_item | array | Cart item array. |
+| $cart_item_key | string | Cart item key. |
+
+### Source
+
+- [StoreApi/Schemas/V1/CartItemSchema.php](../../../../../../src/StoreApi/Schemas/V1/CartItemSchema.php)

 ---

-## woocommerce_store_api_product_quantity_limit
+## woocommerce_store_api_disable_nonce_check


-Filters the quantity limit for a product being added to the cart via the Store API.
+Filters the Store API nonce check.

 ```php
-apply_filters( 'woocommerce_store_api_product_quantity_limit', integer $quantity_limit, \WC_Product $product )
+apply_filters( 'woocommerce_store_api_disable_nonce_check', bool $disable_nonce_check )
 ```

 ### Description

-Filters the variation option name for custom option slugs.
+This can be used to disable the nonce check when testing API endpoints via a REST API client.

 ### Parameters

 | Argument | Type | Description |
 | -------- | ---- | ----------- |
-| $quantity_limit | integer | Quantity limit which defaults to 9999 unless sold individually. |
-| $product | \WC_Product | Product instance. |
+| $disable_nonce_check | bool | If true, nonce checks will be disabled. |

 ### Returns


-`integer`
+`bool`

 ### Source

-
-- [StoreApi/Utilities/QuantityLimits.php](../../../../../woocommerce/src/StoreApi/Utilities/QuantityLimits.php)
+- [StoreApi/Routes/V1/AbstractCartRoute.php](../../../../../../src/StoreApi/Routes/V1/AbstractCartRoute.php)
+- [StoreApi/Routes/V1/ShopperListsNonceCheck.php](../../../../../../src/StoreApi/Routes/V1/ShopperListsNonceCheck.php)

 ---

-## woocommerce_store_api_product_quantity_{$value_type}
+## `woocommerce_store_api_product_quantity_{$value_type}`


-Filters the quantity minimum for a cart item in Store API. This allows extensions to control the minimum qty of items already within the cart.
+Filters a quantity for a cart item in Store API. This allows extensions to control the qty of items.

 ```php
 apply_filters( 'woocommerce_store_api_product_quantity_{$value_type}', mixed $value, \WC_Product $product, array|null $cart_item )
@@ -1182,8 +1770,28 @@ The suffix of the hook will vary depending on the value being filtered. For exam

 ### Source

+- [StoreApi/Utilities/QuantityLimits.php](../../../../../../src/StoreApi/Utilities/QuantityLimits.php)

-- [StoreApi/Utilities/QuantityLimits.php](../../../../../woocommerce/src/StoreApi/Utilities/QuantityLimits.php)
+---
+
+## woocommerce_store_api_rate_limit_id
+
+
+Filters the rate limiting identifier.
+
+```php
+apply_filters( 'woocommerce_store_api_rate_limit_id', string $id )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $id | string | The rate limiting identifier. |
+
+### Source
+
+- [StoreApi/Authentication.php](../../../../../../src/StoreApi/Authentication.php)

 ---

@@ -1209,33 +1817,80 @@ apply_filters( 'woocommerce_store_api_rate_limit_options', array $rate_limit_opt

 ### Source

+- [StoreApi/Utilities/RateLimits.php](../../../../../../src/StoreApi/Utilities/RateLimits.php)
+
+---
+
+## woocommerce_thankyou_order_received_title

-- [StoreApi/Utilities/RateLimits.php](../../../../../woocommerce/src/StoreApi/Utilities/RateLimits.php)
+
+Filter the title shown after a checkout is complete.
+
+```php
+apply_filters( 'woocommerce_thankyou_order_received_title', string $title, \WC_Order|false $order )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $title | string | The title. |
+| $order | \WC_Order, false | The order created during checkout, or false if order data is not available. |
+
+### Source
+
+- [Blocks/BlockTypes/OrderConfirmation/Status.php](../../../../../../src/Blocks/BlockTypes/OrderConfirmation/Status.php)

 ---

-## woocommerce_store_api_rate_limit_id
+## woocommerce_use_block_notices_in_classic_theme


-Filters the identifier to group requests for rate limiting.
+Allow classic theme developers to opt-in to using block notices.

 ```php
-apply_filters( 'woocommerce_store_api_rate_limit_id', string $identifier );
+apply_filters( 'woocommerce_use_block_notices_in_classic_theme', bool $use_block_notices_in_classic_theme )
 ```

 ### Parameters

-| Argument    | Type   | Description                        |
-|-------------|--------|------------------------------------|
-| $identifier | string | Passed on identifier for fallback. |
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $use_block_notices_in_classic_theme | bool | Whether to use block notices in classic theme. |

 ### Returns

-`string`
+
+`bool`
+
+### Source
+
+- [Blocks/Domain/Services/Notices.php](../../../../../../src/Blocks/Domain/Services/Notices.php)
+
+---
+
+## woocommerce_variation_option_name
+
+
+Filter the variation option name.
+
+```php
+apply_filters( 'woocommerce_variation_option_name', string $option_label, \WP_Term|string|null $item, string $attribute_name, \WC_Product $product )
+```
+
+### Parameters
+
+| Argument | Type | Description |
+| -------- | ---- | ----------- |
+| $option_label | string | The option label. |
+| $item | \WP_Term, string, null | Term object for taxonomies, option string for custom attributes. |
+| $attribute_name | string | Name of the attribute. |
+| $product | \WC_Product | Product object. |

 ### Source

-- [StoreApi/Authentication.php](../../../../../woocommerce/src/StoreApi/Authentication.php)
+- [Blocks/BlockTypes/AddToCartWithOptions/VariationSelectorAttribute.php](../../../../../../src/Blocks/BlockTypes/AddToCartWithOptions/VariationSelectorAttribute.php)
+- [StoreApi/Utilities/ProductItemTrait.php](../../../../../../src/StoreApi/Utilities/ProductItemTrait.php)

 ---
 <!-- FEEDBACK -->
@@ -1247,4 +1902,3 @@ apply_filters( 'woocommerce_store_api_rate_limit_id', string $identifier );
 🐞 Found a mistake, or have a suggestion? [Leave feedback about this document here.](https://github.com/woocommerce/woocommerce/issues/new?assignees=&labels=type%3A+documentation&template=suggestion-for-documentation-improvement-correction.md&title=Feedback%20on%20./docs/third-party-developers/extensibility/hooks/filters.md)

 <!-- /FEEDBACK -->
-
diff --git a/plugins/woocommerce/client/blocks/package.json b/plugins/woocommerce/client/blocks/package.json
index 28e94b9edb9..a390a3f8fdc 100644
--- a/plugins/woocommerce/client/blocks/package.json
+++ b/plugins/woocommerce/client/blocks/package.json
@@ -46,8 +46,8 @@
 		"build:project": "pnpm --stream '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=\"${NODE_ENV:-production}\" BABEL_ENV=\"${BABEL_ENV:-default}\" WP_EXPERIMENTAL_MODULES=\"${WP_EXPERIMENTAL_MODULES:-true}\" webpack && wp-scripts build-blocks-manifest --input=../../assets/client/blocks --output=../../assets/client/blocks/blocks-json.php",
 		"build:check-assets": "npx ajv validate -s bin/block.json-validation-schema.json -d assets/js/**/block.json && rimraf ../../assets/client/blocks/* && ASSET_CHECK=true BABEL_ENV=default NODE_ENV=production webpack",
-		"prebuild:docs": "rimraf docs/extensibility/actions.md & rimraf docs/extensibility/filters.md",
-		"build:docs": "./vendor/bin/wp-hooks-generator --input=src --output=bin/hook-docs/data && node ./bin/hook-docs && pnpm build:docs:block-references",
+		"prebuild:docs": "rimraf docs/third-party-developers/extensibility/hooks/actions.md docs/third-party-developers/extensibility/hooks/filters.md",
+		"build:docs": "composer install && mkdir -p bin/hook-docs/data && ./vendor/bin/wp-hooks-generator --input=../../src --output=bin/hook-docs/data && node ./bin/hook-docs && pnpm build:docs:block-references",
 		"build:docs:block-references": "node ./bin/gen-block-list-doc.js",
 		"postbuild:docs": "./bin/add-doc-footer.sh",
 		"dev": "rimraf ../../assets/client/blocks/* && BABEL_ENV=default webpack",
diff --git a/plugins/woocommerce/phpstan-baseline.neon b/plugins/woocommerce/phpstan-baseline.neon
index 22941520532..6964211caa3 100644
--- a/plugins/woocommerce/phpstan-baseline.neon
+++ b/plugins/woocommerce/phpstan-baseline.neon
@@ -51303,24 +51303,6 @@ parameters:
 			count: 1
 			path: src/Blocks/BlockTypes/ProductDetails.php

-		-
-			message: '#^One or more @param tags has an invalid name or invalid syntax\.$#'
-			identifier: phpDoc.parseError
-			count: 1
-			path: src/Blocks/BlockTypes/ProductDetails.php
-
-		-
-			message: '#^PHPDoc tag @param has invalid value \(\{array\} \$hooked_blocks The blocks that are hooked into the Product Details block\.\)\: Unexpected token "\{", expected type at offset 169 on line 7$#'
-			identifier: phpDoc.parseError
-			count: 1
-			path: src/Blocks/BlockTypes/ProductDetails.php
-
-		-
-			message: '#^PHPDoc tag @return has invalid value \(\{array\} The blocks that are hooked into the Product Details block\.\)\: Unexpected token "\{", expected type at offset 264 on line 8$#'
-			identifier: phpDoc.parseError
-			count: 1
-			path: src/Blocks/BlockTypes/ProductDetails.php
-
 		-
 			message: '#^Parameter \#1 \$query of method WP_HTML_Tag_Processor\:\:next_tag\(\) expects array\{tag_name\?\: string\|null, match_offset\?\: int\|null, class_name\?\: string\|null, tag_closers\?\: string\|null\}\|null, ''h2'' given\.$#'
 			identifier: argument.type
@@ -70152,24 +70134,6 @@ parameters:
 			count: 1
 			path: src/StoreApi/Utilities/OrderController.php

-		-
-			message: '#^One or more @param tags has an invalid name or invalid syntax\.$#'
-			identifier: phpDoc.parseError
-			count: 2
-			path: src/StoreApi/Utilities/OrderController.php
-
-		-
-			message: '#^PHPDoc tag @param has invalid value \(boolean True if has enough stock\.\)\: Unexpected token "True", expected variable at offset 99 on line 4$#'
-			identifier: phpDoc.parseError
-			count: 1
-			path: src/StoreApi/Utilities/OrderController.php
-
-		-
-			message: '#^PHPDoc tag @param has invalid value \(boolean True if in stock\.\)\: Unexpected token "True", expected variable at offset 117 on line 4$#'
-			identifier: phpDoc.parseError
-			count: 1
-			path: src/StoreApi/Utilities/OrderController.php
-
 		-
 			message: '#^Parameter \#2 \$array of function implode expects array\<string\>, array\<array\|string\> given\.$#'
 			identifier: argument.type
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/ProductButton.php b/plugins/woocommerce/src/Blocks/BlockTypes/ProductButton.php
index 29c1f13a92b..f2c532b9eed 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/ProductButton.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/ProductButton.php
@@ -133,9 +133,9 @@ class ProductButton extends AbstractBlock {
 			 *
 			 * @since 8.5.0
 			 * @since 11.0.0 Added the `$variation_id` parameter.
-			 * @param number $default_quantity The default quantity.
-			 * @param number $product_id The product id.
-			 * @param number $variation_id     The variation ID. Always 0 in this context.
+			 * @param int|float $default_quantity The default quantity.
+			 * @param int       $product_id The product id.
+			 * @param int       $variation_id The variation ID. Always 0 in this context.
 			 */
 			$default_quantity = apply_filters( 'woocommerce_add_to_cart_quantity', $default_quantity, $product->get_id(), 0 );
 		}
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/ProductDetails.php b/plugins/woocommerce/src/Blocks/BlockTypes/ProductDetails.php
index f163398144d..00424f5f1d9 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/ProductDetails.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/ProductDetails.php
@@ -33,8 +33,8 @@ class ProductDetails extends AbstractBlock {
 		 * @hook woocommerce_product_details_hooked_blocks
 		 *
 		 * @since 10.0.0
-		 * @param {array} $hooked_blocks The blocks that are hooked into the Product Details block.
-		 * @return {array} The blocks that are hooked into the Product Details block.
+		 * @param array $hooked_blocks The blocks that are hooked into the Product Details block.
+		 * @return array The blocks that are hooked into the Product Details block.
 		 */
 		$hooked_blocks = apply_filters( 'woocommerce_product_details_hooked_blocks', [] );

diff --git a/plugins/woocommerce/src/Blocks/Payments/Integrations/PayPal.php b/plugins/woocommerce/src/Blocks/Payments/Integrations/PayPal.php
index 06f2d191ee6..10f341ce8bc 100644
--- a/plugins/woocommerce/src/Blocks/Payments/Integrations/PayPal.php
+++ b/plugins/woocommerce/src/Blocks/Payments/Integrations/PayPal.php
@@ -122,7 +122,7 @@ final class PayPal extends AbstractPaymentMethodType {
 		 *
 		 * @since 4.4.0
 		 *
-		 * @example See docs/examples/payment-gateways-features-list.md
+		 * @example docs/examples/payment-gateways-features-list.md
 		 *
 		 * @param array $features List of supported features.
 		 * @param string $name Gateway name.
diff --git a/plugins/woocommerce/src/Blocks/Templates/AbstractTemplateCompatibility.php b/plugins/woocommerce/src/Blocks/Templates/AbstractTemplateCompatibility.php
index 41dc4b179c3..179a073343e 100644
--- a/plugins/woocommerce/src/Blocks/Templates/AbstractTemplateCompatibility.php
+++ b/plugins/woocommerce/src/Blocks/Templates/AbstractTemplateCompatibility.php
@@ -110,11 +110,11 @@ abstract class AbstractTemplateCompatibility {
 	 *
 	 * The array format:
 	 * [
-	 *   <hook-name> => [
-	 *     block_names => [ <block-name>, ... ],
+	 *   `<hook-name>` => [
+	 *     block_names => [ `<block-name>`, ... ],
 	 *     position => before|after,
 	 *     hooked => [
-	 *       <function-name> => <priority>,
+	 *       `<function-name>` => `<priority>`,
 	 *        ...
 	 *     ],
 	 *  ],
@@ -156,9 +156,9 @@ abstract class AbstractTemplateCompatibility {
 		 * format:
 		 * [
 		 *   [
-		 *     hook => <hook-name>,
-		 *     function => <function-name>,
-		 *     priority => <priority>,
+		 *     hook => `<hook-name>`,
+		 *     function => `<function-name>`,
+		 *     priority => `<priority>`,
 		 *  ],
 		 *  ...
 		 * ]
diff --git a/plugins/woocommerce/src/StoreApi/Routes/V1/Checkout.php b/plugins/woocommerce/src/StoreApi/Routes/V1/Checkout.php
index 773fa04f6e8..6a5c15fd228 100644
--- a/plugins/woocommerce/src/StoreApi/Routes/V1/Checkout.php
+++ b/plugins/woocommerce/src/StoreApi/Routes/V1/Checkout.php
@@ -687,7 +687,7 @@ class Checkout extends AbstractCartRoute {
 		 * @since 7.2.0
 		 *
 		 * @see https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3238
-		 * @example See docs/examples/checkout-order-processed.md
+		 * @example docs/examples/checkout-order-processed.md

 		 * @param \WC_Order $order Order object.
 		 */
diff --git a/plugins/woocommerce/src/StoreApi/Routes/V1/CheckoutOrder.php b/plugins/woocommerce/src/StoreApi/Routes/V1/CheckoutOrder.php
index edadfde730e..28addef323c 100644
--- a/plugins/woocommerce/src/StoreApi/Routes/V1/CheckoutOrder.php
+++ b/plugins/woocommerce/src/StoreApi/Routes/V1/CheckoutOrder.php
@@ -151,7 +151,7 @@ class CheckoutOrder extends AbstractCartRoute {
 		 * @since 7.2.0
 		 *
 		 * @see https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3238
-		 * @example See docs/examples/checkout-order-processed.md
+		 * @example docs/examples/checkout-order-processed.md

 		 * @param \WC_Order $order Order object.
 		 */
diff --git a/plugins/woocommerce/src/StoreApi/Utilities/CartController.php b/plugins/woocommerce/src/StoreApi/Utilities/CartController.php
index 58f1a7876e3..72570ee73ab 100644
--- a/plugins/woocommerce/src/StoreApi/Utilities/CartController.php
+++ b/plugins/woocommerce/src/StoreApi/Utilities/CartController.php
@@ -488,7 +488,7 @@ class CartController {
 		 *
 		 * @since 7.2.0
 		 *
-		 * @example See docs/examples/validate-cart.md
+		 * @example docs/examples/validate-cart.md
 		 *
 		 * @param \WP_Error $errors  WP_Error object.
 		 * @param \WC_Cart  $cart    Cart object.
diff --git a/plugins/woocommerce/src/StoreApi/Utilities/OrderController.php b/plugins/woocommerce/src/StoreApi/Utilities/OrderController.php
index fa242908350..6c61a9ead16 100644
--- a/plugins/woocommerce/src/StoreApi/Utilities/OrderController.php
+++ b/plugins/woocommerce/src/StoreApi/Utilities/OrderController.php
@@ -766,9 +766,9 @@ class OrderController {
 						/**
 						 * Filters whether or not the product is in stock for this pay for order.
 						 *
-						 * @param boolean True if in stock.
+						 * @param boolean $is_in_stock True if in stock.
 						 * @param \WC_Product $product Product.
-						 * @param \WC_Order $order Order.
+						 * @param \WC_Order|\WC_Order_Refund|false $order Order.
 						 *
 						 * @since 9.8.0-dev
 						 */
@@ -792,9 +792,9 @@ class OrderController {
 						/**
 						 * Filters whether or not the product has enough stock.
 						 *
-						 * @param boolean True if has enough stock.
+						 * @param boolean $has_enough_stock True if has enough stock.
 						 * @param \WC_Product $product Product.
-						 * @param \WC_Order $order Order.
+						 * @param \WC_Order|\WC_Order_Refund|false $order Order.
 						 *
 						 * @since 9.8.0-dev
 						 */