diff --git a/mailpoet/lib/Automation/Integrations/WooCommerce/Fields/CustomerOrderFieldsFactory.php b/mailpoet/lib/Automation/Integrations/WooCommerce/Fields/CustomerOrderFieldsFactory.php index 76a9e56640..6c63e2c3e2 100644 --- a/mailpoet/lib/Automation/Integrations/WooCommerce/Fields/CustomerOrderFieldsFactory.php +++ b/mailpoet/lib/Automation/Integrations/WooCommerce/Fields/CustomerOrderFieldsFactory.php @@ -9,8 +9,6 @@ use MailPoet\Automation\Engine\WordPress; use MailPoet\Automation\Integrations\WooCommerce\Payloads\CustomerPayload; use MailPoet\Automation\Integrations\WooCommerce\WooCommerce; use WC_Customer; -use WP_Error; -use WP_Term; class CustomerOrderFieldsFactory { /** @var WooCommerce */ @@ -19,12 +17,17 @@ class CustomerOrderFieldsFactory { /** @var WordPress */ private $wordPress; + /** @var TermOptionsBuilder */ + private $termOptionsBuilder; + public function __construct( WordPress $wordPress, - WooCommerce $wooCommerce + WooCommerce $wooCommerce, + TermOptionsBuilder $termOptionsBuilder ) { $this->wordPress = $wordPress; $this->wooCommerce = $wooCommerce; + $this->termOptionsBuilder = $termOptionsBuilder; } /** @return Field[] */ @@ -92,7 +95,7 @@ class CustomerOrderFieldsFactory { return $customer ? $this->getOrderProductTermIds($customer, 'product_cat') : []; }, [ - 'options' => $this->getTermsList('product_cat'), + 'options' => $this->termOptionsBuilder->getCategoryOptions(), ] ), new Field( @@ -104,7 +107,7 @@ class CustomerOrderFieldsFactory { return $customer ? $this->getOrderProductTermIds($customer, 'product_tag') : []; }, [ - 'options' => $this->getTermsList('product_tag'), + 'options' => $this->termOptionsBuilder->getTagOptions(), ] ), ]; @@ -187,32 +190,4 @@ class CustomerOrderFieldsFactory { return array_map('intval', $wpdb->get_col($statement)); } - - private function getTermsList(string $taxonomy): array { - $terms = $this->wordPress->getTerms(['taxonomy' => $taxonomy, 'hide_empty' => false]); - if ($terms instanceof WP_Error) { - return []; - } - return $this->buildTermsList((array)$terms); - } - - private function buildTermsList(array $terms, int $parentId = 0): array { - $parents = array_filter($terms, function ($term) use ($parentId) { - return $term instanceof WP_Term && $term->parent === $parentId; - }); - - usort($parents, function (WP_Term $a, WP_Term $b) { - return $a->name <=> $b->name; - }); - - $list = []; - foreach ($parents as $term) { - $id = $term->term_id; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps - $list[] = ['id' => $id, 'name' => $term->name]; - foreach ($this->buildTermsList($terms, $id) as $child) { - $list[] = ['id' => $child['id'], 'name' => "$term->name | {$child['name']}"]; - } - } - return $list; - } } diff --git a/mailpoet/lib/Automation/Integrations/WooCommerce/Fields/TermOptionsBuilder.php b/mailpoet/lib/Automation/Integrations/WooCommerce/Fields/TermOptionsBuilder.php new file mode 100644 index 0000000000..4e3f7728ee --- /dev/null +++ b/mailpoet/lib/Automation/Integrations/WooCommerce/Fields/TermOptionsBuilder.php @@ -0,0 +1,58 @@ +wordPress = $wordPress; + } + + /** @return array */ + public function getCategoryOptions(): array { + return $this->getTermOptions('product_cat'); + } + + /** @return array */ + public function getTagOptions(): array { + return $this->getTermOptions('product_tag'); + } + + /** @return array */ + private function getTermOptions(string $taxonomy): array { + $terms = $this->wordPress->getTerms(['taxonomy' => $taxonomy, 'hide_empty' => false]); + if ($terms instanceof WP_Error) { + return []; + } + return $this->buildTermsList((array)$terms); + } + + /** @return array */ + private function buildTermsList(array $terms, int $parentId = 0): array { + $parents = array_filter($terms, function ($term) use ($parentId) { + return $term instanceof WP_Term && $term->parent === $parentId; + }); + + usort($parents, function (WP_Term $a, WP_Term $b) { + return $a->name <=> $b->name; + }); + + $list = []; + foreach ($parents as $term) { + $id = $term->term_id; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps + $list[] = ['id' => (int)$id, 'name' => $term->name]; + foreach ($this->buildTermsList($terms, $id) as $child) { + $list[] = ['id' => (int)$child['id'], 'name' => "$term->name | {$child['name']}"]; + } + } + return $list; + } +} diff --git a/mailpoet/lib/DI/ContainerConfigurator.php b/mailpoet/lib/DI/ContainerConfigurator.php index 5aac6a2b44..9f3c786cd0 100644 --- a/mailpoet/lib/DI/ContainerConfigurator.php +++ b/mailpoet/lib/DI/ContainerConfigurator.php @@ -186,6 +186,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Fields\CustomerFieldsFactory::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Fields\CustomerOrderFieldsFactory::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Fields\CustomerReviewFieldsFactory::class)->setPublic(true); + $container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Fields\TermOptionsBuilder::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Triggers\OrderStatusChangedTrigger::class)->setPublic(true)->setShared(false); $container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderSubject::class)->setPublic(true)->setShared(false); $container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderStatusChangeSubject::class)->setPublic(true)->setShared(false);