diff --git a/lib/AutomaticEmails/WooCommerce/Events/PurchasedInCategory.php b/lib/AutomaticEmails/WooCommerce/Events/PurchasedInCategory.php index b48c601ab7..66f7a12761 100644 --- a/lib/AutomaticEmails/WooCommerce/Events/PurchasedInCategory.php +++ b/lib/AutomaticEmails/WooCommerce/Events/PurchasedInCategory.php @@ -110,7 +110,7 @@ class PurchasedInCategory { $ordered_product_categories = []; foreach ($order_details->get_items() as $order_item_product) { $product = $order_item_product->get_product(); - if (!$product || !is_callable([$product, 'get_category_ids'])) { + if (!$product instanceof \WC_Product) { continue; } $ordered_product_categories = array_merge($ordered_product_categories, $product->get_category_ids()); diff --git a/lib/AutomaticEmails/WooCommerce/Events/PurchasedProduct.php b/lib/AutomaticEmails/WooCommerce/Events/PurchasedProduct.php index a5a0d51287..57e4c66840 100644 --- a/lib/AutomaticEmails/WooCommerce/Events/PurchasedProduct.php +++ b/lib/AutomaticEmails/WooCommerce/Events/PurchasedProduct.php @@ -118,7 +118,7 @@ class PurchasedProduct { } $ordered_products = array_map(function($product) { - return is_callable([$product, 'get_product_id']) ? $product->get_product_id() : null; + return ($product instanceof \WC_Order_Item_Product) ? $product->get_product_id() : null; }, $order_details->get_items()); $ordered_products = array_values(array_filter($ordered_products)); diff --git a/tasks/code_sniffer/MailPoet/ruleset.xml b/tasks/code_sniffer/MailPoet/ruleset.xml index 756a04a71d..95a79c17bc 100644 --- a/tasks/code_sniffer/MailPoet/ruleset.xml +++ b/tasks/code_sniffer/MailPoet/ruleset.xml @@ -2,7 +2,7 @@ MailPoet specific rule set - + */phpstan/woocommerce.php diff --git a/tasks/phpstan/woocommerce.php b/tasks/phpstan/woocommerce.php index 2bce61e5f5..99019aeeae 100644 --- a/tasks/phpstan/woocommerce.php +++ b/tasks/phpstan/woocommerce.php @@ -64,3 +64,15 @@ class WC_DateTime extends \DateTime { */ class WC_Order { // phpcs:ignore } + +/** + * @method int get_product_id(string $context = 'view') + */ +class WC_Order_Item_Product { // phpcs:ignore +} + +/** + * @method int[] get_category_ids(string $context = 'view') + */ +class WC_Product { // phpcs:ignore +} diff --git a/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedProductTest.php b/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedProductTest.php index 3ef900a8bd..47c841f841 100644 --- a/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedProductTest.php +++ b/tests/integration/AutomaticEmails/WooCommerce/Events/PurchasedProductTest.php @@ -221,13 +221,13 @@ class PurchasedProductTest extends \MailPoetTest { 'get_items' => function() use ($incorrect_product_id, $product_id) { return [ Stub::make( - new ItemDetails(), + \WC_Order_Item_Product::class, [ 'get_product_id' => $incorrect_product_id, ] ), Stub::make( - new ItemDetails(), + \WC_Order_Item_Product::class, [ 'get_product_id' => $product_id, ] diff --git a/tests/integration/_bootstrap.php b/tests/integration/_bootstrap.php index 04c48923ee..0f91f8b46d 100644 --- a/tests/integration/_bootstrap.php +++ b/tests/integration/_bootstrap.php @@ -231,6 +231,10 @@ if (!function_exists('WC')) { function WC() { return new WooCommerce; } + class WC_Order_Item_Product { // phpcs:ignore + function get_product_id() { // phpcs:ignore + } + } } include '_fixtures.php';