123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- <?php
- if ( ! defined( 'ABSPATH' ) ) {
- exit; // Exit if accessed directly
- }
- if ( ! class_exists( 'ACF_Ajax' ) ) :
- class ACF_Ajax {
- /** @var string The AJAX action name. */
- var $action = '';
- /** @var array The $_REQUEST data. */
- var $request;
- /** @var bool Prevents access for non-logged in users. */
- var $public = false;
- /**
- * __construct
- *
- * Sets up the class functionality.
- *
- * @date 31/7/18
- * @since 5.7.2
- *
- * @param void
- * @return void
- */
- function __construct() {
- $this->initialize();
- $this->add_actions();
- }
- /**
- * has
- *
- * Returns true if the request has data for the given key.
- *
- * @date 31/7/18
- * @since 5.7.2
- *
- * @param string $key The data key.
- * @return boolean
- */
- function has( $key = '' ) {
- return isset( $this->request[ $key ] );
- }
- /**
- * get
- *
- * Returns request data for the given key.
- *
- * @date 31/7/18
- * @since 5.7.2
- *
- * @param string $key The data key.
- * @return mixed
- */
- function get( $key = '' ) {
- return isset( $this->request[ $key ] ) ? $this->request[ $key ] : null;
- }
- /**
- * Sets request data for the given key.
- *
- * @date 31/7/18
- * @since 5.7.2
- *
- * @param string $key The data key.
- * @param mixed $value The data value.
- * @return ACF_Ajax
- */
- function set( $key = '', $value = null ) {
- $this->request[ $key ] = $value;
- return $this;
- }
- /**
- * initialize
- *
- * Allows easy access to modifying properties without changing constructor.
- *
- * @date 31/7/18
- * @since 5.7.2
- *
- * @param void
- * @return void
- */
- function initialize() {
- /* do nothing */
- }
- /**
- * add_actions
- *
- * Adds the ajax actions for this response.
- *
- * @date 31/7/18
- * @since 5.7.2
- *
- * @param void
- * @return void
- */
- function add_actions() {
- // add action for logged-in users
- add_action( "wp_ajax_{$this->action}", array( $this, 'request' ) );
- // add action for non logged-in users
- if ( $this->public ) {
- add_action( "wp_ajax_nopriv_{$this->action}", array( $this, 'request' ) );
- }
- }
- /**
- * request
- *
- * Callback for ajax action. Sets up properties and calls the get_response() function.
- *
- * @date 1/8/18
- * @since 5.7.2
- *
- * @param void
- * @return void
- */
- function request() {
- // Store data for has() and get() functions.
- $this->request = wp_unslash( $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Verified below in verify_request().
- // Verify request and handle error.
- $error = $this->verify_request( $this->request );
- if ( is_wp_error( $error ) ) {
- $this->send( $error );
- }
- // Send response.
- $this->send( $this->get_response( $this->request ) );
- }
- /**
- * Verifies the request.
- *
- * @date 9/3/20
- * @since 5.8.8
- *
- * @param array $request The request args.
- * @return (bool|WP_Error) True on success, WP_Error on fail.
- */
- function verify_request( $request ) {
- // Verify nonce.
- if ( ! acf_verify_ajax() ) {
- return new WP_Error( 'acf_invalid_nonce', __( 'Invalid nonce.', 'acf' ), array( 'status' => 404 ) );
- }
- return true;
- }
- /**
- * get_response
- *
- * Returns the response data to sent back.
- *
- * @date 31/7/18
- * @since 5.7.2
- *
- * @param array $request The request args.
- * @return mixed The response data or WP_Error.
- */
- function get_response( $request ) {
- return true;
- }
- /**
- * send
- *
- * Sends back JSON based on the $response as either success or failure.
- *
- * @date 31/7/18
- * @since 5.7.2
- *
- * @param mixed $response The response to send back.
- * @return void
- */
- function send( $response ) {
- // Return error.
- if ( is_wp_error( $response ) ) {
- $this->send_error( $response );
- // Return success.
- } else {
- wp_send_json( $response );
- }
- }
- /**
- * Sends a JSON response for the given WP_Error object.
- *
- * @date 8/3/20
- * @since 5.8.8
- *
- * @param WP_Error error The error object.
- * @return void
- */
- function send_error( $error ) {
- // Get error status
- $error_data = $error->get_error_data();
- if ( is_array( $error_data ) && isset( $error_data['status'] ) ) {
- $status_code = $error_data['status'];
- } else {
- $status_code = 500;
- }
- wp_send_json(
- array(
- 'code' => $error->get_error_code(),
- 'message' => $error->get_error_message(),
- 'data' => $error->get_error_data(),
- ),
- $status_code
- );
- }
- }
- endif; // class_exists check
|