<?php /** * Notification Manager * * Handles processes related to notifications. * * @package WP_Ultimo * @subpackage Managers/Notification_Manager * @since 2.0.0 */ namespace WP_Ultimo\Managers; // Exit if accessed directly defined('ABSPATH') || exit; /** * Handles processes related to notifications. * * @since 2.0.0 */ class Notification_Manager { use \WP_Ultimo\Traits\Singleton; /** * List of callbacks to keep, for backwards compatibility purposes. * * @since 2.2.0 * @var array */ protected $backwards_compatibility_list; /** * Instantiate the necessary hooks. * * @since 2.0.0 * @return void */ public function init() { add_action('wp_ultimo_load', array($this, 'add_settings')); if (is_admin() && !is_network_admin()) { add_action('admin_init', array($this, 'hide_notifications_subsites')); } // end if; } // end init; /** * Hide notifications on subsites if settings was enabled. * * @since 2.0.0 * @return void */ public function hide_notifications_subsites() { if (!wu_get_setting('hide_notifications_subsites')) { return; } // end if; global $wp_filter; /* * List of callbacks to keep, for backwards compatibility purposes. */ $this->backwards_compatibility_list = apply_filters('wu_hide_notifications_exclude_list', array( 'inject_admin_head_ads', )); $cleaner = array($this, 'clear_callback_list'); if (wu_get_isset($wp_filter, 'admin_notices')) { $wp_filter['admin_notices']->callbacks = array_filter($wp_filter['admin_notices']->callbacks, $cleaner === null ? fn($v, $k): bool => !empty($v) : $cleaner, $cleaner === null ? ARRAY_FILTER_USE_BOTH : 0); } // end if; if (wu_get_isset($wp_filter, 'all_admin_notices')) { $wp_filter['all_admin_notices']->callbacks = array_filter($wp_filter['all_admin_notices']->callbacks, $cleaner === null ? fn($v, $k): bool => !empty($v) : $cleaner, $cleaner === null ? ARRAY_FILTER_USE_BOTH : 0); } // end if; } // end hide_notifications_subsites; /** * Keeps the allowed callbacks. * * @since 2.0.0 * * @param array $callbacks The callbacks attached. * @return array */ public function clear_callback_list($callbacks): bool { if (empty($this->backwards_compatibility_list)) { return false; } // end if; $keys = array_keys($callbacks); foreach ($keys as $key) { foreach ($this->backwards_compatibility_list as $key_to_keep) { if (strpos($key, (string) $key_to_keep) !== false) { return true; } // end if; } // end foreach; } // end foreach; return false; } // end clear_callback_list; /** * Filter the WP Multisite WaaS settings to add Notifications Options * * @since 2.0.0 * * @return void */ public function add_settings() { wu_register_settings_field('sites', 'hide_notifications_subsites', array( 'title' => __('Hide Admin Notices on Sites', 'wp-ultimo'), 'desc' => __('Hide all admin notices on network sites, except for WP Multisite WaaS broadcasts.', 'wp-ultimo'), 'type' => 'toggle', 'default' => 0, 'order' => 25, )); } // end add_settings; } // end class Notification_Manager;