<?php
namespace WCML\AdminNotices;
use WPML\FP\Fns;
use WPML\FP\Logic;
use WPML\FP\Obj;
use WPML\FP\Str;
use function WPML\FP\pipe;
class CachePlugins implements \IWPML_Backend_Action, \IWPML_DIC_Action {
const NOTICE_ID = 'wcml-cache-plugins';
/** @var \WPML_Notices $notices */
private $notices;
public function __construct( \WPML_Notices $notices ) {
$this->notices = $notices;
}
public function add_hooks() {
if (
wcml_is_multi_currency_on()
&& ! $this->notices->get_notice( self::NOTICE_ID )
&& self::hasActiveCachePlugin()
) {
add_action( 'admin_init', [ $this, 'addNotice' ] );
}
}
public function addNotice() {
$text = '<h2>' . __( 'WooCommerce Multilingual & Multicurrency detected an active cache plugin on your site.', 'woocommerce-multilingual' ) . '</h2>';
$text .= '<p>' . __( 'Caching may cause currency display issues for your customers if you are using the multicurrency feature.', 'woocommerce-multilingual' ) . '</p>';
$text .= '<p>' . __( 'To avoid this, set your cache plugin to not cache pages for visitors that have a cookie set in their browser.', 'woocommerce-multilingual' ) . '</p>';
$notice = $this->notices->create_notice( self::NOTICE_ID, $text );
$notice->set_css_class_types( 'notice-warning' );
$notice->set_restrict_to_screen_ids( RestrictedScreens::get() );
$notice->set_dismissible( true );
$this->notices->add_notice( $notice );
}
/**
* @return bool
*/
private static function hasActiveCachePlugin() {
if ( ! function_exists( 'is_plugin_active' ) ) {
include_once ABSPATH . 'wp-admin/includes/plugin.php';
}
// $isActive :: ( array, string ) -> bool
$isActive = pipe(
Fns::nthArg( 1 ), // array index.
'is_plugin_active'
);
// $isAboutCaching :: array -> bool
$isAboutCaching = pipe(
Obj::prop( 'Description' ),
Logic::anyPass(
[
Str::includes( 'cache' ),
Str::includes( 'caching' ),
]
)
);
// $isHandled :: array -> bool
$isHandled = function( $plugin ) {
return in_array(
$plugin['Name'],
apply_filters( 'wcml_multicurrency_supported_cache_plugins', [] ),
true
);
};
return (bool) wpml_collect( get_plugins() )
->filter( $isActive )
->filter( $isAboutCaching )
->reject( $isHandled )
->first();
}
}