<?php
/**
* Customize Site Health recommendations for WooCommerce.
*/
namespace Automattic\WooCommerce\Internal\Admin;
defined( 'ABSPATH' ) || exit;
/**
* SiteHealth class.
*/
class SiteHealth {
/**
* Class instance.
*
* @var SiteHealth instance
*/
protected static $instance = null;
/**
* Get class instance.
*/
public static function get_instance() {
if ( ! self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Hook into WooCommerce.
*/
public function __construct() {
add_filter( 'site_status_should_suggest_persistent_object_cache', array( $this, 'should_suggest_persistent_object_cache' ) );
}
/**
* Counts specific types of WooCommerce entities to determine if a persistent object cache would be beneficial.
*
* Note that if all measured WooCommerce entities are below their thresholds, this will return null so that the
* other normal WordPress checks will still be run.
*
* @param true|null $check A non-null value will short-circuit WP's normal tests for this.
*
* @return true|null True if the store would benefit from a persistent object cache. Otherwise null.
*/
public function should_suggest_persistent_object_cache( $check ) {
// Skip this if some other filter has already determined yes.
if ( true === $check ) {
return $check;
}
$thresholds = array(
'orders' => 100,
'products' => 100,
);
foreach ( $thresholds as $key => $threshold ) {
try {
switch ( $key ) {
case 'orders':
$orders_query = new \WC_Order_Query(
array(
'status' => 'any',
'limit' => 1,
'paginate' => true,
'return' => 'ids',
)
);
$orders_results = $orders_query->get_orders();
if ( $orders_results->total >= $threshold ) {
$check = true;
}
break;
case 'products':
$products_query = new \WC_Product_Query(
array(
'status' => 'any',
'limit' => 1,
'paginate' => true,
'return' => 'ids',
)
);
$products_results = $products_query->get_products();
if ( $products_results->total >= $threshold ) {
$check = true;
}
break;
}
} catch ( \Exception $exception ) {
break;
}
if ( ! is_null( $check ) ) {
break;
}
}
return $check;
}
}