If product has inStock variation then allow buttons

This commit is contained in:
Narek Zakarian 2022-06-01 18:17:51 +04:00
parent 77230fefa8
commit ebda39d130

View file

@ -12,6 +12,7 @@ namespace WooCommerce\PayPalCommerce\Button\Assets;
use Exception;
use Psr\Log\LoggerInterface;
use WC_Product;
use WC_Product_Variation;
use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentToken;
use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
@ -1252,9 +1253,25 @@ class SmartButton implements SmartButtonInterface {
/**
* The filter returning true if PayPal buttons/messages can be rendered for this product, or false otherwise.
*/
$in_stock = $product->is_in_stock();
if ( $product->is_type( 'variable' ) ) {
/**
* The method is defined in WC_Product_Variable class.
*
* @psalm-suppress UndefinedMethod
*/
$variations = $product->get_available_variations( 'objects' );
$in_stock = $this->has_in_stock_variation( $variations );
}
/**
* Allows to filter if PayPal buttons/messages can be rendered for the given product.
*/
return apply_filters(
'woocommerce_paypal_payments_product_supports_payment_request_button',
! $product->is_type( array( 'external', 'grouped' ) ) && $product->is_in_stock(),
! $product->is_type( array( 'external', 'grouped' ) ) && $in_stock,
$product
);
}
@ -1291,4 +1308,20 @@ class SmartButton implements SmartButtonInterface {
}
return '';
}
/**
* Checks if variations contain any in stock variation.
*
* @param WC_Product_Variation[] $variations The list of variations.
* @return bool True if any in stock variation, false otherwise.
*/
protected function has_in_stock_variation( array $variations ): bool {
foreach ( $variations as $variation ) {
if ( $variation->is_in_stock() ) {
return true;
}
}
return false;
}
}