plugin_file = isset($plugin_file)
? $plugin_file
: __FILE__;
// Uninstall hook endpoint
register_uninstall_hook($this->plugin_file, array(__CLASS__, 'uninstall'));
// Prefix from namespace constant
$this->prefix = 'wbcr_acfr_an_';
$plugin_url = plugin_dir_url(__FILE__);
if( in_array(get_locale(), array('ru_RU', 'bel', 'kk', 'uk', 'bg', 'bg_BG', 'ka_GE')) ) {
$this->suggestions = array(
'robin-image-optimizer' => array(
'name' => 'Вы имеете [%unoptimzed_images%] неоптимизированных изображений!',
'desc' => "Ускорьте свой сайт, уменьшите место на диске на 70%, улучшите SEO, уменьшив размеры файлов изображений, не теряя качества с помощью Robin image optimizer. Наш плагин оптимизации изображений полностью бесплатный и не имеет ограничений и лимитов на оптимизацию изображений.",
'filename' => 'robin-image-optimizer.php',
'ico' => $plugin_url . 'assets/img/robin.jpg'
),
);
} else {
$this->suggestions = array(
'robin-image-optimizer' => array(
'name' => 'You have [%unoptimzed_images%] not optimized images.',
'desc' => "Reduce the size of images and files with Robin Image Optimizer. Speed up the website and save up to 70% of disk capacity with zero quality loss. Our plugin is 100% free and has no limitations in usage",
'filename' => 'robin-image-optimizer.php',
'ico' => $plugin_url . 'assets/img/robin.jpg'
),
);
}
// Check notices
if( is_admin() ) {
$this->check_timestamps();
$this->check_suggestions();
}
}
// Timestamp checks
// ---------------------------------------------------------------------------------------------------
/**
* Creates the activation timestamp only if it does not exist
*/
private function check_timestamps()
{
$timestamp = $this->get_activation_timestamp();
if( empty($timestamp) ) {
$this->update_activation_timestamp();
}
}
/**
* Check the suggestions dismissed timestamp
*/
private function check_suggestions()
{
// Compare timestamp
$timestamp = $this->get_dismissed_timestamp('suggestions');
if( empty($timestamp) || (time() - $timestamp) > ($this->days_dismissing_suggestions * 86400) ) {
// Check AJAX submit
if( defined('DOING_AJAX') && DOING_AJAX ) {
add_action('wp_ajax_' . $this->prefix . '_dismiss_suggestions', array(
&$this,
'dismiss_suggestions'
));
// Admin area (except install or activate plugins page)
} elseif( !in_array(basename($_SERVER['PHP_SELF']), array(
'plugins.php',
'plugin-install.php',
'update.php'
))
) {
add_action('wp_loaded', array(&$this, 'load_notices_suggestions'), PHP_INT_MAX);
}
}
}
// Loaders
// ---------------------------------------------------------------------------------------------------
/**
* Check and load the sugestions notices
*/
public function load_notices_suggestions()
{
// Check the disable nag constant
if( $this->disable_nag_notices() ) {
return;
}
// Collect missing plugins
$this->missing = $this->get_missing_plugins();
if( !empty($this->missing) && is_array($this->missing) ) {
wp_enqueue_style('wacfr_notices', plugin_dir_url(__FILE__).'assets/css/notices.css');
add_action('admin_footer', array(&$this, 'admin_footer_suggestions'));
add_action('admin_notices', array(&$this, 'admin_notices_suggestions'));
}
}
// Admin Notices display
// ---------------------------------------------------------------------------------------------------
/**
* Suggestions display
*/
public function admin_notices_suggestions()
{
$plugin_data = get_plugin_data($this->plugin_file);
?>
suggestions_message)){?>
suggestions_message); ?>
}?>
missing as $plugin) : ?>
suggestions[$plugin]['filename'];
$plugin_installed = is_file(WP_PLUGIN_DIR. '/' .$plugin_path);
?>
inherit;
$this->suggestions[$plugin]['name'] = str_replace('%unoptimzed_images%', $unoptimzed_images, $this->suggestions[$plugin]['name']);
}?>

