Automattic\WooCommerce\Internal\Admin\Settings
PaymentsProviders::get_extension_suggestions │ public │ WC 1.0
Get the payment extension suggestions for the given location.
Method of the class: PaymentsProviders{}
No Hooks.
Returns
Array[]. The payment extension suggestions for the given location, split into preferred and other.
Usage
$PaymentsProviders = new PaymentsProviders(); $PaymentsProviders->get_extension_suggestions( $location, $context ): array;
- $location(string) (required)
- The location for which the suggestions are being fetched.
- $context(string)
- The context ID of where these extensions are being used.
Default:''
PaymentsProviders::get_extension_suggestions() PaymentsProviders::get extension suggestions code WC 10.7.0
public function get_extension_suggestions( string $location, string $context = '' ): array {
// Normalize the location to uppercase.
$location = strtoupper( $location );
$preferred_psp = null;
$preferred_apm = null;
$preferred_offline_psp = null;
$other = array();
$extensions = $this->extension_suggestions->get_country_extensions( $location, $context );
// Sort them by _priority.
usort(
$extensions,
function ( $a, $b ) {
return $a['_priority'] <=> $b['_priority'];
}
);
$has_enabled_ecommerce_gateways = $this->has_enabled_ecommerce_gateways();
// Keep track of the active extensions.
$active_extensions = array();
foreach ( $extensions as $extension ) {
$extension = $this->enhance_extension_suggestion( $extension );
if ( self::EXTENSION_ACTIVE === $extension['plugin']['status'] ) {
// If the suggested extension is active, we no longer suggest it.
// But remember it for later.
$active_extensions[] = $extension['id'];
continue;
}
// Determine if the suggestion is preferred or not by looking at its tags.
$is_preferred = in_array( ExtensionSuggestions::TAG_PREFERRED, $extension['tags'], true );
// Determine if the suggestion is hidden (from the preferred locations).
$is_hidden = $this->is_payment_extension_suggestion_hidden( $extension );
if ( ! $is_hidden && $is_preferred ) {
// If we don't have a preferred offline payments PSP and the suggestion is an offline payments preferred PSP,
// add it to the preferred list.
// Check this first so we don't inadvertently "fill" the preferred PSP slot.
if ( empty( $preferred_offline_psp ) &&
ExtensionSuggestions::TYPE_PSP === $extension['_type'] &&
in_array( ExtensionSuggestions::TAG_PREFERRED_OFFLINE, $extension['tags'], true ) ) {
$preferred_offline_psp = $extension;
continue;
}
// If we don't have a preferred PSP and the suggestion is a preferred PSP, add it to the preferred list.
if ( empty( $preferred_psp ) && ExtensionSuggestions::TYPE_PSP === $extension['_type'] ) {
$preferred_psp = $extension;
continue;
}
// If we don't have a preferred APM and the suggestion is a preferred APM, add it to the preferred list.
// In the preferred APM slot we might surface APMs but also Express Checkouts (PayPal Wallet).
if ( empty( $preferred_apm ) &&
in_array( $extension['_type'], array( ExtensionSuggestions::TYPE_APM, ExtensionSuggestions::TYPE_EXPRESS_CHECKOUT ), true ) ) {
$preferred_apm = $extension;
continue;
}
}
if ( $is_hidden &&
ExtensionSuggestions::TYPE_APM === $extension['_type'] &&
ExtensionSuggestions::PAYPAL_FULL_STACK === $extension['id'] ) {
// If the PayPal Full Stack suggestion is hidden, we no longer suggest it,
// because we have the PayPal Express Checkout (Wallet) suggestion.
continue;
}
// If there are no enabled ecommerce gateways (no PSP selected),
// we don't suggest express checkout, BNPL, or crypto extensions.
if ( ! $has_enabled_ecommerce_gateways &&
in_array( $extension['_type'], array( ExtensionSuggestions::TYPE_EXPRESS_CHECKOUT, ExtensionSuggestions::TYPE_BNPL, ExtensionSuggestions::TYPE_CRYPTO ), true )
) {
continue;
}
// If WooPayments or Stripe is active, we don't suggest other BNPLs.
// Note: Affirm is available in the UK even with WooPayments or Stripe active
// because Stripe does not support it there, yet.
if ( ExtensionSuggestions::TYPE_BNPL === $extension['_type'] &&
(
in_array( ExtensionSuggestions::STRIPE, $active_extensions, true ) ||
in_array( ExtensionSuggestions::WOOPAYMENTS, $active_extensions, true )
) &&
! (
ExtensionSuggestions::AFFIRM === $extension['id'] &&
'GB' === $location
)
) {
continue;
}
// If we made it to this point, the suggestion goes into the other list.
// But first, make sure there isn't already an extension added to the other list with the same plugin slug.
// This can happen if the same extension is suggested as both a PSP and an APM.
// The first entry that we encounter is the one that we keep.
$extension_slug = $extension['plugin']['slug'];
$extension_exists = array_filter(
$other,
function ( $suggestion ) use ( $extension_slug ) {
return $suggestion['plugin']['slug'] === $extension_slug;
}
);
if ( ! empty( $extension_exists ) ) {
continue;
}
$other[] = $extension;
}
// Make sure that the preferred suggestions are not among the other list by removing any entries with their plugin slug.
$other = array_values(
array_filter(
$other,
function ( $suggestion ) use ( $preferred_psp, $preferred_apm ) {
return ( empty( $preferred_psp ) || $suggestion['plugin']['slug'] !== $preferred_psp['plugin']['slug'] ) &&
( empty( $preferred_apm ) || $suggestion['plugin']['slug'] !== $preferred_apm['plugin']['slug'] );
}
)
);
// The preferred PSP gets a recommended tag that instructs the UI to highlight it further.
if ( ! empty( $preferred_psp ) ) {
$preferred_psp['tags'][] = ExtensionSuggestions::TAG_RECOMMENDED;
}
return array(
'preferred' => array_values(
array_filter(
array(
// The PSP should naturally have a higher priority than the APM, with the preferred offline PSP last.
// No need to impose a specific order here.
$preferred_psp,
$preferred_apm,
$preferred_offline_psp,
)
)
),
'other' => $other,
);
}