From 0b10db98d928df55bf382a11dcfb677482289b17 Mon Sep 17 00:00:00 2001 From: Eason Su Date: Fri, 25 Aug 2023 17:31:48 +0800 Subject: [PATCH 01/43] Change the bundled `@woocommerce` packages to use the external sources from DEWP. --- .externalized.json | 2 +- webpack.config.js | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/.externalized.json b/.externalized.json index f4a68c1e60..a1ea74111d 100644 --- a/.externalized.json +++ b/.externalized.json @@ -1 +1 @@ -["@woocommerce/components","@woocommerce/customer-effort-score","@woocommerce/data","@woocommerce/navigation","@woocommerce/settings","@wordpress/api-fetch","@wordpress/components","@wordpress/compose","@wordpress/data","@wordpress/data-controls","@wordpress/date","@wordpress/deprecated","@wordpress/dom","@wordpress/element","@wordpress/hooks","@wordpress/html-entities","@wordpress/i18n","@wordpress/primitives","@wordpress/url","lodash","moment","react","react-dom"] \ No newline at end of file +["@woocommerce/components","@woocommerce/currency","@woocommerce/customer-effort-score","@woocommerce/data","@woocommerce/date","@woocommerce/navigation","@woocommerce/number","@woocommerce/settings","@woocommerce/tracks","@wordpress/api-fetch","@wordpress/components","@wordpress/compose","@wordpress/data","@wordpress/data-controls","@wordpress/date","@wordpress/dom","@wordpress/element","@wordpress/hooks","@wordpress/html-entities","@wordpress/i18n","@wordpress/primitives","@wordpress/url","lodash","react","react-dom"] \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index df0d42e077..b62205ecb4 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -20,16 +20,6 @@ const requestToExternal = ( request ) => { request = request.substr( explicitlyExtractPrefix.length ); return defaultRequestToExternalWP( request ); } - const bundledPackages = [ - // Opt-out WooCommerce packages. - '@woocommerce/currency', - '@woocommerce/date', - '@woocommerce/number', - '@woocommerce/tracks', - ]; - if ( bundledPackages.includes( request ) ) { - return false; - } // Follow with the default behavior for any other. return undefined; From 5a2e20409a53ccb3b7fcbfe5c46988ca2b153b38 Mon Sep 17 00:00:00 2001 From: Eason Su Date: Fri, 25 Aug 2023 17:58:07 +0800 Subject: [PATCH 02/43] Remove the selective bundling implementation that gradually externalizes packages into DEWP. --- jest.config.js | 1 - js/src/jsconfig.json | 3 +-- package-lock.json | 1 - package.json | 1 - webpack.config.js | 30 ------------------------------ 5 files changed, 1 insertion(+), 35 deletions(-) diff --git a/jest.config.js b/jest.config.js index 50f2c6d317..c12f1e1340 100644 --- a/jest.config.js +++ b/jest.config.js @@ -16,7 +16,6 @@ module.exports = { '\\.scss$': '/tests/mocks/assets/styleMock.js', // Transform our `.~/` alias. '^\\.~/(.*)$': '/js/src/$1', - '^extracted/(.*)$': '$1', '@woocommerce/settings': '/js/src/tests/dependencies/woocommerce/settings', '@automattic/calypso-config': diff --git a/js/src/jsconfig.json b/js/src/jsconfig.json index 50c6214d97..2ee1c04c7c 100644 --- a/js/src/jsconfig.json +++ b/js/src/jsconfig.json @@ -2,8 +2,7 @@ "compilerOptions": { "baseUrl": ".", "paths": { - ".~/*": [ "./*" ], - "extracted/*": [ "*" ] + ".~/*": [ "./*" ] } } } diff --git a/package-lock.json b/package-lock.json index 2d72644d57..c89485f2a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,6 @@ "@types/jest": "^27.5.2", "@woocommerce/dependency-extraction-webpack-plugin": "^2.0.0", "@woocommerce/eslint-plugin": "^1.2.0", - "@wordpress/dependency-extraction-webpack-plugin": "^4.4.0", "@wordpress/env": "^8.4.0", "@wordpress/jest-preset-default": "^11.9.0", "@wordpress/prettier-config": "2.18.1", diff --git a/package.json b/package.json index eb11e267aa..9729120411 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,6 @@ "@types/jest": "^27.5.2", "@woocommerce/dependency-extraction-webpack-plugin": "^2.0.0", "@woocommerce/eslint-plugin": "^1.2.0", - "@wordpress/dependency-extraction-webpack-plugin": "^4.4.0", "@wordpress/env": "^8.4.0", "@wordpress/jest-preset-default": "^11.9.0", "@wordpress/prettier-config": "2.18.1", diff --git a/webpack.config.js b/webpack.config.js index b62205ecb4..330941d488 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,10 +1,6 @@ const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); const { hasArgInCLI } = require( '@wordpress/scripts/utils' ); const WooCommerceDependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' ); -const { - defaultRequestToExternal: defaultRequestToExternalWP, - defaultRequestToHandle: defaultRequestToHandleWP, -} = require( '@wordpress/dependency-extraction-webpack-plugin/lib/util' ); const ReactRefreshWebpackPlugin = require( '@pmmmwh/react-refresh-webpack-plugin' ); const path = require( 'path' ); @@ -12,29 +8,6 @@ const path = require( 'path' ); const isProduction = process.env.NODE_ENV === 'production'; const hasReactFastRefresh = hasArgInCLI( '--hot' ) && ! isProduction; -const explicitlyExtractPrefix = 'extracted/'; - -const requestToExternal = ( request ) => { - // Externalized when explicitely asked for. - if ( request.startsWith( explicitlyExtractPrefix ) ) { - request = request.substr( explicitlyExtractPrefix.length ); - return defaultRequestToExternalWP( request ); - } - - // Follow with the default behavior for any other. - return undefined; -}; - -const requestToHandle = ( request ) => { - // Externalized when explicitely asked for. - if ( request.startsWith( explicitlyExtractPrefix ) ) { - request = request.substr( explicitlyExtractPrefix.length ); - return defaultRequestToHandleWP( request ); - } - // Follow with the default behavior for any other. - return undefined; -}; - const exceptSVGAndPNGRule = ( rule ) => { return ! rule.test.toString().match( /svg|png/i ); }; @@ -66,7 +39,6 @@ const webpackConfig = { ...defaultConfig.resolve, alias: { '.~': path.resolve( process.cwd(), 'js/src/' ), - extracted: path.resolve( __dirname, 'node_modules' ), }, fallback: { /** @@ -98,8 +70,6 @@ const webpackConfig = { new WooCommerceDependencyExtractionWebpackPlugin( { externalizedReport: ! hasReactFastRefresh && '../../.externalized.json', - requestToExternal, - requestToHandle, } ), ], entry: { From 84c9ca8857747415d78ae9ee9bb464adb5416ea6 Mon Sep 17 00:00:00 2001 From: Eason Su Date: Fri, 25 Aug 2023 18:03:59 +0800 Subject: [PATCH 03/43] Update DEWP document. --- Working with DEWP.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Working with DEWP.md b/Working with DEWP.md index 03f1212460..a3edf98086 100644 --- a/Working with DEWP.md +++ b/Working with DEWP.md @@ -19,12 +19,17 @@ So we could later inspect that. ## Selective bundling & extracting. -Sometimes the fact we do bundle a package that is provided by WordPress/WooCommerce instance introduces errors, as some packages are not effectively modular, so we face version conflicts, style collisions, etc. +In the past, we did bundle a package that is provided by WordPress/WooCommerce instance introduces errors, as some packages are not effectively modular, so we face version conflicts, style collisions, etc. Also, we'd like to reduce the size of our bundle, so eventually, we aim to extract/externalize as much as possible and when possible import from an external package. -To help with that we implemented the `extracted/` prefix. It's also a custom implementation in [/webpack.config.js](/develop/webpack.config.js). +To help with that we had ever implemented the `extracted/` prefix. It was also a custom implementation in webpack.config.js. Thanks to that even though a package is bundled, the given import would fetch it from external. +Now, we have already externalized all DEWP-able packages, so the implementation of `extracted/` prefix was removed as well. +If someday we ever need it again, please refer to: +- The PR implemented it: https://github.com/woocommerce/google-listings-and-ads/pull/1762 +- The commit removed it: https://github.com/woocommerce/google-listings-and-ads/commit/5a2e20409a53ccb3b7fcbfe5c46988ca2b153b38 + ## NPM scripts We also have a bunch of NPM scripts to help us work with them daily. From 6358de365713ede2013f4edae6d2d680ead09f3e Mon Sep 17 00:00:00 2001 From: Eason Su Date: Fri, 25 Aug 2023 18:14:30 +0800 Subject: [PATCH 04/43] Rebalance the max size config of bundlewatch for each non-wildcard file to 1.2 times. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9729120411..542023691c 100644 --- a/package.json +++ b/package.json @@ -144,7 +144,7 @@ }, { "path": "./js/build/index.js", - "maxSize": "209.08 kB" + "maxSize": "148.52 kB" }, { "path": "./js/build/*.css", @@ -156,7 +156,7 @@ }, { "path": "./google-listings-and-ads.zip", - "maxSize": "8.48 mB", + "maxSize": "8.22 mB", "compression": "none" } ], From 8dafb113dbccbeeded18359e07047844ee62a7be Mon Sep 17 00:00:00 2001 From: Miguel Perez Pellicer <5908855+puntope@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:25:39 +0400 Subject: [PATCH 05/43] Fix adapter to get taxonomies from the parent as a fallback --- src/Product/WCProductAdapter.php | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Product/WCProductAdapter.php b/src/Product/WCProductAdapter.php index f5df0d84b6..450a5bf437 100644 --- a/src/Product/WCProductAdapter.php +++ b/src/Product/WCProductAdapter.php @@ -1040,15 +1040,24 @@ protected function get_product_taxonomy( $taxonomy ) { if ( $product->is_type( 'variation' ) ) { $values = $product->get_attribute( $taxonomy ); - if ( ! $values ) { + if ( ! $values ) { // if taxonomy is not a global attribute (ie product_tag), attempt to get is with wc_get_product_terms + $values = $this->get_taxonomy_term_names( $product->get_id(), $taxonomy ); + } + + if ( ! $values ) { // if the value is still not available at this point, we try to get it from the parent $parent = wc_get_product( $product->get_parent_id() ); $values = $parent->get_attribute( $taxonomy ); + + if ( ! $values ) { + $values = $this->get_taxonomy_term_names( $parent->get_id(), $taxonomy ); + } } - $values = explode( ', ', $values ); + if ( is_string( $values ) ) { + $values = explode( ', ', $values ); + } } else { - $values = wc_get_product_terms( $product->get_id(), $taxonomy ); - $values = wp_list_pluck( $values, 'name' ); + $values = $this->get_taxonomy_term_names( $product->get_id(), $taxonomy ); } if ( empty( $values ) || is_wp_error( $values ) ) { @@ -1127,4 +1136,15 @@ protected function get_custom_attribute( $attribute_name ) { $values = array_filter( array_map( 'trim', $values ) ); return empty( $values ) ? '' : $values[0]; } + + /** + * Get a taxonomy term names from a product using + * @param $product_id int The product ID to get the taxonomy term + * @param $taxonomy string The taxonomy to get. + * @return string[] An array of term names. + */ + protected function get_taxonomy_term_names( $product_id, $taxonomy ) { + $values = wc_get_product_terms( $product_id, $taxonomy ); + return wp_list_pluck( $values, 'name' ); + } } From bdadf5ac01fb291b2c1ccee1b42d085199f4088a Mon Sep 17 00:00:00 2001 From: Miguel Perez Pellicer <5908855+puntope@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:26:01 +0400 Subject: [PATCH 06/43] Adding tests for Attribute Mapping PRoduct Adapter --- tests/Tools/HelperTrait/ProductTrait.php | 8 ++++++- .../AttributeMappingWCProductAdapterTest.php | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/tests/Tools/HelperTrait/ProductTrait.php b/tests/Tools/HelperTrait/ProductTrait.php index 3893bc3f46..8f96aafe8a 100644 --- a/tests/Tools/HelperTrait/ProductTrait.php +++ b/tests/Tools/HelperTrait/ProductTrait.php @@ -521,10 +521,16 @@ protected function generate_attribute_mapping_adapted_product( $rules, $categori * Creates a variant with variations ready for being tested in Attribute Mapping * * @param array $rules The Attribute Mapping rules to apply. + * @param array $categories The Categories attached to the variation parent. * @return WCProductAdapter The adapted products with the rules applied. */ - protected function generate_attribute_mapping_adapted_product_variant( $rules ) { + protected function generate_attribute_mapping_adapted_product_variant( $rules, $categories = [] ) { $variable = WC_Helper_Product::create_variation_product(); + if ( ! empty( $categories ) ) { + $variable->set_category_ids( $categories ); + } + $variable->save(); + $variation = wc_get_product( $variable->get_children()[ count( $variable->get_children() ) - 1 ] ); $variation->set_stock_quantity( 1 ); $variation->set_weight( 1.2 ); diff --git a/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php b/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php index d2f6212ef6..ba88d18f2e 100644 --- a/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php +++ b/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php @@ -243,6 +243,30 @@ public function test_maps_rules_product_taxonomies() { $this->assertEquals( '0', $adapted_variation->getColor() ); } + /** + * Test taxonomy source like product_cat, product_tag + */ + public function test_maps_rules_product_cat() { + $rules = [ + [ + 'attribute' => Brand::get_id(), + 'source' => 'taxonomy:product_cat', + 'category_condition_type' => 'ALL', + 'categories' => '', + ] + ]; + + $category_1 = wp_insert_term( 'Zulu Category', 'product_cat' ); + $category_2 = wp_insert_term( 'Alpha Category', 'product_cat' ); + + $adapted_product = $this->generate_attribute_mapping_adapted_product( $rules, [ $category_1['term_id'], $category_2['term_id'] ] ); + $adapted_variation = $this->generate_attribute_mapping_adapted_product_variant( $rules, [ $category_1['term_id'], $category_2['term_id'] ] ); + + var_dump($adapted_variation->getBrand()); + $this->assertEquals( 'Alpha Category', $adapted_product->getBrand() ); + $this->assertEquals( 'Alpha Category', $adapted_variation->getBrand() ); + } + /** * Test dynamic taxonomy not found */ From a71a99d29b3a9d140aacc88e0c36d521236a99c8 Mon Sep 17 00:00:00 2001 From: Miguel Perez Pellicer <5908855+puntope@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:29:13 +0400 Subject: [PATCH 07/43] Remove var_dump from tests --- .../AttributeMapping/AttributeMappingWCProductAdapterTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php b/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php index ba88d18f2e..6a31ca04d3 100644 --- a/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php +++ b/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php @@ -262,7 +262,6 @@ public function test_maps_rules_product_cat() { $adapted_product = $this->generate_attribute_mapping_adapted_product( $rules, [ $category_1['term_id'], $category_2['term_id'] ] ); $adapted_variation = $this->generate_attribute_mapping_adapted_product_variant( $rules, [ $category_1['term_id'], $category_2['term_id'] ] ); - var_dump($adapted_variation->getBrand()); $this->assertEquals( 'Alpha Category', $adapted_product->getBrand() ); $this->assertEquals( 'Alpha Category', $adapted_variation->getBrand() ); } From 93584b279bf6009f410be4d565d3e06ffcdcb0d8 Mon Sep 17 00:00:00 2001 From: Miguel Perez Pellicer <5908855+puntope@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:37:23 +0400 Subject: [PATCH 08/43] PHPCS --- src/Product/WCProductAdapter.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Product/WCProductAdapter.php b/src/Product/WCProductAdapter.php index 450a5bf437..2bf965845e 100644 --- a/src/Product/WCProductAdapter.php +++ b/src/Product/WCProductAdapter.php @@ -1139,8 +1139,9 @@ protected function get_custom_attribute( $attribute_name ) { /** * Get a taxonomy term names from a product using - * @param $product_id int The product ID to get the taxonomy term - * @param $taxonomy string The taxonomy to get. + * + * @param int $product_id - The product ID to get the taxonomy term + * @param string $taxonomy - The taxonomy to get. * @return string[] An array of term names. */ protected function get_taxonomy_term_names( $product_id, $taxonomy ) { From 26b0bb5e0a6d3f48637c4ca05b819d8e9a714114 Mon Sep 17 00:00:00 2001 From: Miguel Perez Pellicer <5908855+puntope@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:44:21 +0400 Subject: [PATCH 09/43] PHPCS for tests --- tests/Tools/HelperTrait/ProductTrait.php | 2 +- .../AttributeMapping/AttributeMappingWCProductAdapterTest.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Tools/HelperTrait/ProductTrait.php b/tests/Tools/HelperTrait/ProductTrait.php index 8f96aafe8a..19edb771cb 100644 --- a/tests/Tools/HelperTrait/ProductTrait.php +++ b/tests/Tools/HelperTrait/ProductTrait.php @@ -525,7 +525,7 @@ protected function generate_attribute_mapping_adapted_product( $rules, $categori * @return WCProductAdapter The adapted products with the rules applied. */ protected function generate_attribute_mapping_adapted_product_variant( $rules, $categories = [] ) { - $variable = WC_Helper_Product::create_variation_product(); + $variable = WC_Helper_Product::create_variation_product(); if ( ! empty( $categories ) ) { $variable->set_category_ids( $categories ); } diff --git a/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php b/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php index 6a31ca04d3..05a6d10427 100644 --- a/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php +++ b/tests/Unit/Product/AttributeMapping/AttributeMappingWCProductAdapterTest.php @@ -253,14 +253,14 @@ public function test_maps_rules_product_cat() { 'source' => 'taxonomy:product_cat', 'category_condition_type' => 'ALL', 'categories' => '', - ] + ], ]; $category_1 = wp_insert_term( 'Zulu Category', 'product_cat' ); $category_2 = wp_insert_term( 'Alpha Category', 'product_cat' ); $adapted_product = $this->generate_attribute_mapping_adapted_product( $rules, [ $category_1['term_id'], $category_2['term_id'] ] ); - $adapted_variation = $this->generate_attribute_mapping_adapted_product_variant( $rules, [ $category_1['term_id'], $category_2['term_id'] ] ); + $adapted_variation = $this->generate_attribute_mapping_adapted_product_variant( $rules, [ $category_1['term_id'], $category_2['term_id'] ] ); $this->assertEquals( 'Alpha Category', $adapted_product->getBrand() ); $this->assertEquals( 'Alpha Category', $adapted_variation->getBrand() ); From 42fd4ef3b143c88b856deb9dcf6c78f63bd2385f Mon Sep 17 00:00:00 2001 From: Eason Su Date: Tue, 29 Aug 2023 15:58:34 +0800 Subject: [PATCH 10/43] Remove the compatibilities for `history` v4 from the `useNavigateAwayPromptEffect` hook. --- js/src/hooks/useNavigateAwayPromptEffect.js | 35 +++------------------ 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/js/src/hooks/useNavigateAwayPromptEffect.js b/js/src/hooks/useNavigateAwayPromptEffect.js index ba22333b5d..e72b5fc1fe 100644 --- a/js/src/hooks/useNavigateAwayPromptEffect.js +++ b/js/src/hooks/useNavigateAwayPromptEffect.js @@ -8,7 +8,7 @@ import { noop } from 'lodash'; const alwaysTrue = () => true; /** - * Returns a normalized location to handle the inconsistent pathname between history v5 (≥ WC 6.7) and v4 (< WC 6.7). + * Returns a normalized location to handle the inconsistent pathname in history v5 (≥ WC 6.7). * * Since WC calls `history.push()` with a path that starts with 'admin.php?...', it brings * the inconsistent `location` results. @@ -19,11 +19,6 @@ const alwaysTrue = () => true; * @see https://github.com/remix-run/history/blob/v5.3.0/packages/history/index.ts#L701 * @see https://github.com/remix-run/history/blob/v5.3.0/packages/history/index.ts#L1086 * - * The `pathname` in v4 is always '/admin.php'. - * - * @see https://github.com/remix-run/history/blob/v4/modules/createBrowserHistory.js#L166 - * @see https://github.com/remix-run/history/blob/v4/modules/LocationUtils.js#L57-L61 - * * @param {Object} location Location object to be normalized. * @return {Object} Normalized location object. */ @@ -36,7 +31,6 @@ function normalizeLocation( location ) { /** * Show prompt when the user tries to unload/leave the page. - * Adds and removed `beforeunload` event listener according to the given flag. * * @param {string} message Message to be shown. Note, some browsers may not support this when unloading the page. * @param {boolean} shouldBlock Boolean flag, whether the prompt should be shown. @@ -47,31 +41,16 @@ export default function useNavigateAwayPromptEffect( shouldBlock, blockedLocation = alwaysTrue ) { - // history#v5 compatibility: As one of useEffect deps for triggering a new blocking after history is changed. + // history#v5: As one of useEffect deps for triggering a new blocking after history is changed. const { key } = getHistory().location; useEffect( () => { - /** - * Bind beforeunload event for non `woocommerce/navigation` links and reloads. - * history#v5 does bind `beforeunload` automatically, with v4 we need to do it ourselves. - * - * @param {Event} e Before Unload Event - */ - const eventListener = ( e ) => { - // If you prevent default behavior in Mozilla Firefox prompt will always be shown. - e.preventDefault(); - // Chrome requires returnValue to be set. - e.returnValue = message; - }; - let unblock = noop; if ( shouldBlock ) { // Block navigation in order to show a confirmation prompt. unblock = getHistory().block( ( transition ) => { - // In history v4 (< WC 6.7) block method receives two parameter (the location and action). - // In v5 (>= WC 6.7) it has only one parameter that is a transition object with location, retry and action properties. - const { location = transition, retry = noop } = transition; + const { location, retry } = transition; let shouldUnblock = true; if ( blockedLocation( normalizeLocation( location ) ) ) { @@ -79,22 +58,16 @@ export default function useNavigateAwayPromptEffect( shouldUnblock = window.confirm( message ); // eslint-disable-line no-alert } - // v5 compatibility requires the calls to unblock and retry functions. + // history v5 requires the calls to unblock and retry functions. if ( shouldUnblock ) { unblock(); retry(); } - - // v4 compatibility requires a return boolean to tell whether actually to unblock the navigation. - return shouldUnblock; } ); - - window.addEventListener( 'beforeunload', eventListener ); } return () => { unblock(); - window.removeEventListener( 'beforeunload', eventListener ); }; }, [ key, message, shouldBlock, blockedLocation ] ); } From 1038b392138763d817b79a786a7a52a000a586b0 Mon Sep 17 00:00:00 2001 From: Eason Su Date: Tue, 29 Aug 2023 16:00:16 +0800 Subject: [PATCH 11/43] Use `rowKey` prop to replace the `key` prop workarounds in rendering the rows of `AllProgramsTableCard`. --- js/src/dashboard/all-programs-table-card/index.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/js/src/dashboard/all-programs-table-card/index.js b/js/src/dashboard/all-programs-table-card/index.js index 9ae0da03aa..786c32f078 100644 --- a/js/src/dashboard/all-programs-table-card/index.js +++ b/js/src/dashboard/all-programs-table-card/index.js @@ -138,6 +138,7 @@ const AllProgramsTableCard = ( props ) => { /> } headers={ headers } + rowKey={ ( cells ) => cells[ 0 ].id } rows={ data.map( ( el ) => { const isFreeListings = el.id === FREE_LISTINGS_PROGRAM_ID; const editButtonClassName = classnames( { @@ -145,24 +146,21 @@ const AllProgramsTableCard = ( props ) => { ! isFreeListings && ! el.disabledEdit, } ); - // Since the component uses array index as key to render rows, - // it might cause incorrect state control if a column has an internal state. - // So we have to specific `key` prop on some components of the `display` to work around it. - // Ref: https://github.com/woocommerce/woocommerce-admin/blob/v2.1.2/packages/components/src/table/table.js#L288-L289 + // The `id` property in the first cell is for the `rowKey` callback. return [ - { display: el.title }, + { display: el.title, id: el.id.toString() }, { display: el.country }, { display: el.dailyBudget }, { display: isFreeListings ? ( ) : ( - + ), }, { display: ( -
+
Date: Tue, 29 Aug 2023 23:02:58 +0200 Subject: [PATCH 12/43] Add filter to override DB options --- src/Options/Options.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Options/Options.php b/src/Options/Options.php index 2164e9c7ab..b51b7fe28e 100644 --- a/src/Options/Options.php +++ b/src/Options/Options.php @@ -41,7 +41,7 @@ public function get( string $name, $default = null ) { if ( ! array_key_exists( $name, $this->options ) ) { $value = get_option( $this->prefix_name( $name ), $default ); - $this->options[ $name ] = $this->maybe_cast_value( $name, $value ); + $this->options[ $name ] = apply_filters("woocommerce_gla_options_get_{$name}", $this->maybe_cast_value( $name, $value )) ; } return $this->raw_value( $this->options[ $name ] ); From edbd0cdd9b1c6e744531661dc11f7b2e27ee6aab Mon Sep 17 00:00:00 2001 From: Jorge M Date: Tue, 29 Aug 2023 23:03:33 +0200 Subject: [PATCH 13/43] Add action to simulate GLA onboarded --- tests/e2e/bin/test-data.php | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/e2e/bin/test-data.php b/tests/e2e/bin/test-data.php index 02fc9edaad..9a1865e62b 100644 --- a/tests/e2e/bin/test-data.php +++ b/tests/e2e/bin/test-data.php @@ -25,16 +25,33 @@ function register_routes() { 'methods' => 'POST', 'callback' => __NAMESPACE__ . '\set_conversion_id', 'permission_callback' => __NAMESPACE__ . '\permissions', - ], + ], [ 'methods' => 'DELETE', 'callback' => __NAMESPACE__ . '\clear_conversion_id', 'permission_callback' => __NAMESPACE__ . '\permissions', ], - ], + ], ); } +add_action( 'plugins_loaded', function () { + + if(isset($_GET['gla-e2e-onboarded'])){ + add_filter("woocommerce_gla_options_get_".OptionsInterface::REDIRECT_TO_ONBOARDING, function ($value){ + return 'no'; + }); + + add_filter("woocommerce_gla_options_get_".OptionsInterface::MC_SETUP_COMPLETED_AT, function ($value){ + return 1693215209; + }); + + add_filter("woocommerce_gla_options_get_".OptionsInterface::GOOGLE_CONNECTED, function ($value){ + return true; + }); + } +} ); + /** * Set the Ads Conversion Action to test values. */ @@ -56,12 +73,13 @@ function set_conversion_id() { function clear_conversion_id() { /** @var OptionsInterface $options */ $options = woogle_get_container()->get( OptionsInterface::class ); - $options->delete( OptionsInterface::ADS_CONVERSION_ACTION ); + $options->delete( OptionsInterface::ADS_CONVERSION_ACTION ); } /** * Check permissions for API requests. */ function permissions() { + return true; return current_user_can( 'manage_woocommerce' ); } From 251de35b29b4478f0b5a05afb15312ee10e3025a Mon Sep 17 00:00:00 2001 From: Jorge M Date: Tue, 29 Aug 2023 23:04:46 +0200 Subject: [PATCH 14/43] Add Mock Requests Utility class --- tests/e2e/utils/mock-requests.js | 80 ++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 tests/e2e/utils/mock-requests.js diff --git a/tests/e2e/utils/mock-requests.js b/tests/e2e/utils/mock-requests.js new file mode 100644 index 0000000000..19c48b8be8 --- /dev/null +++ b/tests/e2e/utils/mock-requests.js @@ -0,0 +1,80 @@ +/** + * Mock Requests + * + * This class is used to mock requests to the server. + */ +export default class MockRequests { + /** + * @param {import('@playwright/test').Page} page + */ + constructor( page ) { + this.page = page; + } + + /** + * Fulfill a request with a payload. + * @param {RegExp|String} url The url to fulfill. + * @param {Object} payload The payload to send. + * @returns {Promise} + */ + async fulfillRequest( url, payload ) { + await this.page.route( url, ( route ) => + route.fulfill( { + content: 'application/json', + headers: { 'Access-Control-Allow-Origin': '*' }, + body: JSON.stringify( payload ), + } ) + ); + } + + /** + * Fulfill the MC Report Program request. + * @param {Object} payload + * @returns {Promise} + */ + async fulfillMCReportProgram( payload ) { + await this.fulfillRequest( + /\/wc\/gla\/mc\/reports\/programs\b/, + payload + ); + } + + /** + * Fulfill the Target Audience request. + * @param {Object} payload + * @returns {Promise} + */ + async fulfillTargetAudience( payload ) { + await this.fulfillRequest( + /\/wc\/gla\/mc\/target_audience\b/, + payload + ); + } + + /** + * Fulfill the JetPack Connection request. + * @param {Object} payload + * @returns {Promise} + */ + async fulfillJetPackConnection( payload ) { + await this.fulfillRequest( /\/wc\/gla\/jetpack\/connected\b/, payload ); + } + + /** + * Fulfill the Google Connection request. + * @param {Object} payload + * @returns {Promise} + */ + async fulfillGoogleConnection( payload ) { + await this.fulfillRequest( /\/wc\/gla\/google\/connected\b/, payload ); + } + + /** + * Fulfill the Ads Connection request. + * @param {Object} payload + * @returns {Promise} + */ + async fulfillAdsConnection( payload ) { + await this.fulfillRequest( /\/wc\/gla\/ads\/connection\b/, payload ); + } +} From acd00aada7744afa602ea4e8fbc9b5e8442c0541 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Tue, 29 Aug 2023 23:05:17 +0200 Subject: [PATCH 15/43] Create Dashboard Page --- tests/e2e/utils/pages/dashboard.js | 131 +++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 tests/e2e/utils/pages/dashboard.js diff --git a/tests/e2e/utils/pages/dashboard.js b/tests/e2e/utils/pages/dashboard.js new file mode 100644 index 0000000000..4be12e5911 --- /dev/null +++ b/tests/e2e/utils/pages/dashboard.js @@ -0,0 +1,131 @@ +import MockRequests from '../mock-requests'; + +/** + * Dashboard page object class. + */ +export default class DashboardPage extends MockRequests { + /** + * @param {import('@playwright/test').Page} page + */ + constructor( page ) { + super( page ); + this.page = page; + this.freeListingRow = this.page.locator( + '.gla-all-programs-table-card table tr:nth-child(2)' + ); + this.editFreeListingButton = this.freeListingRow.getByRole( 'button', { + name: 'Edit', + } ); + } + + /** + * Close the current page. + */ + async closePage() { + await this.page.close(); + } + + /** + * Mock all requests related to external accounts such as Merchant Center, Google, etc. + */ + async mockRequests() { + // Mock Reports Programs + this.fulfillMCReportProgram( { + free_listings: null, + products: null, + intervals: null, + totals: { + clicks: 0, + impressions: 0, + }, + next_page: null, + } ); + + this.fulfillTargetAudience( { + location: 'selected', + countries: [ 'US' ], + locale: 'en_US', + language: 'English', + } ); + + this.fulfillJetPackConnection( { + active: 'yes', + owner: 'yes', + displayName: 'John', + email: 'john@email.com', + } ); + + this.fulfillGoogleConnection( { + active: 'yes', + email: 'john@email.com', + scope: [], + } ); + + this.fulfillAdsConnection( { + id: 0, + currency: null, + symbol: '$', + status: 'disconnected', + } ); + } + + /** + * Mock the onboarded state. Otherwise it will be redirected to the onboarding page. + */ + async onboarded() { + this.page.route( /\/admin.php\b/, ( route ) => { + const url = `${ route.request().url() }&gla-e2e-onboarded=true`; + route.continue( { url } ); + } ); + } + + /** + * Go to the dashboard page. + */ + async goto() { + await this.page.goto( + '/wp-admin/admin.php?page=wc-admin&path=%2Fgoogle%2Fdashboard', + { waitUntil: 'domcontentloaded' } + ); + } + + /** + * Click the edit free listings button. + */ + async clickEditFreeListings() { + await this.editFreeListingButton.click(); + } + + /** + * Get the continue to edit button from the modal. + * + * @returns {Promise} + */ + async getContinueToEditButton() { + return this.page.getByRole( 'button', { + name: 'Continue to edit', + exact: true, + } ); + } + + /** + * Get the don't edit button from the modal. + * + * @returns {Promise} + */ + async getDontEditButton() { + return this.page.getByRole( 'button', { + name: "Don't edit", + exact: true, + } ); + } + + /** + * Click the continue to edit button from the modal. + * @returns {Promise} + */ + async clickContinueToEditButton() { + const continueToEditButton = await this.getContinueToEditButton(); + await continueToEditButton.click(); + } +} From 280b8f8e47cfad83c4edb455b134ef2b2d2fbc54 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Tue, 29 Aug 2023 23:05:57 +0200 Subject: [PATCH 16/43] Add edit free-listings page --- tests/e2e/utils/pages/edit-free-listings.js | 90 +++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 tests/e2e/utils/pages/edit-free-listings.js diff --git a/tests/e2e/utils/pages/edit-free-listings.js b/tests/e2e/utils/pages/edit-free-listings.js new file mode 100644 index 0000000000..0d516378b3 --- /dev/null +++ b/tests/e2e/utils/pages/edit-free-listings.js @@ -0,0 +1,90 @@ +export default class EditFreeListingsPage { + /** + * @param {import('@playwright/test').Page} page + */ + constructor( page ) { + this.page = page; + } + + /** + * Get Save Changes button. * + * @returns {Promise} + */ + async getSaveChangesButton() { + return this.page.getByRole( 'button', { + name: 'Save changes', + exact: true, + } ); + } + + /** + * Click the Save Changes button. + * @returns {Promise} + */ + async clickSaveChanges() { + const saveChangesButton = await this.getSaveChangesButton(); + saveChangesButton.click(); + } + + /** + * Check the recommended shipping settings. + * @returns {Promise} + */ + async checkRecommendShippingSettings() { + return this.page + .locator( + 'text=Recommended: Automatically sync my store’s shipping settings to Google.' + ) + .check(); + } + /** + * Fill the countries shipping time input. + * @param {String} input The shipping time + * @returns {Promise} + */ + async fillCountriesShippingTimeInput( input ) { + await this.page.locator( '.countries-time input' ).fill( input ); + } + + /** + * Check the destination based tax rates. + * @returns {Promise} + */ + async checkDestinationBasedTaxRates() { + await this.page + .locator( 'text=My store uses destination-based tax rates.' ) + .check(); + } + + /** + * Register the requests when the save button is clicked. + * @returns {Promise} + */ + registerSavingRequests() { + const targetAudienteRequest = this.page.waitForRequest( + ( request ) => + request.url().includes( '/gla/mc/target_audience' ) && + request.method() === 'POST' && + request.postDataJSON().countries[ 0 ] === 'US' + ); + const settingsRequest = this.page.waitForRequest( + ( request ) => + request.url().includes( '/gla/mc/settings' ) && + request.method() === 'POST' && + request.postDataJSON().shipping_rate === 'automatic' && + request.postDataJSON().shipping_time === 'flat' + ); + + const syncRequest = this.page.waitForRequest( + ( request ) => + request.url().includes( '/gla/mc/settings/sync' ) && + request.method() === 'POST' + ); + + return Promise.all( [ + settingsRequest, + targetAudienteRequest, + syncRequest, + ] ); + } +} From f76fb1db3a6ab7c2efa3e8ff3f7696f43acc3426 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Tue, 29 Aug 2023 23:06:19 +0200 Subject: [PATCH 17/43] Add edit free listings test --- .../dashboard/edit-free-listings.test.js | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 tests/e2e/specs/dashboard/edit-free-listings.test.js diff --git a/tests/e2e/specs/dashboard/edit-free-listings.test.js b/tests/e2e/specs/dashboard/edit-free-listings.test.js new file mode 100644 index 0000000000..7025d053bf --- /dev/null +++ b/tests/e2e/specs/dashboard/edit-free-listings.test.js @@ -0,0 +1,85 @@ +import { test, expect } from '@playwright/test'; +import DashboardPage from '../../utils/pages/dashboard.js'; +import EditFreeListingsPage from '../../utils/pages/edit-free-listings.js'; + +test.use( { storageState: process.env.ADMINSTATE } ); + +test.describe.configure( { mode: 'serial' } ); + +/** + * @type {import('../../utils/pages/dashboard.js').default} dashboardPage + */ +let dashboardPage = null; + +/** + * @type {import('../../utils/pages/edit-free-listings.js').default} editFreeListingsPage + */ +let editFreeListingsPage = null; + +/** + * @type {import('@playwright/test').Page} page + */ +let page = null; + +test.describe( 'Edit Free Listings', () => { + test.beforeAll( async ( { browser } ) => { + page = await browser.newPage(); + dashboardPage = new DashboardPage( page ); + await dashboardPage.onboarded(); + await dashboardPage.mockRequests(); + await dashboardPage.goto(); + } ); + + test.afterAll( async () => { + await page.close(); + } ); + + test( 'Dashboard page contains Free Listings', async () => { + await expect( dashboardPage.freeListingRow ).toContainText( + 'Free listings' + ); + + await expect( dashboardPage.editFreeListingButton ).toBeEnabled(); + } ); + + test( 'Edit Free Listings should show modal', async () => { + await dashboardPage.clickEditFreeListings(); + + await page.waitForLoadState( 'domcontentloaded' ); + + const continueToEditButton = await dashboardPage.getContinueToEditButton(); + const dontEditButton = await dashboardPage.getDontEditButton(); + await expect( continueToEditButton ).toBeEnabled(); + await expect( dontEditButton ).toBeEnabled(); + } ); + + test( 'Continue to edit Free listings', async () => { + await dashboardPage.clickContinueToEditButton(); + await page.waitForLoadState( 'domcontentloaded' ); + } ); + + test( 'Check recommended shipping settings', async () => { + editFreeListingsPage = new EditFreeListingsPage( page ); + await editFreeListingsPage.checkRecommendShippingSettings(); + await editFreeListingsPage.fillCountriesShippingTimeInput( '5' ); + await editFreeListingsPage.checkDestinationBasedTaxRates(); + const saveChangesButton = await editFreeListingsPage.getSaveChangesButton(); + await expect( saveChangesButton ).toBeEnabled(); + } ); + + test( 'Save changes', async () => { + const awaitForRequests = editFreeListingsPage.registerSavingRequests(); + await editFreeListingsPage.clickSaveChanges(); + const requests = await awaitForRequests; + const settingsResponse = await ( + await requests[ 0 ].response() + ).json(); + + expect( settingsResponse.status ).toBe( 'success' ); + expect( settingsResponse.message ).toBe( + 'Merchant Center Settings successfully updated.' + ); + expect( settingsResponse.data.shipping_time ).toBe( 'flat' ); + expect( settingsResponse.data.tax_rate ).toBe( 'destination' ); + } ); +} ); From 551b3851a7426922173b36c0da1e63e19706619b Mon Sep 17 00:00:00 2001 From: Jorge M Date: Tue, 29 Aug 2023 23:13:46 +0200 Subject: [PATCH 18/43] Rename onboarded function and move the method to mock requests class --- tests/e2e/specs/dashboard/edit-free-listings.test.js | 2 +- tests/e2e/utils/mock-requests.js | 11 +++++++++++ tests/e2e/utils/pages/dashboard.js | 10 ---------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/e2e/specs/dashboard/edit-free-listings.test.js b/tests/e2e/specs/dashboard/edit-free-listings.test.js index 7025d053bf..a6a02d369b 100644 --- a/tests/e2e/specs/dashboard/edit-free-listings.test.js +++ b/tests/e2e/specs/dashboard/edit-free-listings.test.js @@ -25,7 +25,7 @@ test.describe( 'Edit Free Listings', () => { test.beforeAll( async ( { browser } ) => { page = await browser.newPage(); dashboardPage = new DashboardPage( page ); - await dashboardPage.onboarded(); + await dashboardPage.mockOnboarded(); await dashboardPage.mockRequests(); await dashboardPage.goto(); } ); diff --git a/tests/e2e/utils/mock-requests.js b/tests/e2e/utils/mock-requests.js index 19c48b8be8..2f7aebdbd1 100644 --- a/tests/e2e/utils/mock-requests.js +++ b/tests/e2e/utils/mock-requests.js @@ -11,6 +11,17 @@ export default class MockRequests { this.page = page; } + /** + * Add the parameter gla-e2e-onboarded to the request to simulate the onboarded state; otherwise, it will redirect to the onboarding page. + * @returns {Promise} + */ + async mockOnboarded() { + await this.page.route( /\/admin.php\b/, ( route ) => { + const url = `${ route.request().url() }&gla-e2e-onboarded=true`; + route.continue( { url } ); + } ); + } + /** * Fulfill a request with a payload. * @param {RegExp|String} url The url to fulfill. diff --git a/tests/e2e/utils/pages/dashboard.js b/tests/e2e/utils/pages/dashboard.js index 4be12e5911..0cb5e2ef8f 100644 --- a/tests/e2e/utils/pages/dashboard.js +++ b/tests/e2e/utils/pages/dashboard.js @@ -69,16 +69,6 @@ export default class DashboardPage extends MockRequests { } ); } - /** - * Mock the onboarded state. Otherwise it will be redirected to the onboarding page. - */ - async onboarded() { - this.page.route( /\/admin.php\b/, ( route ) => { - const url = `${ route.request().url() }&gla-e2e-onboarded=true`; - route.continue( { url } ); - } ); - } - /** * Go to the dashboard page. */ From d722ba48999c6656b24743367fca98027fe24c94 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Tue, 29 Aug 2023 23:27:38 +0200 Subject: [PATCH 19/43] Remove unnecessary spaces --- tests/e2e/bin/test-data.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/bin/test-data.php b/tests/e2e/bin/test-data.php index 9a1865e62b..c19b3f9f92 100644 --- a/tests/e2e/bin/test-data.php +++ b/tests/e2e/bin/test-data.php @@ -25,13 +25,13 @@ function register_routes() { 'methods' => 'POST', 'callback' => __NAMESPACE__ . '\set_conversion_id', 'permission_callback' => __NAMESPACE__ . '\permissions', - ], + ], [ 'methods' => 'DELETE', 'callback' => __NAMESPACE__ . '\clear_conversion_id', 'permission_callback' => __NAMESPACE__ . '\permissions', ], - ], + ], ); } From 0a84f51af9075d1952d9ec31680e472865aebd3e Mon Sep 17 00:00:00 2001 From: Jorge M Date: Tue, 29 Aug 2023 23:55:02 +0200 Subject: [PATCH 20/43] Fix phpcs --- src/Options/Options.php | 2 +- tests/e2e/bin/test-data.php | 43 +++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/Options/Options.php b/src/Options/Options.php index b51b7fe28e..8b02575ee9 100644 --- a/src/Options/Options.php +++ b/src/Options/Options.php @@ -41,7 +41,7 @@ public function get( string $name, $default = null ) { if ( ! array_key_exists( $name, $this->options ) ) { $value = get_option( $this->prefix_name( $name ), $default ); - $this->options[ $name ] = apply_filters("woocommerce_gla_options_get_{$name}", $this->maybe_cast_value( $name, $value )) ; + $this->options[ $name ] = apply_filters( "woocommerce_gla_options_get_{$name}", $this->maybe_cast_value( $name, $value ) ); } return $this->raw_value( $this->options[ $name ] ); diff --git a/tests/e2e/bin/test-data.php b/tests/e2e/bin/test-data.php index c19b3f9f92..cc3132a8fd 100644 --- a/tests/e2e/bin/test-data.php +++ b/tests/e2e/bin/test-data.php @@ -35,22 +35,34 @@ function register_routes() { ); } -add_action( 'plugins_loaded', function () { +add_action( + 'plugins_loaded', + function () { + if ( isset( $_GET['gla-e2e-onboarded'] ) ) { + add_filter( + 'woocommerce_gla_options_get_' . OptionsInterface::REDIRECT_TO_ONBOARDING, + function ( $value ) { + return 'no'; + } + ); - if(isset($_GET['gla-e2e-onboarded'])){ - add_filter("woocommerce_gla_options_get_".OptionsInterface::REDIRECT_TO_ONBOARDING, function ($value){ - return 'no'; - }); - - add_filter("woocommerce_gla_options_get_".OptionsInterface::MC_SETUP_COMPLETED_AT, function ($value){ - return 1693215209; - }); - - add_filter("woocommerce_gla_options_get_".OptionsInterface::GOOGLE_CONNECTED, function ($value){ - return true; - }); + add_filter( + 'woocommerce_gla_options_get_' . OptionsInterface::MC_SETUP_COMPLETED_AT, + function ( $value ) { + return 1693215209; + } + ); + + add_filter( + 'woocommerce_gla_options_get_' . OptionsInterface::GOOGLE_CONNECTED, + function ( $value ) { + return true; + } + ); + } } -} ); +); + /** * Set the Ads Conversion Action to test values. @@ -73,13 +85,12 @@ function set_conversion_id() { function clear_conversion_id() { /** @var OptionsInterface $options */ $options = woogle_get_container()->get( OptionsInterface::class ); - $options->delete( OptionsInterface::ADS_CONVERSION_ACTION ); + $options->delete( OptionsInterface::ADS_CONVERSION_ACTION ); } /** * Check permissions for API requests. */ function permissions() { - return true; return current_user_can( 'manage_woocommerce' ); } From 9c5010d8f931eb61ef78209f7b7686e6335620fd Mon Sep 17 00:00:00 2001 From: Jorge M Date: Wed, 30 Aug 2023 00:06:03 +0200 Subject: [PATCH 21/43] Fix js linting --- .../dashboard/edit-free-listings.test.js | 6 +++++ tests/e2e/utils/mock-requests.js | 23 ++++++++++++------- tests/e2e/utils/pages/dashboard.js | 16 ++++++++++--- tests/e2e/utils/pages/edit-free-listings.js | 22 +++++++++++------- 4 files changed, 48 insertions(+), 19 deletions(-) diff --git a/tests/e2e/specs/dashboard/edit-free-listings.test.js b/tests/e2e/specs/dashboard/edit-free-listings.test.js index a6a02d369b..554c69d334 100644 --- a/tests/e2e/specs/dashboard/edit-free-listings.test.js +++ b/tests/e2e/specs/dashboard/edit-free-listings.test.js @@ -1,4 +1,10 @@ +/** + * External dependencies + */ import { test, expect } from '@playwright/test'; +/** + * Internal dependencies + */ import DashboardPage from '../../utils/pages/dashboard.js'; import EditFreeListingsPage from '../../utils/pages/edit-free-listings.js'; diff --git a/tests/e2e/utils/mock-requests.js b/tests/e2e/utils/mock-requests.js index 2f7aebdbd1..2950ea4871 100644 --- a/tests/e2e/utils/mock-requests.js +++ b/tests/e2e/utils/mock-requests.js @@ -13,7 +13,8 @@ export default class MockRequests { /** * Add the parameter gla-e2e-onboarded to the request to simulate the onboarded state; otherwise, it will redirect to the onboarding page. - * @returns {Promise} + * + * @return {Promise} */ async mockOnboarded() { await this.page.route( /\/admin.php\b/, ( route ) => { @@ -24,9 +25,10 @@ export default class MockRequests { /** * Fulfill a request with a payload. - * @param {RegExp|String} url The url to fulfill. + * + * @param {RegExp|string} url The url to fulfill. * @param {Object} payload The payload to send. - * @returns {Promise} + * @return {Promise} */ async fulfillRequest( url, payload ) { await this.page.route( url, ( route ) => @@ -40,8 +42,9 @@ export default class MockRequests { /** * Fulfill the MC Report Program request. + * * @param {Object} payload - * @returns {Promise} + * @return {Promise} */ async fulfillMCReportProgram( payload ) { await this.fulfillRequest( @@ -52,8 +55,9 @@ export default class MockRequests { /** * Fulfill the Target Audience request. + * * @param {Object} payload - * @returns {Promise} + * @return {Promise} */ async fulfillTargetAudience( payload ) { await this.fulfillRequest( @@ -64,8 +68,9 @@ export default class MockRequests { /** * Fulfill the JetPack Connection request. + * * @param {Object} payload - * @returns {Promise} + * @return {Promise} */ async fulfillJetPackConnection( payload ) { await this.fulfillRequest( /\/wc\/gla\/jetpack\/connected\b/, payload ); @@ -73,8 +78,9 @@ export default class MockRequests { /** * Fulfill the Google Connection request. + * * @param {Object} payload - * @returns {Promise} + * @return {Promise} */ async fulfillGoogleConnection( payload ) { await this.fulfillRequest( /\/wc\/gla\/google\/connected\b/, payload ); @@ -82,8 +88,9 @@ export default class MockRequests { /** * Fulfill the Ads Connection request. + * * @param {Object} payload - * @returns {Promise} + * @return {Promise} */ async fulfillAdsConnection( payload ) { await this.fulfillRequest( /\/wc\/gla\/ads\/connection\b/, payload ); diff --git a/tests/e2e/utils/pages/dashboard.js b/tests/e2e/utils/pages/dashboard.js index 0cb5e2ef8f..7949134682 100644 --- a/tests/e2e/utils/pages/dashboard.js +++ b/tests/e2e/utils/pages/dashboard.js @@ -1,3 +1,6 @@ +/** + * Internal dependencies + */ import MockRequests from '../mock-requests'; /** @@ -20,6 +23,8 @@ export default class DashboardPage extends MockRequests { /** * Close the current page. + * + * @return {Promise} */ async closePage() { await this.page.close(); @@ -71,6 +76,8 @@ export default class DashboardPage extends MockRequests { /** * Go to the dashboard page. + * + * @return {Promise} */ async goto() { await this.page.goto( @@ -81,6 +88,8 @@ export default class DashboardPage extends MockRequests { /** * Click the edit free listings button. + * + * @return {Promise} */ async clickEditFreeListings() { await this.editFreeListingButton.click(); @@ -89,7 +98,7 @@ export default class DashboardPage extends MockRequests { /** * Get the continue to edit button from the modal. * - * @returns {Promise} + * @return {Promise} Get the continue to edit button from the modal. */ async getContinueToEditButton() { return this.page.getByRole( 'button', { @@ -101,7 +110,7 @@ export default class DashboardPage extends MockRequests { /** * Get the don't edit button from the modal. * - * @returns {Promise} + * @return {Promise} Get the don't edit button from the modal. */ async getDontEditButton() { return this.page.getByRole( 'button', { @@ -112,7 +121,8 @@ export default class DashboardPage extends MockRequests { /** * Click the continue to edit button from the modal. - * @returns {Promise} + * + * @return {Promise} */ async clickContinueToEditButton() { const continueToEditButton = await this.getContinueToEditButton(); diff --git a/tests/e2e/utils/pages/edit-free-listings.js b/tests/e2e/utils/pages/edit-free-listings.js index 0d516378b3..5f7e4c63a4 100644 --- a/tests/e2e/utils/pages/edit-free-listings.js +++ b/tests/e2e/utils/pages/edit-free-listings.js @@ -7,8 +7,9 @@ export default class EditFreeListingsPage { } /** - * Get Save Changes button. * - * @returns {Promise} + * Get Save Changes button. + * + * @return {Promise} Get Save Changes button. */ async getSaveChangesButton() { return this.page.getByRole( 'button', { @@ -19,7 +20,8 @@ export default class EditFreeListingsPage { /** * Click the Save Changes button. - * @returns {Promise} + * + * @return {Promise} */ async clickSaveChanges() { const saveChangesButton = await this.getSaveChangesButton(); @@ -28,7 +30,8 @@ export default class EditFreeListingsPage { /** * Check the recommended shipping settings. - * @returns {Promise} + * + * @return {Promise} */ async checkRecommendShippingSettings() { return this.page @@ -39,8 +42,9 @@ export default class EditFreeListingsPage { } /** * Fill the countries shipping time input. - * @param {String} input The shipping time - * @returns {Promise} + * + * @param {string} input The shipping time + * @return {Promise} */ async fillCountriesShippingTimeInput( input ) { await this.page.locator( '.countries-time input' ).fill( input ); @@ -48,7 +52,8 @@ export default class EditFreeListingsPage { /** * Check the destination based tax rates. - * @returns {Promise} + * + * @return {Promise} */ async checkDestinationBasedTaxRates() { await this.page @@ -58,7 +63,8 @@ export default class EditFreeListingsPage { /** * Register the requests when the save button is clicked. - * @returns {Promise} + * + * @return {Promise} The requests. */ registerSavingRequests() { const targetAudienteRequest = this.page.waitForRequest( From d3b3448f9b05ee3777cec7bde29d8353b2966402 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Wed, 30 Aug 2023 12:47:25 +0200 Subject: [PATCH 22/43] Add endpoints to simulate onboarded merchant --- tests/e2e/bin/test-data.php | 71 +++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/tests/e2e/bin/test-data.php b/tests/e2e/bin/test-data.php index cc3132a8fd..55de84dcaa 100644 --- a/tests/e2e/bin/test-data.php +++ b/tests/e2e/bin/test-data.php @@ -33,35 +33,54 @@ function register_routes() { ], ], ); + register_rest_route( + 'wc/v3', + 'gla-test/onboarded-merchant', + [ + [ + 'methods' => 'POST', + 'callback' => __NAMESPACE__ . '\set_onboarded_merchant', + 'permission_callback' => __NAMESPACE__ . '\permissions', + ], + [ + 'methods' => 'DELETE', + 'callback' => __NAMESPACE__ . '\clear_onboarded_merchant', + 'permission_callback' => __NAMESPACE__ . '\permissions', + ], + ], + ); } -add_action( - 'plugins_loaded', - function () { - if ( isset( $_GET['gla-e2e-onboarded'] ) ) { - add_filter( - 'woocommerce_gla_options_get_' . OptionsInterface::REDIRECT_TO_ONBOARDING, - function ( $value ) { - return 'no'; - } - ); - - add_filter( - 'woocommerce_gla_options_get_' . OptionsInterface::MC_SETUP_COMPLETED_AT, - function ( $value ) { - return 1693215209; - } - ); +/** + * Set the onboarded merchant options. + */ +function set_onboarded_merchant() { + /** @var OptionsInterface $options */ + $options = woogle_get_container()->get( OptionsInterface::class ); + $options->update( + OptionsInterface::REDIRECT_TO_ONBOARDING, + 'no' + ); + $options->update( + OptionsInterface::MC_SETUP_COMPLETED_AT, + 1693215209 + ); + $options->update( + OptionsInterface::GOOGLE_CONNECTED, + true + ); +} - add_filter( - 'woocommerce_gla_options_get_' . OptionsInterface::GOOGLE_CONNECTED, - function ( $value ) { - return true; - } - ); - } - } -); +/** + * Clear a previously set onboarded merchant. + */ +function clear_onboarded_merchant() { + /** @var OptionsInterface $options */ + $options = woogle_get_container()->get( OptionsInterface::class ); + $options->delete( OptionsInterface::REDIRECT_TO_ONBOARDING ); + $options->delete( OptionsInterface::MC_SETUP_COMPLETED_AT ); + $options->delete( OptionsInterface::GOOGLE_CONNECTED ); +} /** From 0664818c35c60bd2de6f3f0e36fddb11abf0ff36 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Wed, 30 Aug 2023 12:49:05 +0200 Subject: [PATCH 23/43] Remove filter to simulate options values --- src/Options/Options.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Options/Options.php b/src/Options/Options.php index 8b02575ee9..2164e9c7ab 100644 --- a/src/Options/Options.php +++ b/src/Options/Options.php @@ -41,7 +41,7 @@ public function get( string $name, $default = null ) { if ( ! array_key_exists( $name, $this->options ) ) { $value = get_option( $this->prefix_name( $name ), $default ); - $this->options[ $name ] = apply_filters( "woocommerce_gla_options_get_{$name}", $this->maybe_cast_value( $name, $value ) ); + $this->options[ $name ] = $this->maybe_cast_value( $name, $value ); } return $this->raw_value( $this->options[ $name ] ); From d520d8bafd1af0bea0274f9c07f3917ea12eb2fd Mon Sep 17 00:00:00 2001 From: Jorge M Date: Wed, 30 Aug 2023 12:49:51 +0200 Subject: [PATCH 24/43] Use the test API to simulate onboarded merchant --- tests/e2e/specs/dashboard/edit-free-listings.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/e2e/specs/dashboard/edit-free-listings.test.js b/tests/e2e/specs/dashboard/edit-free-listings.test.js index 554c69d334..eb11f504a4 100644 --- a/tests/e2e/specs/dashboard/edit-free-listings.test.js +++ b/tests/e2e/specs/dashboard/edit-free-listings.test.js @@ -7,6 +7,7 @@ import { test, expect } from '@playwright/test'; */ import DashboardPage from '../../utils/pages/dashboard.js'; import EditFreeListingsPage from '../../utils/pages/edit-free-listings.js'; +import { setOnboardedMerchant, clearOnboardedMerchant } from '../../utils/api'; test.use( { storageState: process.env.ADMINSTATE } ); @@ -31,12 +32,13 @@ test.describe( 'Edit Free Listings', () => { test.beforeAll( async ( { browser } ) => { page = await browser.newPage(); dashboardPage = new DashboardPage( page ); - await dashboardPage.mockOnboarded(); + await setOnboardedMerchant(); await dashboardPage.mockRequests(); await dashboardPage.goto(); } ); test.afterAll( async () => { + await clearOnboardedMerchant(); await page.close(); } ); From c5942d632e6bc42cbe768d95b59364290a390ed2 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Wed, 30 Aug 2023 12:50:31 +0200 Subject: [PATCH 25/43] Add onBoarded functions --- tests/e2e/utils/api.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/e2e/utils/api.js b/tests/e2e/utils/api.js index f009e491cb..4c1c2bca7c 100644 --- a/tests/e2e/utils/api.js +++ b/tests/e2e/utils/api.js @@ -61,3 +61,17 @@ export async function setConversionID() { export async function clearConversionID() { await api().delete( 'gla-test/conversion-id' ); } + +/** + * Set Onboarded Merchant. + */ +export async function setOnboardedMerchant() { + await api().post( 'gla-test/onboarded-merchant' ); +} + +/** + * Clear Onboarded Merchant. + */ +export async function clearOnboardedMerchant() { + await api().delete( 'gla-test/onboarded-merchant' ); +} From a19a8a8718bd05d100be553871414aac23ae225d Mon Sep 17 00:00:00 2001 From: Jorge M Date: Wed, 30 Aug 2023 12:51:24 +0200 Subject: [PATCH 26/43] Remove old mockOnboarded method as we will use the test API to simulate the onboarding status --- tests/e2e/utils/mock-requests.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tests/e2e/utils/mock-requests.js b/tests/e2e/utils/mock-requests.js index 2950ea4871..06f67c3bbf 100644 --- a/tests/e2e/utils/mock-requests.js +++ b/tests/e2e/utils/mock-requests.js @@ -11,18 +11,6 @@ export default class MockRequests { this.page = page; } - /** - * Add the parameter gla-e2e-onboarded to the request to simulate the onboarded state; otherwise, it will redirect to the onboarding page. - * - * @return {Promise} - */ - async mockOnboarded() { - await this.page.route( /\/admin.php\b/, ( route ) => { - const url = `${ route.request().url() }&gla-e2e-onboarded=true`; - route.continue( { url } ); - } ); - } - /** * Fulfill a request with a payload. * From d68f4d7a8e0f33cac9ac1f58e9fd98b1d624a42c Mon Sep 17 00:00:00 2001 From: Jorge M Date: Wed, 30 Aug 2023 12:51:52 +0200 Subject: [PATCH 27/43] Set the number of workers to 1 --- tests/e2e/config/playwright.config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/e2e/config/playwright.config.js b/tests/e2e/config/playwright.config.js index ae3720a15d..b3d99e4407 100644 --- a/tests/e2e/config/playwright.config.js +++ b/tests/e2e/config/playwright.config.js @@ -15,6 +15,9 @@ module.exports = defineConfig( { timeout: 20 * 1000, }, + /* Number of workers, See discusion: https://github.com/woocommerce/google-listings-and-ads/pull/2080#issuecomment-1698810270 */ + workers: 1, + /* Retry on CI only */ retries: process.env.CI ? 2 : 0, From 4b4f063f282e941e25e1158d53c3d3f652e5923d Mon Sep 17 00:00:00 2001 From: Jorge M Date: Wed, 30 Aug 2023 12:58:26 +0200 Subject: [PATCH 28/43] Adding missing awaits --- tests/e2e/utils/pages/dashboard.js | 10 +++++----- tests/e2e/utils/pages/edit-free-listings.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/e2e/utils/pages/dashboard.js b/tests/e2e/utils/pages/dashboard.js index 7949134682..86f788489a 100644 --- a/tests/e2e/utils/pages/dashboard.js +++ b/tests/e2e/utils/pages/dashboard.js @@ -35,7 +35,7 @@ export default class DashboardPage extends MockRequests { */ async mockRequests() { // Mock Reports Programs - this.fulfillMCReportProgram( { + await this.fulfillMCReportProgram( { free_listings: null, products: null, intervals: null, @@ -46,27 +46,27 @@ export default class DashboardPage extends MockRequests { next_page: null, } ); - this.fulfillTargetAudience( { + await this.fulfillTargetAudience( { location: 'selected', countries: [ 'US' ], locale: 'en_US', language: 'English', } ); - this.fulfillJetPackConnection( { + await this.fulfillJetPackConnection( { active: 'yes', owner: 'yes', displayName: 'John', email: 'john@email.com', } ); - this.fulfillGoogleConnection( { + await this.fulfillGoogleConnection( { active: 'yes', email: 'john@email.com', scope: [], } ); - this.fulfillAdsConnection( { + await this.fulfillAdsConnection( { id: 0, currency: null, symbol: '$', diff --git a/tests/e2e/utils/pages/edit-free-listings.js b/tests/e2e/utils/pages/edit-free-listings.js index 5f7e4c63a4..b561ad92dd 100644 --- a/tests/e2e/utils/pages/edit-free-listings.js +++ b/tests/e2e/utils/pages/edit-free-listings.js @@ -25,7 +25,7 @@ export default class EditFreeListingsPage { */ async clickSaveChanges() { const saveChangesButton = await this.getSaveChangesButton(); - saveChangesButton.click(); + await saveChangesButton.click(); } /** From 62f62705d8805e9eff5b7df22271f583a3308485 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Wed, 30 Aug 2023 13:30:58 +0200 Subject: [PATCH 29/43] Fix js lint --- tests/e2e/specs/dashboard/edit-free-listings.test.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/e2e/specs/dashboard/edit-free-listings.test.js b/tests/e2e/specs/dashboard/edit-free-listings.test.js index eb11f504a4..02d754bfd5 100644 --- a/tests/e2e/specs/dashboard/edit-free-listings.test.js +++ b/tests/e2e/specs/dashboard/edit-free-listings.test.js @@ -55,7 +55,8 @@ test.describe( 'Edit Free Listings', () => { await page.waitForLoadState( 'domcontentloaded' ); - const continueToEditButton = await dashboardPage.getContinueToEditButton(); + const continueToEditButton = + await dashboardPage.getContinueToEditButton(); const dontEditButton = await dashboardPage.getDontEditButton(); await expect( continueToEditButton ).toBeEnabled(); await expect( dontEditButton ).toBeEnabled(); @@ -71,7 +72,8 @@ test.describe( 'Edit Free Listings', () => { await editFreeListingsPage.checkRecommendShippingSettings(); await editFreeListingsPage.fillCountriesShippingTimeInput( '5' ); await editFreeListingsPage.checkDestinationBasedTaxRates(); - const saveChangesButton = await editFreeListingsPage.getSaveChangesButton(); + const saveChangesButton = + await editFreeListingsPage.getSaveChangesButton(); await expect( saveChangesButton ).toBeEnabled(); } ); From 097f2fb98b27e70173d74fe72ba3f7e7d372170c Mon Sep 17 00:00:00 2001 From: Jorge M Date: Thu, 31 Aug 2023 10:52:47 +0200 Subject: [PATCH 30/43] Fix misspelling targetAudienceRequest --- tests/e2e/utils/pages/edit-free-listings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/utils/pages/edit-free-listings.js b/tests/e2e/utils/pages/edit-free-listings.js index b561ad92dd..f581875640 100644 --- a/tests/e2e/utils/pages/edit-free-listings.js +++ b/tests/e2e/utils/pages/edit-free-listings.js @@ -67,7 +67,7 @@ export default class EditFreeListingsPage { * @return {Promise} The requests. */ registerSavingRequests() { - const targetAudienteRequest = this.page.waitForRequest( + const targetAudienceRequest = this.page.waitForRequest( ( request ) => request.url().includes( '/gla/mc/target_audience' ) && request.method() === 'POST' && @@ -89,7 +89,7 @@ export default class EditFreeListingsPage { return Promise.all( [ settingsRequest, - targetAudienteRequest, + targetAudienceRequest, syncRequest, ] ); } From e68a11e5cee336f97d3df35523ec689724068c24 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Thu, 31 Aug 2023 10:54:04 +0200 Subject: [PATCH 31/43] Mock saving settings sync request --- tests/e2e/utils/mock-requests.js | 10 ++++++++++ tests/e2e/utils/pages/edit-free-listings.js | 20 +++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/e2e/utils/mock-requests.js b/tests/e2e/utils/mock-requests.js index 06f67c3bbf..406ccf1caa 100644 --- a/tests/e2e/utils/mock-requests.js +++ b/tests/e2e/utils/mock-requests.js @@ -83,4 +83,14 @@ export default class MockRequests { async fulfillAdsConnection( payload ) { await this.fulfillRequest( /\/wc\/gla\/ads\/connection\b/, payload ); } + + /** + * Fulfill the Sync Settings Connection request. + * + * @param {Object} payload + * @return {Promise} + */ + async fulfillSettingsSync( payload ) { + await this.fulfillRequest( /\/wc\/gla\/mc\/settings\/sync\b/, payload ); + } } diff --git a/tests/e2e/utils/pages/edit-free-listings.js b/tests/e2e/utils/pages/edit-free-listings.js index f581875640..aea8797814 100644 --- a/tests/e2e/utils/pages/edit-free-listings.js +++ b/tests/e2e/utils/pages/edit-free-listings.js @@ -1,8 +1,14 @@ -export default class EditFreeListingsPage { +/** + * Internal dependencies + */ +import MockRequests from '../mock-requests'; + +export default class EditFreeListingsPage extends MockRequests { /** * @param {import('@playwright/test').Page} page */ constructor( page ) { + super( page ); this.page = page; } @@ -61,6 +67,18 @@ export default class EditFreeListingsPage { .check(); } + /** + * Mock the successful saving settings response. + * + * @return {Promise} + */ + async mockSuccessfulSavingSettingsResponse() { + await this.fulfillSettingsSync( { + status: 'success', + message: 'Successfully synchronized settings with Google.', + } ); + } + /** * Register the requests when the save button is clicked. * From 819250b94e845ce551f88237d2ddb7478b1bdc93 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Thu, 31 Aug 2023 10:54:46 +0200 Subject: [PATCH 32/43] Move EditFreeListings page in beforeAll --- tests/e2e/specs/dashboard/edit-free-listings.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/e2e/specs/dashboard/edit-free-listings.test.js b/tests/e2e/specs/dashboard/edit-free-listings.test.js index 02d754bfd5..d9d8f41dc3 100644 --- a/tests/e2e/specs/dashboard/edit-free-listings.test.js +++ b/tests/e2e/specs/dashboard/edit-free-listings.test.js @@ -32,6 +32,7 @@ test.describe( 'Edit Free Listings', () => { test.beforeAll( async ( { browser } ) => { page = await browser.newPage(); dashboardPage = new DashboardPage( page ); + editFreeListingsPage = new EditFreeListingsPage( page ); await setOnboardedMerchant(); await dashboardPage.mockRequests(); await dashboardPage.goto(); From 5a9c0e2d1c3e4fd4a7036a79a514a5b2bed12b7d Mon Sep 17 00:00:00 2001 From: Jorge M Date: Thu, 31 Aug 2023 10:58:36 +0200 Subject: [PATCH 33/43] Test the snackbar message after the settings have been saved --- .../specs/dashboard/edit-free-listings.test.js | 7 +++++++ tests/e2e/utils/page.js | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 tests/e2e/utils/page.js diff --git a/tests/e2e/specs/dashboard/edit-free-listings.test.js b/tests/e2e/specs/dashboard/edit-free-listings.test.js index d9d8f41dc3..1b4dec3318 100644 --- a/tests/e2e/specs/dashboard/edit-free-listings.test.js +++ b/tests/e2e/specs/dashboard/edit-free-listings.test.js @@ -8,6 +8,7 @@ import { test, expect } from '@playwright/test'; import DashboardPage from '../../utils/pages/dashboard.js'; import EditFreeListingsPage from '../../utils/pages/edit-free-listings.js'; import { setOnboardedMerchant, clearOnboardedMerchant } from '../../utils/api'; +import { checkSnackBarMessage } from '../../utils/page'; test.use( { storageState: process.env.ADMINSTATE } ); @@ -80,6 +81,7 @@ test.describe( 'Edit Free Listings', () => { test( 'Save changes', async () => { const awaitForRequests = editFreeListingsPage.registerSavingRequests(); + await editFreeListingsPage.mockSuccessfulSavingSettingsResponse(); await editFreeListingsPage.clickSaveChanges(); const requests = await awaitForRequests; const settingsResponse = await ( @@ -92,5 +94,10 @@ test.describe( 'Edit Free Listings', () => { ); expect( settingsResponse.data.shipping_time ).toBe( 'flat' ); expect( settingsResponse.data.tax_rate ).toBe( 'destination' ); + + await checkSnackBarMessage( + page, + 'Your changes to your Free Listings have been saved and will be synced to your Google Merchant Center account.' + ); } ); } ); diff --git a/tests/e2e/utils/page.js b/tests/e2e/utils/page.js new file mode 100644 index 0000000000..9ae0013ad4 --- /dev/null +++ b/tests/e2e/utils/page.js @@ -0,0 +1,18 @@ +/** + * External dependencies + */ +const { expect } = require( '@playwright/test' ); + +/** + * Check the snackbar message. + * + * @param {import('@playwright/test').Page} page The current page. + * @param {string} text The text to check. + * + * @return {Promise} + */ +export async function checkSnackBarMessage( page, text ) { + const snackbarMessage = page.locator( '.components-snackbar__content' ); + await snackbarMessage.waitFor(); + expect( snackbarMessage ).toHaveText( text ); +} From 3e7fbdb4dcd2d55d9d9a288c0e9b24e62d10be05 Mon Sep 17 00:00:00 2001 From: Jorge M Date: Thu, 31 Aug 2023 11:22:19 +0200 Subject: [PATCH 34/43] Reorder imports --- tests/e2e/specs/dashboard/edit-free-listings.test.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/e2e/specs/dashboard/edit-free-listings.test.js b/tests/e2e/specs/dashboard/edit-free-listings.test.js index 1b4dec3318..87a8e60858 100644 --- a/tests/e2e/specs/dashboard/edit-free-listings.test.js +++ b/tests/e2e/specs/dashboard/edit-free-listings.test.js @@ -1,14 +1,14 @@ /** * External dependencies */ -import { test, expect } from '@playwright/test'; +import { expect, test } from '@playwright/test'; /** * Internal dependencies */ +import { clearOnboardedMerchant, setOnboardedMerchant } from '../../utils/api'; +import { checkSnackBarMessage } from '../../utils/page'; import DashboardPage from '../../utils/pages/dashboard.js'; import EditFreeListingsPage from '../../utils/pages/edit-free-listings.js'; -import { setOnboardedMerchant, clearOnboardedMerchant } from '../../utils/api'; -import { checkSnackBarMessage } from '../../utils/page'; test.use( { storageState: process.env.ADMINSTATE } ); @@ -70,7 +70,6 @@ test.describe( 'Edit Free Listings', () => { } ); test( 'Check recommended shipping settings', async () => { - editFreeListingsPage = new EditFreeListingsPage( page ); await editFreeListingsPage.checkRecommendShippingSettings(); await editFreeListingsPage.fillCountriesShippingTimeInput( '5' ); await editFreeListingsPage.checkDestinationBasedTaxRates(); From d0c9172973c5247dd6cb9d27948c76e91a54c3ce Mon Sep 17 00:00:00 2001 From: Jorge M Date: Thu, 31 Aug 2023 12:08:17 +0200 Subject: [PATCH 35/43] Add missing return JSDOC --- tests/e2e/utils/pages/dashboard.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/e2e/utils/pages/dashboard.js b/tests/e2e/utils/pages/dashboard.js index 86f788489a..925426330a 100644 --- a/tests/e2e/utils/pages/dashboard.js +++ b/tests/e2e/utils/pages/dashboard.js @@ -32,6 +32,8 @@ export default class DashboardPage extends MockRequests { /** * Mock all requests related to external accounts such as Merchant Center, Google, etc. + * + * @return {Promise} */ async mockRequests() { // Mock Reports Programs From c31bfd2de26c941a40fa00c768d296d4660b25f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20Wytr=C4=99bowicz?= Date: Thu, 31 Aug 2023 16:45:38 +0200 Subject: [PATCH 36/43] Update `outdated:dewp` scripts, to show only top-level dependencies. In npm 7, the behavior of `npm outdated package-name` changed to show versions for *all* its occurrences within the dependency tree. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 074da6acef..f338de89e1 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "lint:php-tests": "vendor/bin/phpcs --standard=tests/phpcs.xml.dist", "lint:fix:php": "vendor/bin/phpcbf; vendor/bin/phpcbf --standard=tests/phpcs.xml.dist", "lint:pkg-json": "wp-scripts lint-pkg-json", - "outdated:dewp": "npm outdated `cat .externalized.json | sed 's/[][\",]/ /g'` || true", + "outdated:dewp": "npm outdated --color=always `cat .externalized.json | sed 's/[][\",]/ /g'` | grep -E --color=never \"Depended by|google-listings-and-ads$\" || true", "outdated:nondewp": "npm outdated --color=always | grep --color=never --invert -E \"^(.\\[31m|.\\[33m)?(`cat .externalized.json | sed 's/[][\"]//g'| sed 's/,/|/g'`)\"", "packages-update": "wp-scripts packages-update", "start": "wp-scripts start", From 0157e872b1d288a503b49ba919aa101695e8e574 Mon Sep 17 00:00:00 2001 From: Eason Su Date: Fri, 1 Sep 2023 10:38:58 +0800 Subject: [PATCH 37/43] Update DEWP document. Address https://github.com/woocommerce/google-listings-and-ads/pull/2072#issuecomment-1701041999 --- Working with DEWP.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Working with DEWP.md b/Working with DEWP.md index a3edf98086..417849b116 100644 --- a/Working with DEWP.md +++ b/Working with DEWP.md @@ -19,16 +19,17 @@ So we could later inspect that. ## Selective bundling & extracting. -In the past, we did bundle a package that is provided by WordPress/WooCommerce instance introduces errors, as some packages are not effectively modular, so we face version conflicts, style collisions, etc. -Also, we'd like to reduce the size of our bundle, so eventually, we aim to extract/externalize as much as possible and when possible import from an external package. +In the past, we did bundle some packages provided by WordPress/WooCommerce instances. We did so to use a specific package version, for example, to ship a new feature we need, fix, or avoid a bug. However, bundling a package tends to introduce other errors, as some packages are not effectively modular, so we face version conflicts, style collisions, etc. +Also, we'd like to reduce the size of our bundle, so eventually, we aim to extract/externalize as much as possible and import from an external package when possible. -To help with that we had ever implemented the `extracted/` prefix. It was also a custom implementation in webpack.config.js. -Thanks to that even though a package is bundled, the given import would fetch it from external. +To help with that, we had implemented the `extracted/` prefix in the past. It was also a custom implementation in [`webpack.config.js`](webpack.config.js). +Thanks to that, even though a package is bundled, the given import would fetch it from external. -Now, we have already externalized all DEWP-able packages, so the implementation of `extracted/` prefix was removed as well. +Now, we have already externalized all DEWP-able packages, so we also removed the implementation of the `extracted/` prefix. If someday we ever need it again, please refer to: - The PR implemented it: https://github.com/woocommerce/google-listings-and-ads/pull/1762 - The commit removed it: https://github.com/woocommerce/google-listings-and-ads/commit/5a2e20409a53ccb3b7fcbfe5c46988ca2b153b38 +Alternatively, we can consider an opposite approach and selectively **bundle** with a similar prefix implementation. ## NPM scripts From c881223f26ca784b8caed334d34ee3efbc8abbdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20Wytr=C4=99bowicz?= Date: Fri, 1 Sep 2023 20:19:17 +0200 Subject: [PATCH 38/43] Describe the use of `dewped` tool in working `Working with DEWP.md`. Remove local `list-woo-dewped` script. --- Working with DEWP.md | 54 +++++++++++++++++++++++++++------- bin/list-woo-dewped.mjs | 65 ----------------------------------------- package.json | 1 - 3 files changed, 43 insertions(+), 77 deletions(-) delete mode 100755 bin/list-woo-dewped.mjs diff --git a/Working with DEWP.md b/Working with DEWP.md index 03f1212460..2765897ba9 100644 --- a/Working with DEWP.md +++ b/Working with DEWP.md @@ -38,18 +38,50 @@ In a regular project to track outdated packages, you would use `npm outdated`. H ### What is the version of the DEWPed package? -As we externalize packages we lose control of the version of the package that will run in the wild (on WordPress instance). -However, with the current platform, we not only lose control, but we also lose the actual information on the range of package we should expect. -So, even if we know we support WooCommerce 6.9+, what are the `@woocommerce/components` there? +As we externalize a package, we lose control of its version that will run in the wild (on WordPress instance). +However, with the current platform, we not only lose control, but we also lose the actual information on the range of package versions we should expect. +So, even if we know we support WooCommerce L-2, what are the `@woocommerce/components` there? -There is no published table of those, and finding them usually requires quite a lot of manual digging. To mitigate that we created another script. +There is no published table of those, and finding them usually requires quite a lot of manual digging. To mitigate that, we created a tool: [`dewped`](https://github.com/woocommerce/dewped#dewped). -- `npm run dewps:woo 6.9.4` - where `6.9.4` is the version of WooCommerce you would like to check. +First, `latest-versions`/`l-x` helps you check the platform's current, latest, or L-x version: + +```bash +$ dewped l-x +Fetching L-2 versions wordpress! +["6.3.1","6.2.2","6.1.3"] + +$ dewped l-x woocommerce 3 +Fetching L-3 versions woocommerce! +["8.0.3","7.9.0","7.8.2","7.7.2"] +``` + +Then, with `platform-dependency-version`/`pdep` you may check which version of packages is expected to be present in the platform you target to support and compare it to the locally installed versions. + +```bash +$ dewped pdep -w=6.2.2 -c=7.8.2 -d=.externalized.json + Name WordPress 6.2.2 WooCommerce 7.8.2 Local + ────────────────────────────────── ─────────────── ───────────────── ──────── + @woocommerce/components 12.0.0 ^10.3.0 +… +``` + + +You can also use it to check an individual package. For example, when you consider adding a new dependency and want to check which version to anticipate + +```bash +$ dewped pdep --wcVersion=7.8.2 @woocommerce/data + Name WooCommerce 7.8.2 Local + ───────────────── ───────────────── ────── + @woocommerce/data 4.1.0 ^4.1.0 +``` + +Please bear in mind there are still dragons: +1. :warning: By the design of DEWP, there is absolutely no guarantee that the package will be there at the version reported by this tool. DEWP makes use of global variables available in runtime. So, any other extension or custom code running in a particular instance can overwrite what you expect in a package. +2. The fact that `dewped pdep package` reports a version of a package does not mean it was actually externalized from your bundle. It only means WP/WC uses a reported version. To check what was effectively externalized, please inspect your Webpack config and DEWP report file (`externalizedReport`). +3. Some packages externalized by DEWP, like `@woocommerce/settings`, are not packages we could find either in npm or in [`woocommerce/woocommerce/packages/js`](https://github.com/woocommerce/woocommerce/commits/trunk/packages/js/) 🤷. There may be no way for you to install them locally or even reason about their versions. +4. The `dewped` tool implementation relies on the internal structure of WordPress and WooCommerce repos, which is not documented, considered API, or even stable. So, it may potentially change at any time, making this tool fail or return invalid results 🤷. + +(If any of the above caveats bothers you or makes you even even more confused, please refer to https://github.com/WordPress/gutenberg/issues/35630) -Please note this simple script still has several limitations. -1. It works for WooCommerce deps only. WordPress ones are more tricky to get, as the list of packages is less static and regular. Theoretically, we should be able to [use dist-tags](https://github.com/WordPress/gutenberg/issues/24376), like `npm install @wordpress/components@wp-6.1.0` or `npx wp-scripts packages-update --dist-tag=wp-5.8`. -2. It assumes all packages are prefixed with `@woocommerce/` -3. You need to provide the exact full version. The latest, or `x.y` tree lines are not being resolved automatically. -4. Some packages externalized by DEWP, are not packages we could find neither in npm nor in [`woocommerce/woocommerce/packages/js`](https://github.com/woocommerce/woocommerce/commits/trunk/packages/js/) 🤷 -5. It requires at least Node 18 to run. diff --git a/bin/list-woo-dewped.mjs b/bin/list-woo-dewped.mjs deleted file mode 100755 index 55ea063bc6..0000000000 --- a/bin/list-woo-dewped.mjs +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable @woocommerce/dependency-group */ -/* global fetch */ -'use strict'; -import * as fs from 'node:fs'; - -const externalizedListPath = '.externalized.json'; -const wooPackage = ( tag, packageName ) => - `https://raw.githubusercontent.com/woocommerce/woocommerce/${ tag }/packages/js/${ packageName }/package.json`; - -const myArgs = process.argv.slice( 2 ); -const wcTag = myArgs[ 0 ]; -if ( ! wcTag || ! wcTag.match( /^(\d+).(\d+).(\d+).*/ ) ) { - // eslint-disable-next-line no-console - console.warn( - "Warning: It seems you didn't provide a valid WooCommerce tag." - ); -} - -// Warn about the needed fetch, available since Node 18+, or 17 behind the flag. -const majorNodeVersion = Number( process.versions.node.match( /^(\d+)\./ )[ 1 ] ); -if( majorNodeVersion < 18 ) { - // eslint-disable-next-line no-console - console.warn( - "Warning: Please use the Node version that supports `fetch`, like 18+." - ); -} - -const externalizedList = JSON.parse( fs.readFileSync( externalizedListPath ) ); -// Filter only packages externalized by `@woocommerce/dependency-extraction-webpack-plugin`. -const wooDependencies = externalizedList.filter( ( dependency ) => - dependency.startsWith( '@woocommerce/' ) -); -/** - * Tries to fetch the version of `@woocommerce/` package used by the given WooCommerce version. - * - * @param {string} tag Full tag name of released version, `'x.y.z'`. - * @param {string} packageName Package named to be looked up in `/packages/js/*`. - * @return {string|undefined} `'a.b.c'` version of the package, or `undefined` if not found. - */ -async function fetchVersion( tag, packageName ) { - // Strip just the name used as folder name of `/packages/js/*`. - packageName = packageName.match( /@woocommerce\/(.*)/ )[ 1 ]; - - // Read its `package.json`. - return fetch( wooPackage( tag, packageName ) ) - .then( ( response ) => response.json() ) - .then( ( packageJson ) => { - return packageJson.version; - } ) - .catch( () => { - // Most problably there is no package of that name. - return undefined; - } ); -} -// Build a Map-like array of package versions. -const versions = await Promise.all( - wooDependencies.map( async ( packageName ) => { - return [ packageName, await fetchVersion( wcTag, packageName ) ]; - } ) -); -// eslint-disable-next-line no-console -- We want to actually return something to stdout. -console.log( versions ); - -export default versions; diff --git a/package.json b/package.json index f338de89e1..3f1507ff68 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,6 @@ "check-engines": "wp-scripts check-engines", "check-licenses": "wp-scripts check-licenses", "dev": "NODE_ENV=development wp-scripts build", - "dewps:woo": "node bin/list-woo-dewped.mjs", "doc:tracking": "woocommerce-grow-jsdoc ./js/src", "format": "wp-scripts format", "i18n": "WP_CLI_PHP_ARGS='-d memory_limit=2048M' ./vendor/bin/wp i18n make-pot ./ languages/$npm_package_name.pot --slug=$npm_package_name --domain=$npm_package_name --exclude=bin,data,js/src,node_modules,tests,vendor", From f2422fa02992b19944e3cee461bd309f71aaa5fd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 06:25:26 +0000 Subject: [PATCH 39/43] Start `release/2.5.5`. From e358465f9933abe52e493472701e54af8e414256 Mon Sep 17 00:00:00 2001 From: Miguel Perez Pellicer <5908855+puntope@users.noreply.github.com> Date: Tue, 5 Sep 2023 10:29:22 +0400 Subject: [PATCH 40/43] Remove old changelog versions --- readme.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/readme.txt b/readme.txt index 485bc897b6..7889c996f4 100644 --- a/readme.txt +++ b/readme.txt @@ -127,11 +127,4 @@ Yes, you can run both at the same time, and we recommend it! In the US, advertis * Update - Google API Client Services package to v0.312. * Update - Google Ads library to API V14. (package v19.2.0). -= 2.5.2 - 2023-08-08 = -* Fix - Remove `add_woocommerce_extended_task_list_item` and `remove_woocommerce_extended_task_list_item` hooks. -* Fix - WordPress 6.3 compatibility: The forms and image selector may not work due to "setImmediate" deprecation. -* Tweak - Use the latest API to add an item to the WC tasks list. -* Tweak - WC 8.0 compatibility. -* Tweak - WP 6.3 compatibility. - [See changelog for all versions](https://raw.githubusercontent.com/woocommerce/google-listings-and-ads/trunk/changelog.txt). From c6573a3f808da7ac407712f848437ad439dde413 Mon Sep 17 00:00:00 2001 From: Miguel Perez Pellicer <5908855+puntope@users.noreply.github.com> Date: Tue, 5 Sep 2023 11:11:56 +0400 Subject: [PATCH 41/43] Product version bump update --- google-listings-and-ads.php | 4 ++-- package-lock.json | 2 +- package.json | 2 +- readme.txt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/google-listings-and-ads.php b/google-listings-and-ads.php index 9155bdea71..1eedebb6aa 100644 --- a/google-listings-and-ads.php +++ b/google-listings-and-ads.php @@ -3,7 +3,7 @@ * Plugin Name: Google Listings and Ads * Plugin URL: https://wordpress.org/plugins/google-listings-and-ads/ * Description: Native integration with Google that allows merchants to easily display their products across Google’s network. - * Version: 2.5.4 + * Version: 2.5.5 * Author: WooCommerce * Author URI: https://woocommerce.com/ * Text Domain: google-listings-and-ads @@ -30,7 +30,7 @@ defined( 'ABSPATH' ) || exit; -define( 'WC_GLA_VERSION', '2.5.4' ); // WRCS: DEFINED_VERSION. +define( 'WC_GLA_VERSION', '2.5.5' ); // WRCS: DEFINED_VERSION. define( 'WC_GLA_MIN_PHP_VER', '7.4' ); define( 'WC_GLA_MIN_WC_VER', '6.9' ); diff --git a/package-lock.json b/package-lock.json index bd82288e43..6ea4b3b13f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "google-listings-and-ads", - "version": "2.5.4", + "version": "2.5.5", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 0786e77ede..4ea0111c74 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "google-listings-and-ads", "title": "Google Listings and Ads", - "version": "2.5.4", + "version": "2.5.5", "description": "google-listings-and-ads", "author": "Automattic", "license": "GPL-3.0-or-later", diff --git a/readme.txt b/readme.txt index 7889c996f4..4145f09ace 100644 --- a/readme.txt +++ b/readme.txt @@ -5,7 +5,7 @@ Requires at least: 5.9 Tested up to: 6.3 Requires PHP: 7.4 Requires PHP Architecture: 64 Bits -Stable tag: 2.5.4 +Stable tag: 2.5.5 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html From c58137fd8304211998fbd717aa93936d2a9c936c Mon Sep 17 00:00:00 2001 From: Miguel Perez Pellicer <5908855+puntope@users.noreply.github.com> Date: Tue, 5 Sep 2023 11:12:18 +0400 Subject: [PATCH 42/43] Changelog update --- changelog.txt | 7 +++++++ readme.txt | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/changelog.txt b/changelog.txt index ddba52018e..954bc1ddff 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,12 @@ *** WooCommerce Google Listings and Ads Changelog *** += 2.5.5 - 2023-09-05 = +* Dev - Add E2E tests - Dashboard - Edit Free Listings. +* Dev - Clean up workarounds for WooCommerce < 6.8. +* Dev - Externalize all WooCommerce JavaScript packages via Dependency Extraction Webpack Plugin (DEWP) and remove the selective bundling implementation that gradually externalizes packages into DEWP. +* Dev - Update DEWP related tools and docs. +* Fix - Fix Taxonomy Attribute Mapping for Product Variations. + = 2.5.4 - 2023-08-29 = * Dev - Override vulnerability packages: xmlhttprequest-ssl and ws. * Dev - Update trigger method in Hooks Generator Workflow. diff --git a/readme.txt b/readme.txt index 4145f09ace..443e1ebbdd 100644 --- a/readme.txt +++ b/readme.txt @@ -111,6 +111,13 @@ Yes, you can run both at the same time, and we recommend it! In the US, advertis == Changelog == += 2.5.5 - 2023-09-05 = +* Dev - Add E2E tests - Dashboard - Edit Free Listings. +* Dev - Clean up workarounds for WooCommerce < 6.8. +* Dev - Externalize all WooCommerce JavaScript packages via Dependency Extraction Webpack Plugin (DEWP) and remove the selective bundling implementation that gradually externalizes packages into DEWP. +* Dev - Update DEWP related tools and docs. +* Fix - Fix Taxonomy Attribute Mapping for Product Variations. + = 2.5.4 - 2023-08-29 = * Dev - Override vulnerability packages: xmlhttprequest-ssl and ws. * Dev - Update trigger method in Hooks Generator Workflow. From 28d9e4f0f0b5834c86862e84943800ce2ef6898c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 07:12:43 +0000 Subject: [PATCH 43/43] Update hooks documentation from branch. --- src/Hooks/README.md | 436 ++++++++++++++++++++++---------------------- 1 file changed, 218 insertions(+), 218 deletions(-) diff --git a/src/Hooks/README.md b/src/Hooks/README.md index 0a2642e5f1..79067aa4bc 100644 --- a/src/Hooks/README.md +++ b/src/Hooks/README.md @@ -8,7 +8,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [BulkEditInitializer.php#L36](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/BulkEdit/BulkEditInitializer.php#L36) +- [BulkEditInitializer.php#L36](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/BulkEdit/BulkEditInitializer.php#L36) ## woocommerce_admin_disabled @@ -16,7 +16,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCAdminValidator.php#L38](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Internal/Requirements/WCAdminValidator.php#L38) +- [WCAdminValidator.php#L38](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Internal/Requirements/WCAdminValidator.php#L38) ## woocommerce_gla_ads_billing_setup_status @@ -24,8 +24,8 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Ads.php#L112](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Ads.php#L112) -- [Ads.php#L121](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Ads.php#L121) +- [Ads.php#L112](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Ads.php#L112) +- [Ads.php#L121](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Ads.php#L121) ## woocommerce_gla_ads_client_exception @@ -33,24 +33,24 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Ads.php#L73](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Ads.php#L73) -- [Ads.php#L117](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Ads.php#L117) -- [Ads.php#L172](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Ads.php#L172) -- [Ads.php#L214](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Ads.php#L214) -- [Ads.php#L298](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Ads.php#L298) -- [AdsCampaign.php#L127](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsCampaign.php#L127) -- [AdsCampaign.php#L170](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsCampaign.php#L170) -- [AdsCampaign.php#L230](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsCampaign.php#L230) -- [AdsCampaign.php#L285](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsCampaign.php#L285) -- [AdsCampaign.php#L319](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsCampaign.php#L319) -- [AdsAssetGroup.php#L113](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsAssetGroup.php#L113) -- [AdsAssetGroup.php#L304](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsAssetGroup.php#L304) -- [AdsAssetGroup.php#L369](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsAssetGroup.php#L369) -- [AdsReport.php#L105](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsReport.php#L105) -- [AdsConversionAction.php#L97](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsConversionAction.php#L97) -- [AdsConversionAction.php#L143](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsConversionAction.php#L143) -- [AdsAssetGroupAsset.php#L135](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsAssetGroupAsset.php#L135) -- [AdsAssetGroupAsset.php#L202](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsAssetGroupAsset.php#L202) +- [Ads.php#L73](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Ads.php#L73) +- [Ads.php#L117](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Ads.php#L117) +- [Ads.php#L172](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Ads.php#L172) +- [Ads.php#L214](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Ads.php#L214) +- [Ads.php#L298](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Ads.php#L298) +- [AdsCampaign.php#L127](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsCampaign.php#L127) +- [AdsCampaign.php#L170](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsCampaign.php#L170) +- [AdsCampaign.php#L230](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsCampaign.php#L230) +- [AdsCampaign.php#L285](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsCampaign.php#L285) +- [AdsCampaign.php#L319](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsCampaign.php#L319) +- [AdsAssetGroup.php#L113](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsAssetGroup.php#L113) +- [AdsAssetGroup.php#L304](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsAssetGroup.php#L304) +- [AdsAssetGroup.php#L369](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsAssetGroup.php#L369) +- [AdsReport.php#L105](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsReport.php#L105) +- [AdsConversionAction.php#L97](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsConversionAction.php#L97) +- [AdsConversionAction.php#L143](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsConversionAction.php#L143) +- [AdsAssetGroupAsset.php#L135](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsAssetGroupAsset.php#L135) +- [AdsAssetGroupAsset.php#L202](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsAssetGroupAsset.php#L202) ## woocommerce_gla_ads_setup_completed @@ -58,7 +58,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [SetupCompleteController.php#L46](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/Ads/SetupCompleteController.php#L46) +- [SetupCompleteController.php#L46](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/Ads/SetupCompleteController.php#L46) ## woocommerce_gla_attribute_applicable_product_types_ @@ -66,8 +66,8 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AttributeManager.php#L295](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/Attributes/AttributeManager.php#L295) -- [AttributesForm.php#L69](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/Product/Attributes/AttributesForm.php#L69) +- [AttributeManager.php#L295](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/Attributes/AttributeManager.php#L295) +- [AttributesForm.php#L69](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/Product/Attributes/AttributesForm.php#L69) ## woocommerce_gla_attribute_hidden_product_types_ @@ -75,7 +75,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AttributesForm.php#L74](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/Product/Attributes/AttributesForm.php#L74) +- [AttributesForm.php#L74](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/Product/Attributes/AttributesForm.php#L74) ## woocommerce_gla_attribute_mapping_sources @@ -83,7 +83,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [IsFieldTrait.php#L31](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L31) +- [IsFieldTrait.php#L31](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L31) ## woocommerce_gla_attribute_mapping_sources_custom_attributes @@ -91,7 +91,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [IsFieldTrait.php#L125](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L125) +- [IsFieldTrait.php#L125](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L125) ## woocommerce_gla_attribute_mapping_sources_global_attributes @@ -99,7 +99,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [IsFieldTrait.php#L64](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L64) +- [IsFieldTrait.php#L64](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L64) ## woocommerce_gla_attribute_mapping_sources_product_fields @@ -107,7 +107,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [IsFieldTrait.php#L115](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L115) +- [IsFieldTrait.php#L115](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L115) ## woocommerce_gla_attribute_mapping_sources_taxonomies @@ -115,7 +115,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [IsFieldTrait.php#L65](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L65) +- [IsFieldTrait.php#L65](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/AttributeMapping/Traits/IsFieldTrait.php#L65) ## woocommerce_gla_attributes_tab_applicable_product_types @@ -123,7 +123,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AttributesTab.php#L190](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/Product/Attributes/AttributesTab.php#L190) +- [AttributesTab.php#L190](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/Product/Attributes/AttributesTab.php#L190) ## woocommerce_gla_batch_deleted_products @@ -131,7 +131,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductSyncer.php#L229](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L229) +- [ProductSyncer.php#L229](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L229) ## woocommerce_gla_batch_retry_delete_products @@ -139,7 +139,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductSyncer.php#L354](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L354) +- [ProductSyncer.php#L354](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L354) ## woocommerce_gla_batch_retry_update_products @@ -147,7 +147,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductSyncer.php#L298](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L298) +- [ProductSyncer.php#L298](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L298) ## woocommerce_gla_batch_updated_products @@ -155,7 +155,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductSyncer.php#L143](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L143) +- [ProductSyncer.php#L143](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L143) ## woocommerce_gla_batched_job_size @@ -163,8 +163,8 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [UpdateSyncableProductsCount.php#L74](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Jobs/UpdateSyncableProductsCount.php#L74) -- [AbstractBatchedActionSchedulerJob.php#L104](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Jobs/AbstractBatchedActionSchedulerJob.php#L104) +- [UpdateSyncableProductsCount.php#L74](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Jobs/UpdateSyncableProductsCount.php#L74) +- [AbstractBatchedActionSchedulerJob.php#L104](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Jobs/AbstractBatchedActionSchedulerJob.php#L104) ## woocommerce_gla_bulk_update_coupon @@ -172,7 +172,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [CouponBulkEdit.php#L134](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/BulkEdit/CouponBulkEdit.php#L134) +- [CouponBulkEdit.php#L134](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/BulkEdit/CouponBulkEdit.php#L134) ## woocommerce_gla_conversion_action_name @@ -180,7 +180,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AdsConversionAction.php#L66](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/AdsConversionAction.php#L66) +- [AdsConversionAction.php#L66](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/AdsConversionAction.php#L66) ## woocommerce_gla_coupons_delete_retry_on_failure @@ -188,7 +188,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [CouponSyncer.php#L437](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L437) +- [CouponSyncer.php#L437](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L437) ## woocommerce_gla_coupons_update_retry_on_failure @@ -196,7 +196,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [CouponSyncer.php#L399](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L399) +- [CouponSyncer.php#L399](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L399) ## woocommerce_gla_custom_merchant_issues @@ -204,7 +204,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [MerchantStatuses.php#L435](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/MerchantStatuses.php#L435) +- [MerchantStatuses.php#L435](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/MerchantStatuses.php#L435) ## woocommerce_gla_debug_message @@ -212,38 +212,38 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [IssuesController.php#L96](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/MerchantCenter/IssuesController.php#L96) -- [WCProductAdapter.php#L203](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L203) -- [ProductSyncer.php#L149](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L149) -- [ProductSyncer.php#L159](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L159) -- [ProductSyncer.php#L235](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L235) -- [ProductSyncer.php#L245](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L245) -- [ProductRepository.php#L304](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductRepository.php#L304) -- [SyncerHooks.php#L197](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/SyncerHooks.php#L197) -- [ProductHelper.php#L459](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductHelper.php#L459) -- [ProductHelper.php#L491](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductHelper.php#L491) -- [BatchProductHelper.php#L208](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/BatchProductHelper.php#L208) -- [BatchProductHelper.php#L231](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/BatchProductHelper.php#L231) -- [SyncerHooks.php#L177](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/SyncerHooks.php#L177) -- [CouponHelper.php#L255](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponHelper.php#L255) -- [CouponHelper.php#L292](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponHelper.php#L292) -- [CouponSyncer.php#L102](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L102) -- [CouponSyncer.php#L115](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L115) -- [CouponSyncer.php#L140](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L140) -- [CouponSyncer.php#L154](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L154) -- [CouponSyncer.php#L171](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L171) -- [CouponSyncer.php#L194](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L194) -- [CouponSyncer.php#L259](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L259) -- [CouponSyncer.php#L308](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L308) -- [CouponSyncer.php#L327](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L327) -- [MerchantStatuses.php#L334](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/MerchantStatuses.php#L334) -- [MerchantStatuses.php#L357](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/MerchantStatuses.php#L357) -- [MerchantCenterService.php#L305](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/MerchantCenterService.php#L305) -- [ActionSchedulerJobMonitor.php#L117](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Jobs/ActionSchedulerJobMonitor.php#L117) -- [ActionSchedulerJobMonitor.php#L126](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Jobs/ActionSchedulerJobMonitor.php#L126) -- [CleanupSyncedProducts.php#L74](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Jobs/CleanupSyncedProducts.php#L74) -- [ProductMetaQueryHelper.php#L92](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/DB/ProductMetaQueryHelper.php#L92) -- [ProductMetaQueryHelper.php#L123](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/DB/ProductMetaQueryHelper.php#L123) +- [IssuesController.php#L96](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/MerchantCenter/IssuesController.php#L96) +- [WCProductAdapter.php#L203](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L203) +- [ProductSyncer.php#L149](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L149) +- [ProductSyncer.php#L159](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L159) +- [ProductSyncer.php#L235](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L235) +- [ProductSyncer.php#L245](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L245) +- [ProductRepository.php#L304](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductRepository.php#L304) +- [SyncerHooks.php#L197](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/SyncerHooks.php#L197) +- [ProductHelper.php#L459](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductHelper.php#L459) +- [ProductHelper.php#L491](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductHelper.php#L491) +- [BatchProductHelper.php#L208](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/BatchProductHelper.php#L208) +- [BatchProductHelper.php#L231](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/BatchProductHelper.php#L231) +- [SyncerHooks.php#L177](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/SyncerHooks.php#L177) +- [CouponHelper.php#L255](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponHelper.php#L255) +- [CouponHelper.php#L292](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponHelper.php#L292) +- [CouponSyncer.php#L102](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L102) +- [CouponSyncer.php#L115](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L115) +- [CouponSyncer.php#L140](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L140) +- [CouponSyncer.php#L154](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L154) +- [CouponSyncer.php#L171](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L171) +- [CouponSyncer.php#L194](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L194) +- [CouponSyncer.php#L259](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L259) +- [CouponSyncer.php#L308](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L308) +- [CouponSyncer.php#L327](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L327) +- [MerchantStatuses.php#L334](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/MerchantStatuses.php#L334) +- [MerchantStatuses.php#L357](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/MerchantStatuses.php#L357) +- [MerchantCenterService.php#L305](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/MerchantCenterService.php#L305) +- [ActionSchedulerJobMonitor.php#L117](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Jobs/ActionSchedulerJobMonitor.php#L117) +- [ActionSchedulerJobMonitor.php#L126](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Jobs/ActionSchedulerJobMonitor.php#L126) +- [CleanupSyncedProducts.php#L74](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Jobs/CleanupSyncedProducts.php#L74) +- [ProductMetaQueryHelper.php#L92](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/DB/ProductMetaQueryHelper.php#L92) +- [ProductMetaQueryHelper.php#L123](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/DB/ProductMetaQueryHelper.php#L123) ## woocommerce_gla_deleted_promotions @@ -251,7 +251,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [CouponSyncer.php#L321](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L321) +- [CouponSyncer.php#L321](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L321) ## woocommerce_gla_dimension_unit @@ -259,7 +259,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L427](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L427) +- [WCProductAdapter.php#L427](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L427) ## woocommerce_gla_disable_gtag_tracking @@ -267,7 +267,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [GlobalSiteTag.php#L464](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Google/GlobalSiteTag.php#L464) +- [GlobalSiteTag.php#L464](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Google/GlobalSiteTag.php#L464) ## woocommerce_gla_enable_connection_test @@ -275,7 +275,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ConnectionTest.php#L87](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/ConnectionTest.php#L87) +- [ConnectionTest.php#L87](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/ConnectionTest.php#L87) ## woocommerce_gla_enable_debug_logging @@ -283,7 +283,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [DebugLogger.php#L33](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Logging/DebugLogger.php#L33) +- [DebugLogger.php#L33](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Logging/DebugLogger.php#L33) ## woocommerce_gla_enable_mcm @@ -291,7 +291,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [GLAChannel.php#L75](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MultichannelMarketing/GLAChannel.php#L75) +- [GLAChannel.php#L75](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MultichannelMarketing/GLAChannel.php#L75) ## woocommerce_gla_enable_reports @@ -299,7 +299,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Admin.php#L250](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/Admin.php#L250) +- [Admin.php#L250](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/Admin.php#L250) ## woocommerce_gla_error @@ -307,23 +307,23 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [PHPView.php#L136](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/View/PHPView.php#L136) -- [PHPView.php#L164](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/View/PHPView.php#L164) -- [PHPView.php#L208](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/View/PHPView.php#L208) -- [ProductMetaHandler.php#L173](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductMetaHandler.php#L173) -- [ProductSyncer.php#L301](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L301) -- [ProductSyncer.php#L324](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L324) -- [ProductSyncer.php#L357](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L357) -- [ProductSyncer.php#L372](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L372) -- [ProductHelper.php#L351](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductHelper.php#L351) -- [ProductHelper.php#L567](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductHelper.php#L567) -- [BatchProductHelper.php#L248](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/BatchProductHelper.php#L248) -- [AttributeManager.php#L269](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/Attributes/AttributeManager.php#L269) -- [CouponMetaHandler.php#L220](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponMetaHandler.php#L220) -- [CouponSyncer.php#L409](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L409) -- [CouponSyncer.php#L447](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L447) -- [CouponSyncer.php#L465](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L465) -- [ProductMetaQueryHelper.php#L139](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/DB/ProductMetaQueryHelper.php#L139) +- [PHPView.php#L136](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/View/PHPView.php#L136) +- [PHPView.php#L164](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/View/PHPView.php#L164) +- [PHPView.php#L208](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/View/PHPView.php#L208) +- [ProductMetaHandler.php#L173](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductMetaHandler.php#L173) +- [ProductSyncer.php#L301](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L301) +- [ProductSyncer.php#L324](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L324) +- [ProductSyncer.php#L357](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L357) +- [ProductSyncer.php#L372](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L372) +- [ProductHelper.php#L351](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductHelper.php#L351) +- [ProductHelper.php#L567](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductHelper.php#L567) +- [BatchProductHelper.php#L248](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/BatchProductHelper.php#L248) +- [AttributeManager.php#L269](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/Attributes/AttributeManager.php#L269) +- [CouponMetaHandler.php#L220](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponMetaHandler.php#L220) +- [CouponSyncer.php#L409](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L409) +- [CouponSyncer.php#L447](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L447) +- [CouponSyncer.php#L465](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L465) +- [ProductMetaQueryHelper.php#L139](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/DB/ProductMetaQueryHelper.php#L139) ## woocommerce_gla_exception @@ -331,27 +331,27 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [PHPView.php#L87](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/View/PHPView.php#L87) -- [Connection.php#L95](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Connection.php#L95) -- [ContactInformationController.php#L242](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/MerchantCenter/ContactInformationController.php#L242) -- [SettingsSyncController.php#L79](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/MerchantCenter/SettingsSyncController.php#L79) -- [ProductVisibilityController.php#L193](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/MerchantCenter/ProductVisibilityController.php#L193) -- [NoteInitializer.php#L74](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Notes/NoteInitializer.php#L74) -- [NoteInitializer.php#L116](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Notes/NoteInitializer.php#L116) -- [ClearProductStatsCache.php#L61](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Event/ClearProductStatsCache.php#L61) -- [GoogleServiceProvider.php#L223](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Internal/DependencyManagement/GoogleServiceProvider.php#L223) -- [ProductSyncer.php#L134](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L134) -- [ProductSyncer.php#L220](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L220) -- [ScriptWithBuiltDependenciesAsset.php#L66](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Assets/ScriptWithBuiltDependenciesAsset.php#L66) -- [CouponSyncer.php#L202](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L202) -- [CouponSyncer.php#L292](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L292) -- [DateTime.php#L44](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/Input/DateTime.php#L44) -- [DateTime.php#L80](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/Input/DateTime.php#L80) -- [ChannelVisibilityMetaBox.php#L190](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/MetaBox/ChannelVisibilityMetaBox.php#L190) -- [CouponChannelVisibilityMetaBox.php#L197](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/MetaBox/CouponChannelVisibilityMetaBox.php#L197) -- [WooCommercePreOrders.php#L111](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Integration/WooCommercePreOrders.php#L111) -- [WooCommercePreOrders.php#L131](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Integration/WooCommercePreOrders.php#L131) -- [PluginUpdate.php#L75](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Jobs/Update/PluginUpdate.php#L75) +- [PHPView.php#L87](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/View/PHPView.php#L87) +- [Connection.php#L95](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Connection.php#L95) +- [ContactInformationController.php#L242](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/MerchantCenter/ContactInformationController.php#L242) +- [SettingsSyncController.php#L79](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/MerchantCenter/SettingsSyncController.php#L79) +- [ProductVisibilityController.php#L193](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/MerchantCenter/ProductVisibilityController.php#L193) +- [NoteInitializer.php#L74](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Notes/NoteInitializer.php#L74) +- [NoteInitializer.php#L116](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Notes/NoteInitializer.php#L116) +- [ClearProductStatsCache.php#L61](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Event/ClearProductStatsCache.php#L61) +- [GoogleServiceProvider.php#L223](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Internal/DependencyManagement/GoogleServiceProvider.php#L223) +- [ProductSyncer.php#L134](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L134) +- [ProductSyncer.php#L220](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L220) +- [ScriptWithBuiltDependenciesAsset.php#L66](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Assets/ScriptWithBuiltDependenciesAsset.php#L66) +- [CouponSyncer.php#L202](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L202) +- [CouponSyncer.php#L292](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L292) +- [DateTime.php#L44](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/Input/DateTime.php#L44) +- [DateTime.php#L80](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/Input/DateTime.php#L80) +- [ChannelVisibilityMetaBox.php#L190](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/MetaBox/ChannelVisibilityMetaBox.php#L190) +- [CouponChannelVisibilityMetaBox.php#L197](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/MetaBox/CouponChannelVisibilityMetaBox.php#L197) +- [WooCommercePreOrders.php#L111](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Integration/WooCommercePreOrders.php#L111) +- [WooCommercePreOrders.php#L131](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Integration/WooCommercePreOrders.php#L131) +- [PluginUpdate.php#L75](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Jobs/Update/PluginUpdate.php#L75) ## woocommerce_gla_force_run_install @@ -359,7 +359,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Installer.php#L82](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Installer.php#L82) +- [Installer.php#L82](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Installer.php#L82) ## woocommerce_gla_get_google_product_offer_id @@ -367,7 +367,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L280](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L280) +- [WCProductAdapter.php#L280](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L280) ## woocommerce_gla_get_sync_ready_products_filter @@ -375,7 +375,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductFilter.php#L61](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductFilter.php#L61) +- [ProductFilter.php#L61](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductFilter.php#L61) ## woocommerce_gla_get_sync_ready_products_pre_filter @@ -383,7 +383,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductFilter.php#L47](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductFilter.php#L47) +- [ProductFilter.php#L47](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductFilter.php#L47) ## woocommerce_gla_get_wc_product_id @@ -391,7 +391,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductHelper.php#L278](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductHelper.php#L278) +- [ProductHelper.php#L278](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductHelper.php#L278) ## woocommerce_gla_guzzle_client_exception @@ -399,20 +399,20 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Connection.php#L70](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Connection.php#L70) -- [Connection.php#L91](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Connection.php#L91) -- [Connection.php#L126](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Connection.php#L126) -- [Middleware.php#L80](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L80) -- [Middleware.php#L178](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L178) -- [Middleware.php#L228](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L228) -- [Middleware.php#L273](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L273) -- [Middleware.php#L344](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L344) -- [Middleware.php#L394](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L394) -- [Middleware.php#L418](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L418) -- [Middleware.php#L452](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L452) -- [Middleware.php#L552](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L552) -- [Middleware.php#L611](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L611) -- [GoogleServiceProvider.php#L247](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Internal/DependencyManagement/GoogleServiceProvider.php#L247) +- [Connection.php#L70](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Connection.php#L70) +- [Connection.php#L91](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Connection.php#L91) +- [Connection.php#L126](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Connection.php#L126) +- [Middleware.php#L80](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L80) +- [Middleware.php#L178](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L178) +- [Middleware.php#L228](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L228) +- [Middleware.php#L273](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L273) +- [Middleware.php#L344](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L344) +- [Middleware.php#L394](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L394) +- [Middleware.php#L418](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L418) +- [Middleware.php#L452](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L452) +- [Middleware.php#L552](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L552) +- [Middleware.php#L611](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L611) +- [GoogleServiceProvider.php#L247](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Internal/DependencyManagement/GoogleServiceProvider.php#L247) ## woocommerce_gla_guzzle_invalid_response @@ -420,15 +420,15 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Connection.php#L66](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Connection.php#L66) -- [Connection.php#L121](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Connection.php#L121) -- [Middleware.php#L159](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L159) -- [Middleware.php#L223](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L223) -- [Middleware.php#L267](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L267) -- [Middleware.php#L339](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L339) -- [Middleware.php#L389](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L389) -- [Middleware.php#L548](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L548) -- [Middleware.php#L599](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L599) +- [Connection.php#L66](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Connection.php#L66) +- [Connection.php#L121](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Connection.php#L121) +- [Middleware.php#L159](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L159) +- [Middleware.php#L223](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L223) +- [Middleware.php#L267](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L267) +- [Middleware.php#L339](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L339) +- [Middleware.php#L389](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L389) +- [Middleware.php#L548](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L548) +- [Middleware.php#L599](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L599) ## woocommerce_gla_hidden_coupon_types @@ -436,7 +436,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [CouponSyncer.php#L378](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L378) +- [CouponSyncer.php#L378](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L378) ## woocommerce_gla_hidden_product_types @@ -444,7 +444,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductSyncer.php#L275](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L275) +- [ProductSyncer.php#L275](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L275) ## woocommerce_gla_job_failure_rate_threshold @@ -452,7 +452,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ActionSchedulerJobMonitor.php#L186](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Jobs/ActionSchedulerJobMonitor.php#L186) +- [ActionSchedulerJobMonitor.php#L186](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Jobs/ActionSchedulerJobMonitor.php#L186) ## woocommerce_gla_job_failure_timeframe @@ -460,7 +460,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ActionSchedulerJobMonitor.php#L195](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Jobs/ActionSchedulerJobMonitor.php#L195) +- [ActionSchedulerJobMonitor.php#L195](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Jobs/ActionSchedulerJobMonitor.php#L195) ## woocommerce_gla_mapping_rules_change @@ -468,9 +468,9 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AttributeMappingRulesController.php#L143](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/AttributeMapping/AttributeMappingRulesController.php#L143) -- [AttributeMappingRulesController.php#L166](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/AttributeMapping/AttributeMappingRulesController.php#L166) -- [AttributeMappingRulesController.php#L188](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/AttributeMapping/AttributeMappingRulesController.php#L188) +- [AttributeMappingRulesController.php#L143](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/AttributeMapping/AttributeMappingRulesController.php#L143) +- [AttributeMappingRulesController.php#L166](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/AttributeMapping/AttributeMappingRulesController.php#L166) +- [AttributeMappingRulesController.php#L188](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/AttributeMapping/AttributeMappingRulesController.php#L188) ## woocommerce_gla_mc_account_review_lifetime @@ -478,7 +478,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [RequestReviewStatuses.php#L146](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Google/RequestReviewStatuses.php#L146) +- [RequestReviewStatuses.php#L146](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Google/RequestReviewStatuses.php#L146) ## woocommerce_gla_mc_client_exception @@ -486,14 +486,14 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [MerchantReport.php#L95](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/MerchantReport.php#L95) -- [Merchant.php#L92](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Merchant.php#L92) -- [Merchant.php#L140](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Merchant.php#L140) -- [Merchant.php#L172](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Merchant.php#L172) -- [Merchant.php#L191](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Merchant.php#L191) -- [Merchant.php#L247](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Merchant.php#L247) -- [Merchant.php#L292](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Merchant.php#L292) -- [Merchant.php#L354](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Merchant.php#L354) +- [MerchantReport.php#L95](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/MerchantReport.php#L95) +- [Merchant.php#L92](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Merchant.php#L92) +- [Merchant.php#L140](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Merchant.php#L140) +- [Merchant.php#L172](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Merchant.php#L172) +- [Merchant.php#L191](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Merchant.php#L191) +- [Merchant.php#L247](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Merchant.php#L247) +- [Merchant.php#L292](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Merchant.php#L292) +- [Merchant.php#L354](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Merchant.php#L354) ## woocommerce_gla_mc_settings_sync @@ -501,7 +501,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [SettingsSyncController.php#L69](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/MerchantCenter/SettingsSyncController.php#L69) +- [SettingsSyncController.php#L69](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/MerchantCenter/SettingsSyncController.php#L69) ## woocommerce_gla_mc_status_lifetime @@ -509,7 +509,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [MerchantStatuses.php#L778](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/MerchantStatuses.php#L778) +- [MerchantStatuses.php#L778](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/MerchantStatuses.php#L778) ## woocommerce_gla_merchant_issue_override @@ -517,7 +517,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [IssuesController.php#L86](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/MerchantCenter/IssuesController.php#L86) +- [IssuesController.php#L86](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/MerchantCenter/IssuesController.php#L86) ## woocommerce_gla_merchant_status_google_ids_chunk @@ -525,7 +525,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [MerchantStatuses.php#L191](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/MerchantStatuses.php#L191) +- [MerchantStatuses.php#L191](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/MerchantStatuses.php#L191) ## woocommerce_gla_merchant_status_presync_issues_chunk @@ -533,7 +533,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [MerchantStatuses.php#L531](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/MerchantStatuses.php#L531) +- [MerchantStatuses.php#L531](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/MerchantStatuses.php#L531) ## woocommerce_gla_options_deleted_ @@ -541,7 +541,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Options.php#L103](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Options/Options.php#L103) +- [Options.php#L103](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Options/Options.php#L103) ## woocommerce_gla_options_updated_ @@ -549,8 +549,8 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Options.php#L65](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Options/Options.php#L65) -- [Options.php#L85](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Options/Options.php#L85) +- [Options.php#L65](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Options/Options.php#L65) +- [Options.php#L85](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Options/Options.php#L85) ## woocommerce_gla_prepared_response_->GET_ROUTE_NAME @@ -558,7 +558,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [BaseController.php#L158](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/BaseController.php#L158) +- [BaseController.php#L158](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/BaseController.php#L158) ## woocommerce_gla_product_attribute_types @@ -566,7 +566,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AttributeManager.php#L243](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/Attributes/AttributeManager.php#L243) +- [AttributeManager.php#L243](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/Attributes/AttributeManager.php#L243) ## woocommerce_gla_product_attribute_value_ @@ -574,8 +574,8 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L901](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L901) -- [WCProductAdapter.php#L952](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L952) +- [WCProductAdapter.php#L901](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L901) +- [WCProductAdapter.php#L952](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L952) ## woocommerce_gla_product_attribute_value_description @@ -583,7 +583,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L348](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L348) +- [WCProductAdapter.php#L348](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L348) ## woocommerce_gla_product_attribute_value_options_::get_id @@ -591,7 +591,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AttributesForm.php#L108](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Admin/Product/Attributes/AttributesForm.php#L108) +- [AttributesForm.php#L108](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Admin/Product/Attributes/AttributesForm.php#L108) ## woocommerce_gla_product_attribute_value_price @@ -599,7 +599,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L630](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L630) +- [WCProductAdapter.php#L630](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L630) ## woocommerce_gla_product_attribute_value_sale_price @@ -607,7 +607,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L680](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L680) +- [WCProductAdapter.php#L680](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L680) ## woocommerce_gla_product_attribute_values @@ -615,7 +615,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L167](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L167) +- [WCProductAdapter.php#L167](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L167) ## woocommerce_gla_product_description_apply_shortcodes @@ -623,7 +623,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L317](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L317) +- [WCProductAdapter.php#L317](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L317) ## woocommerce_gla_product_property_value_is_virtual @@ -631,7 +631,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L767](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L767) +- [WCProductAdapter.php#L767](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L767) ## woocommerce_gla_product_query_args @@ -639,7 +639,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductRepository.php#L360](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductRepository.php#L360) +- [ProductRepository.php#L360](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductRepository.php#L360) ## woocommerce_gla_products_delete_retry_on_failure @@ -647,7 +647,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductSyncer.php#L353](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L353) +- [ProductSyncer.php#L353](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L353) ## woocommerce_gla_products_update_retry_on_failure @@ -655,7 +655,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductSyncer.php#L297](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L297) +- [ProductSyncer.php#L297](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L297) ## woocommerce_gla_ready_for_syncing @@ -663,7 +663,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [MerchantCenterService.php#L118](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/MerchantCenterService.php#L118) +- [MerchantCenterService.php#L118](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/MerchantCenterService.php#L118) ## woocommerce_gla_request_review_failure @@ -671,9 +671,9 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Middleware.php#L592](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L592) -- [RequestReviewController.php#L110](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/MerchantCenter/RequestReviewController.php#L110) -- [RequestReviewController.php#L122](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Site/Controllers/MerchantCenter/RequestReviewController.php#L122) +- [Middleware.php#L592](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L592) +- [RequestReviewController.php#L110](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/MerchantCenter/RequestReviewController.php#L110) +- [RequestReviewController.php#L122](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Site/Controllers/MerchantCenter/RequestReviewController.php#L122) ## woocommerce_gla_request_review_response @@ -681,7 +681,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Middleware.php#L545](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L545) +- [Middleware.php#L545](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L545) ## woocommerce_gla_retry_delete_coupons @@ -689,7 +689,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [CouponSyncer.php#L442](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L442) +- [CouponSyncer.php#L442](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L442) ## woocommerce_gla_retry_update_coupons @@ -697,7 +697,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [CouponSyncer.php#L404](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L404) +- [CouponSyncer.php#L404](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L404) ## woocommerce_gla_site_claim_failure @@ -705,10 +705,10 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Middleware.php#L268](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L268) -- [Middleware.php#L274](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L274) -- [Merchant.php#L93](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Merchant.php#L93) -- [AccountService.php#L365](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/AccountService.php#L365) +- [Middleware.php#L268](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L268) +- [Middleware.php#L274](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L274) +- [Merchant.php#L93](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Merchant.php#L93) +- [AccountService.php#L365](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/AccountService.php#L365) ## woocommerce_gla_site_claim_overwrite_required @@ -716,7 +716,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AccountService.php#L360](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/AccountService.php#L360) +- [AccountService.php#L360](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/AccountService.php#L360) ## woocommerce_gla_site_claim_success @@ -724,8 +724,8 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [Middleware.php#L263](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Middleware.php#L263) -- [Merchant.php#L90](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/Merchant.php#L90) +- [Middleware.php#L263](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Middleware.php#L263) +- [Merchant.php#L90](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/Merchant.php#L90) ## woocommerce_gla_site_url @@ -733,7 +733,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [PluginHelper.php#L189](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/PluginHelper.php#L189) +- [PluginHelper.php#L189](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/PluginHelper.php#L189) ## woocommerce_gla_site_verify_failure @@ -741,9 +741,9 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [SiteVerification.php#L58](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/SiteVerification.php#L58) -- [SiteVerification.php#L66](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/SiteVerification.php#L66) -- [SiteVerification.php#L87](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/SiteVerification.php#L87) +- [SiteVerification.php#L58](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/SiteVerification.php#L58) +- [SiteVerification.php#L66](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/SiteVerification.php#L66) +- [SiteVerification.php#L87](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/SiteVerification.php#L87) ## woocommerce_gla_site_verify_success @@ -751,7 +751,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [SiteVerification.php#L85](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/SiteVerification.php#L85) +- [SiteVerification.php#L85](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/SiteVerification.php#L85) ## woocommerce_gla_supported_coupon_types @@ -759,7 +759,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [CouponSyncer.php#L365](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L365) +- [CouponSyncer.php#L365](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L365) ## woocommerce_gla_supported_product_types @@ -767,7 +767,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductSyncer.php#L264](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductSyncer.php#L264) +- [ProductSyncer.php#L264](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductSyncer.php#L264) ## woocommerce_gla_sv_client_exception @@ -775,8 +775,8 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [SiteVerification.php#L120](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/SiteVerification.php#L120) -- [SiteVerification.php#L162](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/API/Google/SiteVerification.php#L162) +- [SiteVerification.php#L120](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/SiteVerification.php#L120) +- [SiteVerification.php#L162](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/API/Google/SiteVerification.php#L162) ## woocommerce_gla_tax_excluded @@ -784,7 +784,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L591](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L591) +- [WCProductAdapter.php#L591](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L591) ## woocommerce_gla_updated_coupon @@ -792,7 +792,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [CouponSyncer.php#L168](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Coupon/CouponSyncer.php#L168) +- [CouponSyncer.php#L168](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Coupon/CouponSyncer.php#L168) ## woocommerce_gla_url_switch_required @@ -800,7 +800,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AccountService.php#L445](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/AccountService.php#L445) +- [AccountService.php#L445](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/AccountService.php#L445) ## woocommerce_gla_url_switch_success @@ -808,7 +808,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [AccountService.php#L468](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/MerchantCenter/AccountService.php#L468) +- [AccountService.php#L468](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/MerchantCenter/AccountService.php#L468) ## woocommerce_gla_use_short_description @@ -816,7 +816,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L294](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L294) +- [WCProductAdapter.php#L294](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L294) ## woocommerce_gla_wcs_url @@ -824,8 +824,8 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [PluginHelper.php#L174](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/PluginHelper.php#L174) -- [PluginHelper.php#L178](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/PluginHelper.php#L178) +- [PluginHelper.php#L174](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/PluginHelper.php#L174) +- [PluginHelper.php#L178](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/PluginHelper.php#L178) ## woocommerce_gla_weight_unit @@ -833,7 +833,7 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [WCProductAdapter.php#L428](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/WCProductAdapter.php#L428) +- [WCProductAdapter.php#L428](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/WCProductAdapter.php#L428) ## woocommerce_hide_invisible_variations @@ -841,5 +841,5 @@ A list of hooks, e.g. `actions` and `filters`, that are defined or used in this **Used in**: -- [ProductHelper.php#L366](https://github.com/woocommerce/google-listings-and-ads/blob/c2b9ee01aeed40ba936cbcf9b790616058e45780/src/Product/ProductHelper.php#L366) +- [ProductHelper.php#L366](https://github.com/woocommerce/google-listings-and-ads/blob/c58137fd8304211998fbd717aa93936d2a9c936c/src/Product/ProductHelper.php#L366)