Skip to content
Snippets Groups Projects
Select Git revision
  • d884c9e7decd10abc7acf5a5db33749cc5fb0994
  • master default protected
  • bugfix/wordpress-review
  • fix/duplicate
  • bugfix/get_current_screen_fail
  • feature/dismiss-nonce
  • replace-dodgy-path
  • bugfix/notice-not-show
  • devel
  • 3.3.0
  • 3.2.5
  • 3.2.4
  • 3.2.3
  • 3.2.2
  • 3.2.1
  • 3.2.0
  • 3.2.0-beta7
  • 3.2.0-beta6
  • 3.2.0-beta5
  • 3.2.0-beta4
  • 3.2.0-beta3
  • 3.2.0-beta2
  • 3.2.0-beta1
  • 3.1.4
  • 3.1.4-beta1
  • 3.1.3
  • 3.1.1
  • 3.1
  • 3.0
29 results

AjaxHandler.php

Blame
  • 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();
            }
        }
    
    }