<?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 SCRIPTS_VERSION = '4'; const SCRIPT_HANDLE = 'wpdesk_notice'; /** * @var string */ private $assetsURL; /** * AjaxHandler constructor. * * @param string|null $assetsURL Assets URL. */ public function __construct($assetsURL = null) { $this->assetsURL = $assetsURL; } /** * Hooks. */ public function hooks() { if ($this->assetsURL) { add_action('admin_enqueue_scripts', [$this, 'enqueueAdminScripts']); } else { add_action('admin_head', [$this,'addScriptToAdminHead']); } add_action('wp_ajax_wpdesk_notice_dismiss', [$this, 'processAjaxNoticeDismiss']); } /** * Enqueue admin scripts. */ public function enqueueAdminScripts() { $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; wp_register_script( self::SCRIPT_HANDLE, trailingslashit($this->assetsURL) . 'js/notice' . $suffix . '.js', array( 'jquery' ), self::SCRIPTS_VERSION ); wp_enqueue_script(self::SCRIPT_HANDLE); } /** * Add Java Script to admin header. */ public function addScriptToAdminHead() { include 'views/admin-head-js.php'; } /** * 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]); if (isset($_POST[self::POST_FIELD_SOURCE])) { $source = sanitize_text_field($_POST[ self::POST_FIELD_SOURCE ]); } else { $source = null; } update_option( PermanentDismissibleNotice::OPTION_NAME_PREFIX . $noticeName, PermanentDismissibleNotice::OPTION_VALUE_DISMISSED ); do_action('wpdesk_notice_dismissed_notice', $noticeName, $source); } if (defined('DOING_AJAX') && DOING_AJAX) { die(); } } }