321 lines
11 KiB
PHP
321 lines
11 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @package Freemius
|
||
|
* @copyright Copyright (c) 2015, Freemius, Inc.
|
||
|
* @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
|
||
|
* @since 2.0.0
|
||
|
*/
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* WP Admin notices manager both for site level and network level.
|
||
|
*
|
||
|
* Class FS_Admin_Notices
|
||
|
*/
|
||
|
class FS_Admin_Notices {
|
||
|
/**
|
||
|
* @since 1.2.2
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $_module_unique_affix;
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $_id;
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $_title;
|
||
|
/**
|
||
|
* @var FS_Admin_Notice_Manager
|
||
|
*/
|
||
|
protected $_notices;
|
||
|
/**
|
||
|
* @var FS_Admin_Notice_Manager
|
||
|
*/
|
||
|
protected $_network_notices;
|
||
|
/**
|
||
|
* @var int The ID of the blog that is associated with the current site level options.
|
||
|
*/
|
||
|
private $_blog_id = 0;
|
||
|
/**
|
||
|
* @var bool
|
||
|
*/
|
||
|
private $_is_multisite;
|
||
|
/**
|
||
|
* @var FS_Admin_Notices[]
|
||
|
*/
|
||
|
private static $_instances = array();
|
||
|
|
||
|
/**
|
||
|
* @param string $id
|
||
|
* @param string $title
|
||
|
* @param string $module_unique_affix
|
||
|
* @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and
|
||
|
* blog admin pages.
|
||
|
*
|
||
|
* @return FS_Admin_Notices
|
||
|
*/
|
||
|
static function instance( $id, $title = '', $module_unique_affix = '', $is_network_and_blog_admins = false ) {
|
||
|
if ( ! isset( self::$_instances[ $id ] ) ) {
|
||
|
self::$_instances[ $id ] = new FS_Admin_Notices( $id, $title, $module_unique_affix, $is_network_and_blog_admins );
|
||
|
}
|
||
|
|
||
|
return self::$_instances[ $id ];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $id
|
||
|
* @param string $title
|
||
|
* @param string $module_unique_affix
|
||
|
* @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and
|
||
|
* blog admin pages.
|
||
|
*/
|
||
|
protected function __construct( $id, $title = '', $module_unique_affix = '', $is_network_and_blog_admins = false ) {
|
||
|
$this->_id = $id;
|
||
|
$this->_title = $title;
|
||
|
$this->_module_unique_affix = $module_unique_affix;
|
||
|
$this->_is_multisite = is_multisite();
|
||
|
|
||
|
if ( $this->_is_multisite ) {
|
||
|
$this->_blog_id = get_current_blog_id();
|
||
|
|
||
|
$this->_network_notices = FS_Admin_Notice_Manager::instance(
|
||
|
$id,
|
||
|
$title,
|
||
|
$module_unique_affix,
|
||
|
$is_network_and_blog_admins,
|
||
|
true
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$this->_notices = FS_Admin_Notice_Manager::instance(
|
||
|
$id,
|
||
|
$title,
|
||
|
$module_unique_affix,
|
||
|
false,
|
||
|
$this->_blog_id
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.0.4
|
||
|
*
|
||
|
* @param string $message
|
||
|
* @param string $title
|
||
|
* @param string $type
|
||
|
* @param bool $is_sticky
|
||
|
* @param string $id Message ID
|
||
|
* @param bool $store_if_sticky
|
||
|
* @param int|null $network_level_or_blog_id
|
||
|
*
|
||
|
* @uses add_action()
|
||
|
*/
|
||
|
function add(
|
||
|
$message,
|
||
|
$title = '',
|
||
|
$type = 'success',
|
||
|
$is_sticky = false,
|
||
|
$id = '',
|
||
|
$store_if_sticky = true,
|
||
|
$network_level_or_blog_id = null
|
||
|
) {
|
||
|
if ( $this->should_use_network_notices( $id, $network_level_or_blog_id ) ) {
|
||
|
$notices = $this->_network_notices;
|
||
|
} else {
|
||
|
$notices = $this->get_site_notices( $network_level_or_blog_id );
|
||
|
}
|
||
|
|
||
|
$notices->add(
|
||
|
$message,
|
||
|
$title,
|
||
|
$type,
|
||
|
$is_sticky,
|
||
|
$id,
|
||
|
$store_if_sticky
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.0.7
|
||
|
*
|
||
|
* @param string|string[] $ids
|
||
|
* @param int|null $network_level_or_blog_id
|
||
|
*/
|
||
|
function remove_sticky( $ids, $network_level_or_blog_id = null ) {
|
||
|
if ( ! is_array( $ids ) ) {
|
||
|
$ids = array( $ids );
|
||
|
}
|
||
|
|
||
|
if ( $this->should_use_network_notices( $ids[0], $network_level_or_blog_id ) ) {
|
||
|
$notices = $this->_network_notices;
|
||
|
} else {
|
||
|
$notices = $this->get_site_notices( $network_level_or_blog_id );
|
||
|
}
|
||
|
|
||
|
return $notices->remove_sticky( $ids );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if sticky message exists by id.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.0.9
|
||
|
*
|
||
|
* @param string $id
|
||
|
* @param int|null $network_level_or_blog_id
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
function has_sticky( $id, $network_level_or_blog_id = null ) {
|
||
|
if ( $this->should_use_network_notices( $id, $network_level_or_blog_id ) ) {
|
||
|
$notices = $this->_network_notices;
|
||
|
} else {
|
||
|
$notices = $this->get_site_notices( $network_level_or_blog_id );
|
||
|
}
|
||
|
|
||
|
return $notices->has_sticky( $id );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds sticky admin notification.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.0.7
|
||
|
*
|
||
|
* @param string $message
|
||
|
* @param string $id Message ID
|
||
|
* @param string $title
|
||
|
* @param string $type
|
||
|
* @param int|null $network_level_or_blog_id
|
||
|
* @param number|null $wp_user_id
|
||
|
* @param string|null $plugin_title
|
||
|
* @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and
|
||
|
* blog admin pages.
|
||
|
*/
|
||
|
function add_sticky(
|
||
|
$message,
|
||
|
$id,
|
||
|
$title = '',
|
||
|
$type = 'success',
|
||
|
$network_level_or_blog_id = null,
|
||
|
$wp_user_id = null,
|
||
|
$plugin_title = null,
|
||
|
$is_network_and_blog_admins = false
|
||
|
) {
|
||
|
if ( $this->should_use_network_notices( $id, $network_level_or_blog_id ) ) {
|
||
|
$notices = $this->_network_notices;
|
||
|
} else {
|
||
|
$notices = $this->get_site_notices( $network_level_or_blog_id );
|
||
|
}
|
||
|
|
||
|
$notices->add_sticky( $message, $id, $title, $type, $wp_user_id, $plugin_title, $is_network_and_blog_admins );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Clear all sticky messages.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.0.0
|
||
|
*
|
||
|
* @param int|null $network_level_or_blog_id
|
||
|
*/
|
||
|
function clear_all_sticky( $network_level_or_blog_id = null ) {
|
||
|
if ( ! $this->_is_multisite ||
|
||
|
false === $network_level_or_blog_id ||
|
||
|
0 == $network_level_or_blog_id ||
|
||
|
is_null( $network_level_or_blog_id )
|
||
|
) {
|
||
|
$notices = $this->get_site_notices( $network_level_or_blog_id );
|
||
|
$notices->clear_all_sticky();
|
||
|
}
|
||
|
|
||
|
if ( $this->_is_multisite &&
|
||
|
( true === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) )
|
||
|
) {
|
||
|
$this->_network_notices->clear_all_sticky();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add admin message to all admin messages queue, and hook to all_admin_notices if not yet hooked.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.0.4
|
||
|
*
|
||
|
* @param string $message
|
||
|
* @param string $title
|
||
|
* @param string $type
|
||
|
* @param bool $is_sticky
|
||
|
* @param string $id Message ID
|
||
|
*/
|
||
|
function add_all( $message, $title = '', $type = 'success', $is_sticky = false, $id = '' ) {
|
||
|
$this->add( $message, $title, $type, $is_sticky, true, $id );
|
||
|
}
|
||
|
|
||
|
#--------------------------------------------------------------------------------
|
||
|
#region Helper Methods
|
||
|
#--------------------------------------------------------------------------------
|
||
|
|
||
|
/**
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.0.0
|
||
|
*
|
||
|
* @param int $blog_id
|
||
|
*
|
||
|
* @return FS_Admin_Notice_Manager
|
||
|
*/
|
||
|
private function get_site_notices( $blog_id = 0 ) {
|
||
|
if ( 0 == $blog_id || $blog_id == $this->_blog_id ) {
|
||
|
return $this->_notices;
|
||
|
}
|
||
|
|
||
|
return FS_Admin_Notice_Manager::instance(
|
||
|
$this->_id,
|
||
|
$this->_title,
|
||
|
$this->_module_unique_affix,
|
||
|
false,
|
||
|
$blog_id
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if the network notices should be used.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.0.0
|
||
|
*
|
||
|
* @param string $id
|
||
|
* @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite notices (if there's a network). When `false`, use the current context blog notices. When `null`, the decision which notices manager to use (MS vs. Current S) will be handled internally and determined based on the $id and the context admin (blog admin vs. network level admin).
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
private function should_use_network_notices( $id = '', $network_level_or_blog_id = null ) {
|
||
|
if ( ! $this->_is_multisite ) {
|
||
|
// Not a multisite environment.
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( is_numeric( $network_level_or_blog_id ) ) {
|
||
|
// Explicitly asked to use a specified blog storage.
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( is_bool( $network_level_or_blog_id ) ) {
|
||
|
// Explicitly specified whether should use the network or blog level storage.
|
||
|
return $network_level_or_blog_id;
|
||
|
}
|
||
|
|
||
|
return fs_is_network_admin();
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
}
|