: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
add_action ( 'init', array('ICL_AdminNotifier', 'init') );
if(!class_exists('ICL_AdminNotifier')) {
class ICL_AdminNotifier {
public static function init() {
add_action( 'wp_ajax_icl-hide-admin-message', array( __CLASS__, 'hide_message' ) );
add_action( 'wp_ajax_icl-show-admin-message', array( __CLASS__, 'show_message' ) );
if ( ! defined( 'DOING_AJAX' ) ) {
add_action( 'admin_enqueue_scripts', array( __CLASS__, 'add_script' ) );
add_action( 'admin_notices', array( __CLASS__, 'admin_notices' ) );
add_filter( 'troubleshooting_js_data', array( __CLASS__, 'troubleshooting_js_data' ) );
add_action( 'wpml_troubleshooting_cleanup', array( __CLASS__, 'troubleshooting' ) );
add_action( 'wp_ajax_icl_restore_notifications', array( __CLASS__, 'restore_notifications' ) );
add_action( 'wp_ajax_icl_remove_notifications', array( __CLASS__, 'remove_notifications' ) );
public static function add_script() {
wp_enqueue_script( 'icl-admin-notifier', ICL_PLUGIN_URL . '/res/js/icl-admin-notifier.js', array( 'jquery' ), ICL_SITEPRESS_VERSION );
public static function add_instant_message( $message, $type = '' ) {
$messages = self::get_messages();
$messages['instant_messages'][] = array(
self::save_messages( $messages );
public static function get_message( $message_id ) {
$messages = self::get_messages();
return isset( $messages['messages'][ $message_id ] ) ? $messages['messages'][ $message_id ] : false;
public static function message_id_exists( $message_id ) {
$message = self::get_message( $message_id );
return $message !== false;
private static function get_messages() {
$messages = get_option( 'icl_admin_messages' );
if ( ! ( isset( $messages ) && $messages != false ) ) {
return array( 'messages' => array(), 'instant_messages' => array() );
if ( ! isset( $messages['messages'] ) || ! isset( $messages['instant_messages'] ) ) {
$messages = array( 'messages' => array(), 'instant_messages' => array() );
return (array) $messages;
private static function save_messages( $messages ) {
if ( isset( $messages ) ) {
update_option( 'icl_admin_messages', (array) $messages );
* string id - An unique identifier for the message
* string msg - The actual message
* string type (optional) - Any string: it will be used as css class fro the message container. A typical value is 'error', but the following strings can be also used: icl-admin-message-information, icl-admin-message-warning
* array classes (optional) - Display the notice only on specific url(s)
* bool hide (optional) - Enable the toggle link to permanently hide the notice
* bool hide_per_user (optional) - Enable the toggle link per user basis (overrides hide option)
* bool dismiss (optional) - Enable the dismiss option
* bool dismiss_per_user (optional) - Enable the dismiss option per user basis (overrides dismiss option)
* bool|string fallback_text (optional) - A message to show when the notice gets hidden
* bool|string fallback_type (optional) - The message type to use in the fallback message (@see $type)
* array fallback_classes (optional) - The message type to use in the fallback message (@see $type)
* bool|string group (optional) - A way to group messages: when displaying messages stored with this method, it's possible to filter them by group (@see ICL_AdminNotifier::displayMessages)
* bool admin_notice (optional) - Hook the rendering to the 'admin_notice' action
* string|array limit_to_page (optional) - Display the notice only on specific page(s)
public static function add_message( $args ) {
'hide_per_user' => false,
'dismiss_per_user' => false,
'fallback_text' => false,
'fallback_type' => false,
'fallback_classes' => array(),
'limit_to_page' => false,
$args = self::sanitize_message_args( $args );
$args = array_merge( $defaults, $args );
//Check if existing message has been set as dismissed or hidden
if ( self::message_id_exists( $id ) ) {
$temp_msg = self::get_message( $id );
$current_user_id = get_current_user_id();
$message_user_data = isset( $temp_msg['users'][ $current_user_id ] ) ? $temp_msg['users'][ $current_user_id ] : false;
if ( self::is_user_dismissed( $temp_msg ) || self::is_globally_dismissed( $temp_msg ) || self::is_globally_hidden( $temp_msg ) ) {
if ( isset( $message_user_data['hidden'] ) ) {
$args['hidden'] = $message_user_data['hidden'] ? false : $args['hidden'];
$id = $id ? $id : md5( wp_json_encode( $args ) );
$messages = self::get_messages();
'classes' => $args['classes'],
'hide_per_user' => $args['hide_per_user'],
'dismiss' => $args['dismiss'],
'dismiss_per_user' => $args['dismiss_per_user'],
'fallback_text' => $args['fallback_text'],
'fallback_type' => $args['fallback_type'],
'fallback_classes' => $args['classes'],
'group' => $args['group'],
'admin_notice' => $args['admin_notice'],
'limit_to_page' => $args['limit_to_page'],
'show_once' => $args['show_once'],
'capability' => $args['capability'],
$message_md5 = md5( wp_json_encode( $message ) );
if ( isset( $messages['messages'][ $id ] ) ) {
$existing_message_md5 = md5( wp_json_encode( $messages['messages'][ $id ] ) );
if ( $message_md5 != $existing_message_md5 ) {
unset( $messages['messages'][ $id ] );
if ( ! isset( $messages['messages'][ $id ] ) ) {
$messages['messages'][ $id ] = $message;
self::save_messages( $messages );
public static function is_user_dismissed( $message_data ) {
$current_user_id = get_current_user_id();
$message_user_data = isset( $message_data['users'][ $current_user_id ] ) ? $message_data['users'][ $current_user_id ] : false;
return ! empty( $message_data['dismiss_per_user'] ) && ! empty( $message_user_data['dismissed'] );
public static function is_globally_dismissed( $message_data ) {
return ! empty( $message_data['dismiss'] ) && $message_data['dismissed'];
public static function is_globally_hidden( $message_data ) {
return ! empty( $message_data['hide'] ) && $message_data['hidden'];
public static function hide_message() {
$message_id = self::get_message_id();
$dismiss = isset( $_POST['dismiss'] ) ? $_POST['dismiss'] : false;
if ( ! self::message_id_exists( $message_id ) ) {
self::set_message_display( $message_id, false, 'hide', 'hidden', 'hide_per_user' );
self::set_message_display( $message_id, false, 'dismiss', 'dismissed', 'dismiss_per_user' );
$messages = self::get_messages();
$message = $messages['messages'][ $message_id ];
if ( $message && isset( $message['fallback_text'] ) && $message['fallback_text'] ) {
echo self::display_message( $message_id, $message['fallback_text'], $message['fallback_type'], $message['fallback_classes'], false, false, true, true );
public static function get_message_id() {
if ( isset( $_POST['icl-admin-message-id'] ) ) {
$message_id = filter_var( $_POST['icl-admin-message-id'], FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$message_id = $message_id ? $message_id : '';
$message_id = preg_replace( '/^icl-id-/', '', $message_id );
public static function show_message() {
$message_id = self::get_message_id();
if ( ! self::message_id_exists( $message_id ) ) {
self::set_message_display( $message_id, true, 'hide', 'hidden', 'hide_per_user' );
$messages = self::get_messages();
$message = $messages['messages'][ $message_id ];
echo self::display_message( $message_id, $message['text'], $message['type'], $message['classes'], $message['hide'] || $message['hide_per_user'], $message['dismiss'] || $message['dismiss_per_user'], true, true );
public static function engage_message() {
$message_id = self::get_message_id();
if ( ! self::message_id_exists( $message_id ) ) {
self::set_message_display( $message_id, true, 'dismiss', 'dismissed', 'dismiss_per_user' );
private static function set_message_display( $message_id, $show, $action, $action_past, $action_user ) {
if ( $message_id === null ) {
$messages = self::get_messages();
if ( ! isset( $messages['messages'][ $message_id ] ) ) {
$message = $messages['messages'][ $message_id ];
$current_user_id = get_current_user_id();
if ( $message[ $action_user ] && $current_user_id ) {
$message['users'][ $current_user_id ][ $action_past ] = ! $show;
} elseif ( $message[ $action ] ) {
$message[ $action_past ] = ! $show;
$messages['messages'][ $message_id ] = $message;
self::save_messages( $messages );
public static function remove_message( $message_id ) {
if ( $message_id === null || ! isset( $message_id ) ) {
$messages = self::get_messages();
if ( ! isset( $messages['messages'][ $message_id ] ) ) {
unset( $messages['messages'][ $message_id ] );
self::save_messages( $messages );
public static function remove_message_group( $message_group ) {
if ( $message_group === null || ! isset( $message_group ) ) {
$all_messages = self::get_messages();
if ( ! isset( $all_messages['messages'] ) ) {
$messages = $all_messages['messages'];
$ids_to_remove = array();
foreach ( $messages as $id => $message_data ) {
if ( isset( $message_data['group'] ) && $message_data['group'] == $message_group ) {
foreach ( $ids_to_remove as $id_to_remove ) {
self::remove_message( $id_to_remove );
public static function display_messages( $group = false ) {
$messages = self::get_messages();
foreach ( $messages['messages'] as $id => $msg ) {
if ( ! $group || ( isset( $msg['group'] ) && $msg['group'] == $group ) ) {
if ( isset( $msg['admin_notice'] ) && ! $msg['admin_notice'] ) {
if ( ! isset( $msg['capability'] ) || ( $msg['capability'] == '' ) || current_user_can( $msg['capability'] ) ) {
if ( array_key_exists( 'limit_to_page', $msg ) ) {
foreach( $msg['limit_to_page'] as $page ) {
if ( array_key_exists( 'page', $_GET ) && $_GET['page'] === $page ) {
self::display_message( $id, $msg['text'], $msg['type'], $msg['classes'], $msg['hide'] || $msg['hide_per_user'], $msg['dismiss'] || $msg['dismiss_per_user'], true );
self::display_message( $id, $msg['text'], $msg['type'], $msg['classes'], $msg['hide'] || $msg['hide_per_user'], $msg['dismiss'] || $msg['dismiss_per_user'], true );
foreach ( $messages['instant_messages'] as $msg ) {
self::display_instant_message( $msg['text'], $msg['type'] );
// delete instant messages
$messages['instant_messages'] = array();
self::save_messages( $messages );
* @deprecated deprecated @since version 3.2. Use ICL_AdminNotifier::display_message()
public static function displayMessages( $group = false ) {
self::display_messages( $group );
public static function admin_notices() {
$messages = self::get_messages();
if ( isset( $messages['messages'] ) ) {
foreach ( $messages['messages'] as $id => $msg ) {
if ( isset( $msg['limit_to_page'] ) && $msg['limit_to_page'] ) {
if ( ! is_array( $msg['limit_to_page'] ) ) {
$msg['limit_to_page'] = (array) $msg['limit_to_page'];
if ( ! isset( $_REQUEST['page'] ) || ! in_array( $_REQUEST['page'], $msg['limit_to_page'] ) ) {
if ( $msg['admin_notice'] ) {
$current_user_id = get_current_user_id();
$display_fallback = false;
$message_user_data = isset( $msg['users'][ $current_user_id ] ) ? $msg['users'][ $current_user_id ] : false;
if ( $msg['dismiss_per_user'] && isset( $message_user_data['dismissed'] ) && $message_user_data['dismissed'] ) {
} elseif ( $msg['dismiss'] && isset( $msg['dismissed'] ) && $msg['dismissed'] ) {
if ( $msg['hide_per_user'] && isset( $message_user_data['hidden'] ) && $message_user_data['hidden'] ) {
$display_fallback = $msg['fallback_text'];
} elseif ( $msg['hide'] && isset( $msg['hidden'] ) && $msg['hidden'] ) {
$display_fallback = $msg['fallback_text'];
$msg['classes'] = isset( $msg['classes'] ) ? $msg['classes'] : array();
$msg['fallback_classes'] = isset( $msg['fallback_classes'] ) ? $msg['fallback_classes'] : array();
self::display_message( $id, $msg['text'], $msg['type'], $msg['classes'], $msg['hide'] || $msg['hide_per_user'], $msg['dismiss'] || $msg['dismiss_per_user'], true );
if ( $msg['show_once'] && ! $display_fallback ) {
self::remove_message( $msg['id'] );
} elseif ( $display_fallback ) {
self::display_message( $id, $msg['fallback_text'], $msg['fallback_type'], $msg['fallback_classes'], false, false, true );
if ( $msg['show_once'] ) {
self::remove_message( $msg['id'] );
* @param string|array $classes
* @param bool $admin_notice
private static function display_message( $id, $message, $type = '', $classes = array(), $hide = true, $dismiss = false, $admin_notice = false, $echo = false ) {
if ( strpos( $type, 'icl-admin-message' ) ) {
$type = str_replace( 'icl-admin-message-', '', $type );
$temp_classes[] = 'icl-admin-message';
$temp_types = explode( ' ', $type );
$temp_types = array_unique( $temp_types );
foreach ( $temp_types as $temp_type ) {
$temp_classes[] = 'icl-admin-message-' . $temp_type;
$temp_classes[] = $temp_type;
if ( ! is_array( $classes ) ) {
$classes = explode( ' ', $classes );
foreach ( $classes as $class ) {
$temp_classes[] = $class;
if ( $hide OR $dismiss ) {
$temp_classes[] = 'otgs-is-dismissible';
$temp_classes = array_unique( $temp_classes );
$class = implode( ' ', $temp_classes );
$result .= '<div class="' . $class . '" id="icl-id-' . $id . '"';
$result .= ' data-hide-text="' . __( 'Hide', 'sitepress' ) . '" ';
$result .= '<p>' . self::sanitize_and_format_message( $message ) . '</p>';
$result .= ' <span class="icl-admin-message-hide notice-dismiss"><span class="screen-reader-text">' . __( 'Hide this notice.', 'sitepress' ) . '</span></span>';
$result .= ' <span class="icl-admin-message-dismiss notice-dismiss">';
$result .= '<span class="screen-reader-text"><input class="icl-admin-message-dismiss-check" type="checkbox" value="1" />';
$result .= __( 'Dismiss this notice.', 'sitepress' );
$result .= '</span></span>';
public static function display_instant_message( $message, $type = 'information', $class = false, $return = false, $fadeout = false ) {
if ( ! $class && $type ) {
$classes[] = 'instant-message';