* @copyright Copyright (c) 2012 - 2017, Cherry Team * @link http://www.cherryframework.com/ * @license http://www.gnu.org/licenses/gpl-3.0.html */ // If this file is called directly, abort. if ( ! defined( 'WPINC' ) ) { die; } if ( ! class_exists( 'Cherry_Handler' ) ) { /** * Cherry_Handler class. * * @since 1.0.0 */ class Cherry_Handler { /** * Core version. * * @since 1.5.0 * @access public * @var string */ public $core_version = ''; /** * Module directory path. * * @since 1.5.0 * @access protected * @var srting. */ protected $module_path; /** * Default settings. * * @since 1.0.0 * @var array */ private $settings = array( 'id' => '', 'action' => '', 'capability' => '', 'is_public' => false, 'callback' => '', 'type' => 'POST', 'data_type' => 'json', 'sys_messages' => array(), ); /** * Class constructor. * * @since 1.0.0 * @param object $core Core instance. * @param array $args Class args. */ public function __construct( $core, $args = array() ) { $this->settings['sys_messages'] = array( 'invalid_base_data' => esc_html__( 'Unable to process the request without nonce or server error', 'cherry-framework' ), 'no_right' => esc_html__( 'No right for this action', 'cherry-framework' ), 'invalid_nonce' => esc_html__( 'Stop CHEATING!!!', 'cherry-framework' ), 'access_is_allowed' => esc_html__( 'Access is allowed', 'cherry-framework' ), 'wait_processing' => esc_html__( 'Please wait, processing the previous request', 'cherry-framework' ), ); $this->settings = array_merge( $this->settings, $args ); $this->core_version = $core->get_core_version(); $this->module_path = $args['module_path']; if ( empty( $this->settings['id'] ) ) { echo '

ID is required attr

'; return false; } if ( empty( $this->settings['action'] ) ) { echo '

Action is required attr

'; return false; } if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { add_action( 'wp_ajax_' . $this->settings['action'], array( $this, 'handler_init' ) ); // Public action check. if ( filter_var( $this->settings['is_public'], FILTER_VALIDATE_BOOLEAN ) ) { add_action( 'wp_ajax_nopriv_' . $this->settings['action'], array( $this, 'handler_init' ) ); } } add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); add_action( 'wp_print_scripts', array( $this, 'localize_script' ) ); } /** * Handler initialization * * @since 1.0.0 * @return void */ public function handler_init() { $request_type = strtoupper( '_' . $this->settings['type'] ); if ( ! empty( $GLOBALS[ $request_type ] ) && array_key_exists( 'nonce', $GLOBALS[ $request_type ] ) ) { $nonce = $GLOBALS[ $request_type ]['nonce']; $nonce_action = ! empty( $this->settings['action'] ) ? $this->settings['action'] : 'cherry_ajax_nonce'; if ( ! wp_verify_nonce( $nonce, $nonce_action ) ) { $response = apply_filters( 'cherry_handler_response_nonce', array( 'message' => $this->settings['sys_messages']['invalid_nonce'], 'type' => 'error-notice', ) ); wp_send_json( $response ); } if ( ! empty( $this->settings['capability'] ) && ! current_user_can( $this->settings['capability'] ) ) { $response = apply_filters( 'cherry_handler_response_capability', array( 'message' => $this->settings['sys_messages']['no_right'], 'type' => 'error-notice', ) ); wp_send_json( $response ); } if ( ! empty( $this->settings['callback'] ) && is_callable( $this->settings['callback'] ) ) { ob_start(); $data = call_user_func( $this->settings['callback'] ); if ( ! $data ) { $data = ob_get_contents(); } ob_end_clean(); $response = apply_filters( 'cherry_handler_response_data', array( 'message' => $this->settings['sys_messages']['access_is_allowed'], 'type' => 'success-notice', 'data' => $data, ) ); wp_send_json( $response ); } } else { $response = apply_filters( 'cherry_handler_invalid_data', array( 'message' => $this->settings['sys_messages']['invalid_base_data'], 'type' => 'error-notice', ) ); wp_send_json( $response ); } } /** * Register and enqueue handlers js. * * @since 1.0.0 */ public function enqueue_scripts() { wp_enqueue_script( 'cherry-handler-js', esc_url( Cherry_Core::base_url( 'assets/js/min/cherry-handler.min.js', $this->module_path ) ), array( 'jquery' ), $this->core_version, true ); wp_enqueue_style( 'cherry-handler-css', esc_url( Cherry_Core::base_url( 'assets/css/cherry-handler-styles.min.css', $this->module_path ) ), array(), $this->core_version, 'all' ); } /** * Prepare data for henler script. * * @since 1.0.0 * @return void */ public function localize_script() { $nonce = $this->create_nonce( $this->settings['action'] ); wp_localize_script( 'cherry-handler-js', $this->settings['id'], array( 'action' => $this->settings['action'], 'nonce' => $nonce, 'type' => strtoupper( $this->settings['type'] ), 'data_type' => $this->settings['data_type'], 'is_public' => $this->settings['is_public'] ? 'true' : 'false', 'sys_messages' => $this->settings['sys_messages'], ) ); if ( $this->settings['is_public'] ) { wp_localize_script( 'cherry-handler-js', 'cherryHandlerAjaxUrl', array( 'ajax_url' => esc_url( admin_url( 'admin-ajax.php' ) ), ) ); } } /** * Create nonce by action * * @param string $action Nonce name. * @return string */ public function create_nonce( $action = '' ) { if ( ! empty( $action ) ) { return wp_create_nonce( $action ); } return wp_create_nonce( 'cherry_ajax_nonce' ); } /** * Returns the instance. * * @since 1.0.0 * @return object */ public static function get_instance( $core, $args ) { return new self( $core, $args ); } } }