_merge( $tokens, $common_tokens, $order_tokens ); } /** * Hydrate tokens * * Populates both subscription and order tokens. * - Subscription tokens maintain legacy format for backwards compatibility * - Order tokens provide additional data from the subscription's associated order * - Uses subscription object for both token types since WC_Subscription extends WC_Order * * @param array $trigger The trigger. * @param array $hook_args The hook args. * @return array */ public function hydrate_tokens( $trigger, $hook_args ) { $subscription = $this->get_wc_subscription( $hook_args ); if ( ! is_a( $subscription, 'WC_Subscription' ) ) { return array(); } // Parse common tokens $common_tokens = $this->common_tokens->get_tokens(); $tokens = array(); foreach ( $common_tokens as $token ) { $token_id = $token['tokenId'] ?? null; if ( null !== $token_id ) { $tokens[ $token_id ] = $this->common_tokens->parse_token( $token_id, $subscription ); } } // Save legacy tokens for backwards compatibility. 😳 $legacy_token_storage = new Legacy_Token_Storage( $this->order_tokens, $this->trigger_records ); $legacy_token_storage->save_legacy_tokens( $subscription ); return $tokens; } /** * Options * * @return array */ public function options() { $subscriptions = $this->storage->get_subscriptions(); $any_option = array( array( 'value' => -1, 'text' => esc_html_x( 'Any subscription', 'WooCommerce Subscription', 'uncanny-automator-pro' ), ), ); $field_subscriptions = array( 'option_code' => self::TRIGGER_META, 'label' => esc_html_x( 'Subscription', 'WooCommerce Subscription', 'uncanny-automator-pro' ), 'input_type' => 'select', 'required' => true, 'options' => array_merge( $any_option, $subscriptions ), 'relevant_tokens' => array(), ); $number_of_times = Automator()->helpers->recipe->options->number_of_times(); return array( $field_subscriptions, $number_of_times, ); } /** * Validate the trigger. * * @param array $trigger The trigger. * @param array $hook_args The hook args. * @return bool */ public function validate( $trigger, $hook_args ) { $selected_subscription_id = intval( $trigger['meta'][ self::TRIGGER_META ] ?? 0 ); $wc_subscription = $this->get_wc_subscription( $hook_args ); if ( ! class_exists( '\WC_Subscription' ) || ! $wc_subscription instanceof \WC_Subscription ) { return false; } // If the selected subscription is not set, return false. if ( 0 === $selected_subscription_id ) { return false; } // Set the user ID from the subscription $this->set_user_id( $wc_subscription->get_user_id() ); // If the selected subscription is any, return true. if ( -1 === $selected_subscription_id ) { return true; } $subscription_product_ids = $this->storage->get_subscription_product_ids( $wc_subscription ); // Fire if the selected subscription is in the subscription product ids. return in_array( intval( $selected_subscription_id ), $subscription_product_ids, true ); } /** * Get the WC Subscription from the hook args. * * @param array $hook_args The hook args. * @return \WC_Subscription */ protected function get_wc_subscription( $hook_args ) { return $hook_args[0] ?? null; } }