Your IP : 216.73.216.138


Current Path : /home/ereika83/www/wp-content/plugins/learndash-propanel/includes/
Upload File :
Current File : /home/ereika83/www/wp-content/plugins/learndash-propanel/includes/class-ld-propanel-rest.php

<?php
/**
 * REST API functionality.
 *
 * @since 2.2.0
 */

defined( 'ABSPATH' ) || die;

/**
 * Class LearnDash_ProPanel_REST
 *
 * API functionality.
 *
 * @since 2.2.0
 */
class LearnDash_ProPanel_REST {

	protected static $instance;

	/**
	 * Returns the *Singleton* instance of this class.
	 *
	 * @since	2.2.0
	 * @return	LearnDash_ProPanel_REST The *Singleton* instance.
	 */
	public static function get_instance() {
		if ( null === static::$instance ) {
			static::$instance = new static();
		}

		return static::$instance;
	}

	/**
	 * Override class function for 'this'.
	 *
	 * @return  LearnDash_ProPanel_REST  Reference to the current instance.
	 */
	static function this() {
		return self::$instance;
	}

	/**
	 * LearnDash_ProPanel_REST constructor.
	 *
	 * @since 2.2.0
	 */
	function __construct() {

		add_action( 'rest_api_init', array( $this, 'add_endpoints' ) );

	}

	/**
	 * Adds REST API endpoints
	 *
	 * @since	2.2.0
	 * @return  void
	 */
	public function add_endpoints() {

		register_rest_route(
			'ld-propanel/v1',
			'/gutenberg-get-posts/',
			array(
				'methods'             => 'GET',
				'callback'            => array( $this, 'gutenberg_get_posts' ),
				'args'                => array(
					's'         => array(
						'required' => true,
					),
					'post_type' => array(
						'required' => true,
					),
					'offset'    => array(
					),
					'per_page'  => array(
					),
				),
				'permission_callback' => function( $request ) {
					return current_user_can( 'edit_posts' );
				}
			)
		);

		register_rest_route(
			'ld-propanel/v1',
			'/gutenberg-get-post/',
			array(
				'methods'             => 'GET',
				'callback'            => array( $this, 'gutenberg_get_post' ),
				'args'                => array(
					'id' => array(
						'required' => true,
					),
				),
				'permission_callback' => function( $request ) {
					return current_user_can( 'edit_posts' );
				}
			)
		);

		register_rest_route(
			'ld-propanel/v1',
			'/gutenberg-get-users/',
			array(
				'methods'             => 'GET',
				'callback'            => array( $this, 'gutenberg_get_users' ),
				'args'                => array(
					's'        => array(
						'required' => true,
					),
					'offset'   => array(
					),
					'per_page' => array(
					),
				),
				'permission_callback' => function( $request ) {
					return current_user_can( 'edit_posts' );
				}
			)
		);

		register_rest_route(
			'ld-propanel/v1',
			'/gutenberg-get-user/',
			array(
				'methods'             => 'GET',
				'callback'            => array( $this, 'gutenberg_get_user' ),
				'args'                => array(
					'id' => array(
						'required' => true,
					),
				),
				'permission_callback' => function( $request ) {
					return current_user_can( 'edit_posts' );
				}
			)
		);

	}

	/**
	 * Returns a list of Posts to be used within the Gutenberg Block
	 *
	 * @param   WP_REST_Request  $request   Request Object.
	 *
	 * @since	2.2.0
	 * @return  WP_REST_Response            Response Object.
	 */
	public function gutenberg_get_posts( $request ) {

		try {

			$query_args = array(
				'post_type' => $request->get_param( 'post_type' ),
				's'         => $request->get_param( 's' ),
			);

			$total_query = new WP_Query( array_merge( $query_args, array(
				'posts_per_page' => -1,
				'fields'         => 'ids',
			) ) );

			$total = count( $total_query->posts );

			$per_page = $request->get_param( 'per_page' );
			$per_page = ( $per_page ) ? (int) $per_page : 10;

			$offset = $request->get_param( 'offset' );
			$offset = ( $offset ) ? (int) $offset : 0;

			$results = new WP_Query( array_merge( $query_args, array(
				'offset'         => $offset,
				'posts_per_page' => $per_page,
				'orderby'        => 'title',
				'order'          => 'ASC',
			) ) );

			$has_more = false;
			$options = array();

			if ( $results->have_posts() ) {

				$posts = wp_list_pluck( $results->posts, 'post_title', 'ID' );

				// Converts the data to something that our Select field will tolerate.
				$options = array_values( array_map( function( $key, $value ) {
					return array(
						'value' => $key,
						'label' => $value,
					);
				}, array_keys( $posts ), $posts ) );

				$processed_count = count( $results->posts ) + $offset;

				// Check if there are more to be found.
				if ( $processed_count < $total ) $has_more = true;

			}

			return new WP_REST_Response( array(
				'options' => $options,
				'hasMore' => $has_more,
				'total'   => (int) $total,
			) );

		}
		catch ( Exception $exception ) {

			return new WP_REST_Response( array(
				'options' => array(),
				'hasMore' => false,
			), 500 );

		}

	}

