Select Git revision
AjaxHandler.php
-
Grzegorz Rola authoredGrzegorz Rola authored
AjaxHandler.php 2.92 KiB
<?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';
/**
* @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() {
wp_register_script(
self::SCRIPT_HANDLE,
trailingslashit( $this->assetsURL ) . 'js/notice.js',
[ 'jquery' ],
self::SCRIPTS_VERSION
);
wp_enqueue_script( self::SCRIPT_HANDLE );
}
/**
* Add Java Script to admin header.
*/
public function addScriptToAdminHead() {
include __DIR__ . '/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 ] );
$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();
}
}
}