' alt=''>
suggestions[$plugin]['name']; ?>
suggestions[$plugin]['desc']; ?>
prefix . '-dismiss-suggestions') ) {
$this->update_dismissed_timestamp('suggestions');
}
}
// Plugins information retrieval
// ---------------------------------------------------------------------------------------------------
/**
* Retrieve uninstalled plugins
*/
private function get_missing_plugins()
{
// Initialize
$inactive = array();
// Check plugins directory
$directories = array_merge(self::get_mu_plugins_directories(), self::get_plugins_directories());
if( !empty($directories) ) {
$required = array_keys($this->suggestions);
foreach($required as $plugin) {
if( !in_array($plugin, $directories) ) {
$inactive[] = $plugin;
}
}
}
// Check inactives
if( empty($inactive) ) {
return false;
}
// Done
return $inactive;
}
/**
* Collects all active plugins
*/
private function get_plugins_directories()
{
// Initialize
$directories = array();
// Plugins split directory
$split = '/' . basename(WP_CONTENT_DIR) . '/' . basename(WP_PLUGIN_DIR) . '/';
// Multisite plugins
if( is_multisite() ) {
$ms_plugins = wp_get_active_network_plugins();
if( !empty($ms_plugins) && is_array($ms_plugins) ) {
foreach($ms_plugins as $file) {
$directory = explode($split, $file);
$directory = explode('/', ltrim($directory[1], '/'));
$directory = $directory[0];
if( !in_array($directory, $directories) ) {
$directories[] = $directory;
}
}
}
}
// Active plugins
$plugins = wp_get_active_and_valid_plugins();
if( !empty($plugins) && is_array($plugins) ) {
foreach($plugins as $file) {
$directory = explode($split, $file);
$directory = explode('/', ltrim($directory[1], '/'));
$directory = $directory[0];
if( !in_array($directory, $directories) ) {
$directories[] = $directory;
}
}
}
// Done
return $directories;
}
/**
* Retrieve mu-plugins directories
*/
private function get_mu_plugins_directories()
{
// Initialize
$directories = array();
// Dependencies
if( !function_exists('get_plugins') ) {
require_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
// Retrieve mu-plugins
$plugins = get_plugins('/../mu-plugins');
if( !empty($plugins) && is_array($plugins) ) {
foreach($plugins as $path => $info) {
$directory = dirname($path);
if( !in_array($directory, array('.', '..')) ) {
$directories[] = $directory;
}
}
}
// Done
return $directories;
}
/**
* Plugin install/activate URL
*/
private function get_install_url($plugin)
{
if( !isset($this->suggestions[$plugin]['filename']) && isset($this->suggestions[$plugin]['url']) ) {
return $this->suggestions[$plugin]['url'];
}
// Check existing plugin
$exists = @file_exists(WP_PLUGIN_DIR . '/' . $plugin);
// Activate
if( $exists ) {
// Existing plugin
$path = $plugin . '/' . $this->suggestions[$plugin]['filename'];
return admin_url('plugins.php?action=activate&plugin=' . $path . '&_wpnonce=' . wp_create_nonce('activate-plugin_' . $path));
// Install
} else {
// New plugin
return admin_url('update.php?action=install-plugin&plugin=' . $plugin . '&_wpnonce=' . wp_create_nonce('install-plugin_' . $plugin));
}
}
/**
* Determines the admin notices display
*/
private function disable_nag_notices()
{
return (defined('DISABLE_NAG_NOTICES') && DISABLE_NAG_NOTICES);
}
// Plugin related
// ---------------------------------------------------------------------------------------------------
/**
* Plugin uninstall hook
*/
public static function uninstall()
{
$admin_notices = self::instance();
$admin_notices->delete_activation_timestamp();
$admin_notices->delete_dismissed_timestamp('suggestions');
}
// Activation timestamp management
// ---------------------------------------------------------------------------------------------------
/**
* Retrieves the plugin activation timestamp
*/
private function get_activation_timestamp()
{
return (int)get_option($this->prefix . '_activated_on');
}
/**
* Updates activation timestamp
*/
private function update_activation_timestamp()
{
update_option($this->prefix . '_activated_on', time(), true);
}
/**
* Removes activation timestamp
*/
private function delete_activation_timestamp()
{
delete_option($this->prefix . '_activated_on');
}
// Dismissed timestamp management
// ---------------------------------------------------------------------------------------------------
/**
* Current timestamp by key
*/
private function get_dismissed_timestamp($key)
{
return (int)get_option($this->prefix . '_dismissed_' . $key . '_on');
}
/**
* Update with the current timestamp
*/
private function update_dismissed_timestamp($key)
{
update_option($this->prefix . '_dismissed_' . $key . '_on', time(), true);
}
/**
* Removes dismissied option
*/
private function delete_dismissed_timestamp($key)
{
delete_option($this->prefix . '_dismissed_' . $key . '_on');
}
// Javascript code
// ---------------------------------------------------------------------------------------------------
/**
* Footer script for Suggestions
*/
public function admin_footer_suggestions()
{
?>