array $extension The extension suggestion. * * @return bool True if the extension suggestion is hidden, false otherwise. */ private function is_payment_extension_suggestion_hidden( array $extension ): bool { $user_payments_nox_profile = get_user_meta( get_current_user_id(), Payments::USER_PAYMENTS_NOX_PROFILE_KEY, true ); if ( empty( $user_payments_nox_profile ) ) { return false; } $user_payments_nox_profile = maybe_unserialize( $user_payments_nox_profile ); if ( empty( $user_payments_nox_profile['hidden_suggestions'] ) ) { return false; } return in_array( $extension['id'], array_column( $user_payments_nox_profile['hidden_suggestions'], 'id' ), true ); } /** * Apply order mappings to a base payment providers order map. * * @param array $base_map The base order map. * @param array $new_mappings The order mappings to apply. * This can be a full or partial list of the base one, * but it can also contain (only) new provider IDs and their orders. * * @return array The updated base order map, normalized. */ private function payment_providers_order_map_apply_mappings( array $base_map, array $new_mappings ): array { // Sanity checks. // Remove any null or non-integer values. $new_mappings = array_filter( $new_mappings, 'is_int' ); if ( empty( $new_mappings ) ) { $new_mappings = array(); } // If we have no existing order map or // both the base and the new map have the same length and keys, we can simply use the new map. if ( empty( $base_map ) || ( count( $base_map ) === count( $new_mappings ) && empty( array_diff( array_keys( $base_map ), array_keys( $new_mappings ) ) ) ) ) { $new_order_map = $new_mappings; } else { // If we are dealing with ONLY offline PMs updates (for all that are registered) and their group is present, // normalize the new order map to keep behavior as intended (i.e., reorder only inside the offline PMs list). $offline_pms = $this->get_offline_payment_methods_gateways(); // Make it a list keyed by the payment gateway ID. $offline_pms = array_combine( array_map( fn( $gateway ) => $gateway->id, $offline_pms ), $offline_pms ); if ( isset( $base_map[ self::OFFLINE_METHODS_ORDERING_GROUP ] ) && count( $new_mappings ) === count( $offline_pms ) && empty( array_diff( array_keys( $new_mappings ), array_keys( $offline_pms ) ) ) ) { $new_mappings = Utils::order_map_change_min_order( $new_mappings, $base_map[ self::OFFLINE_METHODS_ORDERING_GROUP ] + 1 ); } $new_order_map = Utils::order_map_apply_mappings( $base_map, $new_mappings ); } return Utils::order_map_normalize( $new_order_map ); } /** * Get the payment gateway provider instance. * * @param string $gateway_id The gateway ID. * * @return PaymentGateway The payment gateway provider instance. * Will return the general provider of no specific provider is found. */ private function get_gateway_provider_instance( string $gateway_id ): PaymentGateway { if ( isset( $this->instances[ $gateway_id ] ) ) { return $this->instances[ $gateway_id ]; } /** * The provider class for the gateway. * * @var PaymentGateway|null $provider_class */ $provider_class = null; if ( isset( $this->payment_gateways_providers_class_map[ $gateway_id ] ) ) { $provider_class = $this->payment_gateways_providers_class_map[ $gateway_id ]; } else { // Check for wildcard mappings. foreach ( $this->payment_gateways_providers_class_map as $gateway_id_pattern => $mapped_class ) { // Try to see if we have a wildcard mapping and if the gateway ID matches it. // Use the first found match. if ( false !== strpos( $gateway_id_pattern, '*' ) ) { $gateway_id_pattern = str_replace( '*', '.*', $gateway_id_pattern ); if ( preg_match( '/^' . $gateway_id_pattern . '$/', $gateway_id ) ) { $provider_class = $mapped_class; break; } } } } // If the gateway ID is not mapped to a provider class, return the generic provider. if ( is_null( $provider_class ) ) { if ( ! isset( $this->instances['generic'] ) ) { $this->instances['generic'] = new PaymentGateway(); } return $this->instances['generic']; } $this->instances[ $gateway_id ] = new $provider_class(); return $this->instances[ $gateway_id ]; } }