	/**
	 * Returns a specific Post to be used when populating a default value
	 *
	 * @param   WP_REST_Request  $request   Request Object.
	 *
	 * @since	2.2.0
	 * @return  WP_REST_Response            Response Object.
	 */
	public function gutenberg_get_post( $request ) {

		try {

			global $wpdb;

			$results = $wpdb->get_row( $wpdb->prepare( "SELECT id as value, post_title as label FROM {$wpdb->prefix}posts WHERE id = %d", $request->get_param( 'id' ) ) );

			return new WP_REST_Response( array(
				'post' => ( $results ) ? $results : array(),
			) );

		}
		catch ( Exception $exception ) {

			return new WP_REST_Response( array(
				'post' => array(),
			), 500 );

		}

	}

	/**
	 * Returns a list of Users to be used within the Gutenberg Block
	 *
	 * @param   WP_REST_Request  $request   Request Object.
	 *
	 * @since	2.2.0
	 * @return  WP_REST_Response            Response Object.
	 */
	public function gutenberg_get_users( $request ) {

		try {

			$query_args = array(
				'search' => "*{$request->get_param( 's' )}*",
			);

			$total_query = new WP_User_Query( array_merge( $query_args, array(
				'number' => -1,
				'fields' => 'ID',
			) ) );

			$total = $total_query->get_total();

			$per_page = $request->get_param( 'per_page' );
			$per_page = ( $per_page ) ? (int) $per_page : 10;

			$offset = $request->get_param( 'offset' );
			$offset = ( $offset ) ? (int) $offset : 0;

			$current_query = new WP_User_Query( array_merge( $query_args, array(
				'offset' => $offset,
				'number' => $per_page,
			) ) );

			$has_more = false;
			$options  = array();

			if ( $results = $current_query->get_results() ) {

				// Converts the data to something that our Select field will tolerate.
				$options = array_map( function( $user ) {

					$user = new WP_User( $user->ID );

					$label = $user->user_login;

					if ( $user->user_email ) {
						$label .= " | {$user->user_email}";
					}

					return array(
						'value' => $user->ID,
						'label' => $label,
					);

				}, $results );

				$processed_count = count( $results ) + $offset;

				// Check if there are more to be found.
				if ( $processed_count < $total ) $has_more = true;

			}

			return new WP_REST_Response( array(
				'options' => $options,
				'hasMore' => $has_more,
				'total'  => (int) $total,
			) );

		}
		catch ( Exception $exception ) {

			return new WP_REST_Response( array(
				'options' => array(),
				'hasMore' => false,
			), 500 );

		}

	}

	/**
	 * Returns a specific User to be used when populating a default value
	 *
	 * @param   WP_REST_Request  $request   Request Object.
	 *
	 * @since	2.2.0
	 * @return  WP_REST_Response            Response Object.
	 */
	public function gutenberg_get_user( $request ) {

		try {

			global $wpdb;

			$results = $wpdb->get_row( $wpdb->prepare( "SELECT id as value, CONCAT( user_login, ' | ', user_email ) as label FROM {$wpdb->prefix}users WHERE id = %d", $request->get_param( 'id' ) ) );

			// In case an email address is not stored.
			$results->label = rtrim( $results->label, ' | ' );

			return new WP_REST_Response( array(
				'user' => ( $results ) ? $results : array(),
			) );

		}
		catch ( Exception $exception ) {

			return new WP_REST_Response( array(
				'user' => array(),
			), 500 );

		}

	}

}