Extract building category and tag field options to a service

[MAILPOET-5169]
This commit is contained in:
Jan Jakes
2023-06-06 11:22:19 +02:00
committed by Aschepikov
parent a7ff7d0c67
commit 364479cc4f
3 changed files with 67 additions and 33 deletions

View File

@@ -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;
}
}

View File

@@ -0,0 +1,58 @@
<?php declare(strict_types = 1);
namespace MailPoet\Automation\Integrations\WooCommerce\Fields;
use MailPoet\Automation\Engine\WordPress;
use WP_Error;
use WP_Term;
class TermOptionsBuilder {
/** @var WordPress */
private $wordPress;
public function __construct(
WordPress $wordPress
) {
$this->wordPress = $wordPress;
}
/** @return array<array{id: int, name: string}> */
public function getCategoryOptions(): array {
return $this->getTermOptions('product_cat');
}
/** @return array<array{id: int, name: string}> */
public function getTagOptions(): array {
return $this->getTermOptions('product_tag');
}
/** @return array<array{id: int, name: string}> */
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<array{id: int, name: string}> */
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;
}
}

View File

@@ -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);