<?php /** * Nag handling * * Handles all nag operations. * Please, use these features with respect for users. * Don't hijack the admin dashboard! * * @package System * @author Pierre Lannoy <https://pierre.lannoy.fr/>. * @since 1.0.0 */ namespace Vibes\System; /** * Define the nag functionality. * * Handles all nag operations. Note this nag feature respects the * DISABLE_NAG_NOTICES unofficial "standard". * * @package System * @author Pierre Lannoy <https://pierre.lannoy.fr/>. * @since 1.0.0 */ class Nag { /** * The nags list. * * @since 1.0.0 * @access private * @var array $nags The nags list. */ private static $nags = []; /** * Indicates whether nags are allowed or not. * * @since 1.0.0 * @access private * @var boolean $allowed Is nags allowed? */ private static $allowed = true; /** * Verify if nags are allowed and if yes, load the nags. * * @since 1.0.0 */ public static function init() { if ( defined( 'DISABLE_NAG_NOTICES' ) ) { self::$allowed = ! DISABLE_NAG_NOTICES; } if ( self::$allowed ) { self::$allowed = Option::network_get( 'display_nag' ); } if ( self::$allowed ) { self::$nags = Option::network_get( 'nags' ); } } /** * Adds a Nag. * * @param string $id Id of the nag. * @param string $type Type of the nag ('error', 'warning', 'success' or 'info'). * @param string $value Value to display. * @since 1.0.0 */ public static function add( $id, $type, $value ) { self::$nags[ $id ] = [ 'type' => $type, 'value' => $value, ]; Option::network_set( 'nags', self::$nags ); } /** * Deletes a Nag. * * @param string $id Id of the nag. * @since 1.0.0 */ public static function delete( $id ) { if ( array_key_exists( $id, self::$nags ) ) { unset( self::$nags[ $id ] ); Option::network_set( 'nags', self::$nags ); } } /** * Initializes the class and set its properties. * * @since 1.0.0 */ public function __construct() { } /** * Show all available notices. * * @since 1.0.0 */ public function display() { if ( self::$allowed ) { foreach ( self::$nags as $key => $nag ) { $nonce_action = sanitize_key( $key ); $nonce_name = str_replace( [ '-', '_' ], '', $nonce_action ); $nonce = wp_nonce_field( $nonce_action, $nonce_name, false, false ); $div_id = 'vibes-' . $nonce_name; $div_class = 'notice notice-' . $nag['type'] . ' is-dismissible'; $text = wp_kses( $nag['value'], [ 'a' => [ 'href' => true, ], 'br' => true, 'em' => true, 'strong' => true, ] ); $html = '<div id="' . $div_id . '" class="' . $div_class . '">' . $nonce . '<p>' . $text . '</p></div>'; $js = '<script>jQuery(document).ready(function($){$("#' . $div_id . '").on("click", ".notice-dismiss", function(event){$.post(ajaxurl,{action: "hide_vibes_nag",' . $nonce_name . ': $("#' . $nonce_name . '").val()});});});</script>'; // phpcs:ignore print( $html . $js ); } } } /** * Ajax handler for updating the displaying status of notices. * * @since 1.0.0 */ public static function hide_callback() { foreach ( self::$nags as $key => $nag ) { $nonce_action = sanitize_key( $key ); $nonce_name = str_replace( [ '-', '_' ], '', $nonce_action ); if ( false !== check_ajax_referer( $nonce_action, $nonce_name, false ) ) { self::delete( $key ); wp_die( 200 ); } } wp_die( 409 ); } } Nag::init();