wp = $wp; $this->woocommerce = $woocommerceHelper; } public function getKey(): string { return 'woocommerce:order-status-changed'; } public function getName(): string { // translators: automation trigger title return __('Order status changed', 'mailpoet'); } public function getArgsSchema(): ObjectSchema { return Builder::object([ 'from' => Builder::string()->required()->default('any'), 'to' => Builder::string()->required()->default('wc-completed'), ]); } public function getSubjectKeys(): array { return [ OrderSubject::KEY, OrderStatusChangeSubject::KEY, CustomerSubject::KEY, ]; } public function validate(StepValidationArgs $args): void { } public function registerHooks(): void { $this->wp->addAction( 'woocommerce_order_status_changed', [ $this, 'handle', ], 10, 3 ); } public function handle(int $orderId, string $oldStatus, string $newStatus): void { $order = $this->woocommerce->wcGetOrder($orderId); if (!$order instanceof \WC_Order) { return; } $this->wp->doAction(Hooks::TRIGGER, $this, [ new Subject(OrderStatusChangeSubject::KEY, ['from' => $oldStatus, 'to' => $newStatus]), new Subject(OrderSubject::KEY, ['order_id' => $order->get_id()]), new Subject(CustomerSubject::KEY, ['customer_id' => $order->get_customer_id(), 'order_id' => $order->get_id()]), ]); } public function isTriggeredBy(StepRunArgs $args): bool { /** @var OrderStatusChangePayload $orderPayload */ $orderPayload = $args->getSinglePayloadByClass(OrderStatusChangePayload::class); $triggerArgs = $args->getStep()->getArgs(); $configuredFrom = $triggerArgs['from'] ? str_replace('wc-', '', $triggerArgs['from']) : null; $configuredTo = $triggerArgs['to'] ? str_replace('wc-', '', $triggerArgs['to']) : null; if ($configuredFrom !== 'any' && $orderPayload->getFrom() !== $configuredFrom) { return false; } if ($configuredTo !== 'any' && $orderPayload->getTo() !== $configuredTo) { return false; } return true; } }