<?php namespace WPDesk\Notice; use WPDesk\PluginBuilder\Plugin\HookablePluginDependant; use WPDesk\PluginBuilder\Plugin\PluginAccess; /** * Class AjaxHandler * * AjaxHandler for dismissible notices. * * @package WPDesk\Notice */ class AjaxHandler implements HookablePluginDependant { use PluginAccess; const POST_FIELD_NOTICE_NAME = 'notice_name'; const POST_FIELD_SOURCE = 'source'; const POST_FIELD_SECURITY = 'security'; const SCRIPTS_VERSION = '4'; const SCRIPT_HANDLE = 'wpdesk_notice'; const SCRIPT_HANDLE_GUTENBERG = 'wpdesk_notice_gutenberg'; /** * @var string */ private $assetsURL; /** * AjaxHandler constructor. * * @param string|null $assetsURL Assets URL. */ public function __construct( $assetsURL = null ) { $this->assetsURL = $assetsURL ?? plugins_url('/assets/', dirname(__FILE__, 3)); } /** * Hooks. */ public function hooks() { add_action( 'admin_enqueue_scripts', [ $this, 'enqueueAdminScripts' ] ); add_action( 'wp_ajax_wpdesk_notice_dismiss', [ $this, 'processAjaxNoticeDismiss' ] ); } public function isBlockEditor():bool { if ( !function_exists( 'get_current_screen' ) ) { return false; } $screen = \get_current_screen(); return is_object($screen) ? $screen->is_block_editor() : false; } /** * Enqueue admin scripts. */ public function enqueueAdminScripts() { wp_register_script( self::SCRIPT_HANDLE, trailingslashit( $this->assetsURL ) . 'js/notice.js', [ 'jquery' ], self::SCRIPTS_VERSION ); wp_enqueue_script( self::SCRIPT_HANDLE ); if($this->isBlockEditor()){ wp_register_script( self::SCRIPT_HANDLE, trailingslashit( $this->assetsURL ) . 'js/gutenberg.js', [ 'jquery' ], self::SCRIPTS_VERSION ); wp_enqueue_script( self::SCRIPT_HANDLE ); }else{ wp_register_style( self::SCRIPT_HANDLE, trailingslashit( $this->assetsURL ) . 'css/admin.css', [], self::SCRIPTS_VERSION ); wp_enqueue_style( self::SCRIPT_HANDLE ); } } /** * Process AJAX notice dismiss. * * Updates corresponded WordPress option and fires wpdesk_notice_dismissed_notice action with notice name. */ public function processAjaxNoticeDismiss() { if ( isset( $_POST[ self::POST_FIELD_NOTICE_NAME ] ) ) { $noticeName = sanitize_text_field( $_POST[ self::POST_FIELD_NOTICE_NAME ] ); $optionName = PermanentDismissibleNotice::OPTION_NAME_PREFIX . $noticeName; check_ajax_referer( $optionName, self::POST_FIELD_SECURITY ); if ( ! current_user_can( 'edit_posts' ) ) { wp_send_json_error(); } if ( isset( $_POST[ self::POST_FIELD_SOURCE ] ) ) { $source = sanitize_text_field( $_POST[ self::POST_FIELD_SOURCE ] ); } else { $source = null; } update_option( $optionName, PermanentDismissibleNotice::OPTION_VALUE_DISMISSED ); do_action( 'wpdesk_notice_dismissed_notice', $noticeName, $source ); if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { wp_send_json_success(); } } if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { wp_send_json_error(); } } }