_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 ); } /** * Group payment gateways by their plugin extension filename. * * @param WC_Payment_Gateway[] $gateways The list of payment gateway instances to group. * @param string $country_code Optional. The country code for which the gateways are being generated. * This should be an ISO 3166-1 alpha-2 country code. * * @return array The grouped payment gateway instances, keyed by the plugin file. * Each group contains an array of payment gateway instances that belong to the same plugin. * If a payment gateway does not have a corresponding plugin file, * it will be grouped under the 'unknown_extension' key. */ private function group_gateways_by_extension( array $gateways, string $country_code = '' ): array { $grouped = array( // This is the group for gateways that we don't know how to group by extension. // It can be used for gateways that are not registered by a WP plugin. 'unknown_extension' => array(), ); foreach ( $gateways as $gateway ) { // Get the payment gateway details, but use a dummy gateway order since it is inconsequential here. $gateway_details = $this->get_payment_gateway_details( $gateway, 0, $country_code ); // If we don't have the necessary plugin details, put it in the unknown group. if ( empty( $gateway_details ) || ! isset( $gateway_details['plugin'] ) || empty( $gateway_details['plugin']['file'] ) ) { $grouped['unknown_extension'][] = $gateway; continue; } if ( empty( $grouped[ $gateway_details['plugin']['file'] ] ) ) { $grouped[ $gateway_details['plugin']['file'] ] = array(); } $grouped[ $gateway_details['plugin']['file'] ][] = $gateway; } return $grouped; } }