351 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			351 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * The RankMath API.
 | 
						|
 *
 | 
						|
 * @since      1.5.0
 | 
						|
 * @package    RankMathPro
 | 
						|
 * @subpackage RankMathPro\Admin
 | 
						|
 * @author     Rank Math <support@rankmath.com>
 | 
						|
 */
 | 
						|
 | 
						|
namespace RankMathPro\Admin;
 | 
						|
 | 
						|
use RankMath\Admin\Admin_Helper;
 | 
						|
 | 
						|
defined( 'ABSPATH' ) || exit;
 | 
						|
 | 
						|
/**
 | 
						|
 * Api class.
 | 
						|
 */
 | 
						|
class Api {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Rank Math SEO Checkup API.
 | 
						|
	 *
 | 
						|
	 * @var string
 | 
						|
	 */
 | 
						|
	protected $api_url = 'https://rankmath.com/wp-json/rankmath/v1/';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Was the last request successful.
 | 
						|
	 *
 | 
						|
	 * @var bool
 | 
						|
	 */
 | 
						|
	protected $is_success = false;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Last error.
 | 
						|
	 *
 | 
						|
	 * @var string
 | 
						|
	 */
 | 
						|
	protected $last_error = '';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Last response.
 | 
						|
	 *
 | 
						|
	 * @var array
 | 
						|
	 */
 | 
						|
	protected $last_response = [];
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Last response header code.
 | 
						|
	 *
 | 
						|
	 * @var int
 | 
						|
	 */
 | 
						|
	protected $last_code = 0;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * User agent.
 | 
						|
	 *
 | 
						|
	 * @var string
 | 
						|
	 */
 | 
						|
	protected $user_agent = '';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Is request blocking (do we wait for response)?
 | 
						|
	 *
 | 
						|
	 * @var bool
 | 
						|
	 */
 | 
						|
	protected $is_blocking = true;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Main instance
 | 
						|
	 *
 | 
						|
	 * Ensure only one instance is loaded or can be loaded.
 | 
						|
	 *
 | 
						|
	 * @return Api
 | 
						|
	 */
 | 
						|
	public static function get() {
 | 
						|
		static $instance;
 | 
						|
 | 
						|
		if ( is_null( $instance ) && ! ( $instance instanceof Api ) ) {
 | 
						|
			$instance              = new Api();
 | 
						|
			$instance->is_blocking = true;
 | 
						|
			$instance->user_agent  = 'RankMath/' . md5( esc_url( home_url( '/' ) ) );
 | 
						|
		}
 | 
						|
 | 
						|
		return $instance;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Was the last request successful?
 | 
						|
	 *
 | 
						|
	 * @return bool  True for success, false for failure
 | 
						|
	 */
 | 
						|
	public function is_success() {
 | 
						|
		return $this->is_success;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get the last error returned by either the network transport, or by the API.
 | 
						|
	 * If something didn't work, this should contain the string describing the problem.
 | 
						|
	 *
 | 
						|
	 * @return  array|false  describing the error
 | 
						|
	 */
 | 
						|
	public function get_error() {
 | 
						|
		return $this->last_error ? $this->last_error : false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get an array containing the HTTP headers and the body of the API response.
 | 
						|
	 *
 | 
						|
	 * @return array  Assoc array with keys 'headers' and 'body'
 | 
						|
	 */
 | 
						|
	public function get_response() {
 | 
						|
		return $this->last_response;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Make an HTTP GET request - for retrieving data.
 | 
						|
	 *
 | 
						|
	 * @param string $url     URL to do request.
 | 
						|
	 * @param array  $args    Assoc array of arguments (usually your data).
 | 
						|
	 * @param int    $timeout Timeout limit for request in seconds.
 | 
						|
	 *
 | 
						|
	 * @return array|false     Assoc array of API response, decoded from JSON.
 | 
						|
	 */
 | 
						|
	public function http_get( $url, $args = [], $timeout = 10 ) {
 | 
						|
		return $this->make_request( 'GET', $url, $args, $timeout );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Make an HTTP POST request - for creating and updating items.
 | 
						|
	 *
 | 
						|
	 * @param string $url     URL to do request.
 | 
						|
	 * @param array  $args    Assoc array of arguments (usually your data).
 | 
						|
	 * @param int    $timeout Timeout limit for request in seconds.
 | 
						|
	 *
 | 
						|
	 * @return array|false     Assoc array of API response, decoded from JSON.
 | 
						|
	 */
 | 
						|
	public function http_post( $url, $args = [], $timeout = 10 ) {
 | 
						|
		return $this->make_request( 'POST', $url, $args, $timeout );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Make an HTTP PUT request - for creating new items.
 | 
						|
	 *
 | 
						|
	 * @param string $url     URL to do request.
 | 
						|
	 * @param array  $args    Assoc array of arguments (usually your data).
 | 
						|
	 * @param int    $timeout Timeout limit for request in seconds.
 | 
						|
	 *
 | 
						|
	 * @return array|false     Assoc array of API response, decoded from JSON.
 | 
						|
	 */
 | 
						|
	public function http_put( $url, $args = [], $timeout = 10 ) {
 | 
						|
		return $this->make_request( 'PUT', $url, $args, $timeout );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Make an HTTP DELETE request - for deleting data.
 | 
						|
	 *
 | 
						|
	 * @param string $url     URL to do request.
 | 
						|
	 * @param array  $args    Assoc array of arguments (usually your data).
 | 
						|
	 * @param int    $timeout Timeout limit for request in seconds.
 | 
						|
	 *
 | 
						|
	 * @return array|false     Assoc array of API response, decoded from JSON.
 | 
						|
	 */
 | 
						|
	public function http_delete( $url, $args = [], $timeout = 10 ) {
 | 
						|
		return $this->make_request( 'DELETE', $url, $args, $timeout );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Performs the underlying HTTP request. Not very exciting.
 | 
						|
	 *
 | 
						|
	 * @param string $http_verb The HTTP verb to use: get, post, put, patch, delete.
 | 
						|
	 * @param string $url       URL to do request.
 | 
						|
	 * @param array  $args       Assoc array of parameters to be passed.
 | 
						|
	 * @param int    $timeout    Timeout limit for request in seconds.
 | 
						|
	 *
 | 
						|
	 * @return array|false Assoc array of decoded result.
 | 
						|
	 */
 | 
						|
	protected function make_request( $http_verb, $url, $args = [], $timeout = 10 ) {
 | 
						|
		$params = [
 | 
						|
			'timeout'    => $timeout,
 | 
						|
			'method'     => $http_verb,
 | 
						|
			'user-agent' => $this->user_agent,
 | 
						|
			'blocking'   => $this->is_blocking,
 | 
						|
		];
 | 
						|
 | 
						|
		if ( ! empty( $args ) && is_array( $args ) ) {
 | 
						|
			$params['body'] = $args;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->reset();
 | 
						|
		$response = wp_remote_request( $this->api_url . $url, $params );
 | 
						|
		$this->determine_success( $response );
 | 
						|
 | 
						|
		return $this->format_response( $response );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Decode the response and format any error messages for debugging
 | 
						|
	 *
 | 
						|
	 * @param array $response The response from the curl request.
 | 
						|
	 *
 | 
						|
	 * @return array|false The JSON decoded into an array
 | 
						|
	 */
 | 
						|
	protected function format_response( $response ) {
 | 
						|
		$this->last_response = $response;
 | 
						|
 | 
						|
		if ( is_wp_error( $response ) ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		if ( ! empty( $response['body'] ) ) {
 | 
						|
			return json_decode( $response['body'], true );
 | 
						|
		}
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Check if the response was successful or a failure. If it failed, store the error.
 | 
						|
	 *
 | 
						|
	 * @param array $response The response from the curl request.
 | 
						|
	 */
 | 
						|
	protected function determine_success( $response ) {
 | 
						|
		if ( is_wp_error( $response ) ) {
 | 
						|
			$this->last_error = 'WP_Error: ' . $response->get_error_message();
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->last_code = wp_remote_retrieve_response_code( $response );
 | 
						|
		if ( in_array( $this->last_code, [ 200, 204 ], true ) ) {
 | 
						|
			$this->is_success = true;
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->last_error = 'Unknown error, call getLastResponse() to find out what happened.';
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Reset request.
 | 
						|
	 */
 | 
						|
	protected function reset() {
 | 
						|
		$this->last_code     = 0;
 | 
						|
		$this->last_error    = '';
 | 
						|
		$this->is_success    = false;
 | 
						|
		$this->is_blocking   = true;
 | 
						|
		$this->last_response = [
 | 
						|
			'body'    => null,
 | 
						|
			'headers' => null,
 | 
						|
		];
 | 
						|
	}
 | 
						|
 | 
						|
	public function get_settings() {
 | 
						|
		$registered = Admin_Helper::get_registration_data();
 | 
						|
		if ( ! $registered || empty( $registered['username'] ) || empty( $registered['api_key'] ) ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$response = $this->http_get(
 | 
						|
			'siteSettings',
 | 
						|
			[
 | 
						|
				'username' => $registered['username'],
 | 
						|
				'api_key'  => $registered['api_key'],
 | 
						|
				'site_url' => esc_url( home_url() ),
 | 
						|
			]
 | 
						|
		);
 | 
						|
 | 
						|
		if ( ! $this->is_success() ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$registered['plan'] = $response['plan'];
 | 
						|
		Admin_Helper::get_registration_data( $registered );
 | 
						|
 | 
						|
		update_option( 'rank_math_keyword_quota', $response['keywords'] );
 | 
						|
		cmb2_update_option( 'rank-math-options-general', 'sync_global_setting', $response['settings']['analytics'] );
 | 
						|
	}
 | 
						|
 | 
						|
	public function sync_setting( $analytics ) {
 | 
						|
		$registered = Admin_Helper::get_registration_data();
 | 
						|
		if ( ! $registered || empty( $registered['username'] ) || empty( $registered['api_key'] ) ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->is_blocking = false;
 | 
						|
		$response = $this->http_post(
 | 
						|
			'siteSettings',
 | 
						|
			[
 | 
						|
				'username'  => $registered['username'],
 | 
						|
				'api_key'   => $registered['api_key'],
 | 
						|
				'site_url'  => esc_url( home_url() ),
 | 
						|
				'analytics' => $analytics,
 | 
						|
			]
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Remove registration data and disconnect from RankMath.com.
 | 
						|
	 *
 | 
						|
	 * @param string $username Username.
 | 
						|
	 * @param string $api_key  Api key.
 | 
						|
	 */
 | 
						|
	public function deactivate_site( $username, $api_key ) {
 | 
						|
		$this->is_blocking = false;
 | 
						|
		$this->http_post(
 | 
						|
			'deactivateSite',
 | 
						|
			[
 | 
						|
				'username' => $username,
 | 
						|
				'api_key'  => $api_key,
 | 
						|
				'site_url' => esc_url( home_url() ),
 | 
						|
			]
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Send analytics summary to RankMath.com.
 | 
						|
	 */
 | 
						|
	public function send_summary( $summary ) {
 | 
						|
		$this->is_blocking = false;
 | 
						|
		$this->http_post( 'siteStats', $summary );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Send keywords count data to RankMath.com.
 | 
						|
	 *
 | 
						|
	 * @param string $username Username.
 | 
						|
	 * @param string $api_key  Api key.
 | 
						|
	 * @param int    $count    Total keywords count.
 | 
						|
	 *
 | 
						|
	 * @return array|false The respnose of API.
 | 
						|
	 */
 | 
						|
	public function keywords_info( $username, $api_key, $count ) {
 | 
						|
		$response = $this->http_post(
 | 
						|
			'keywordsInfo',
 | 
						|
			[
 | 
						|
				'username' => $username,
 | 
						|
				'apiKey'   => $api_key,
 | 
						|
				'siteUrl'  => esc_url( home_url() ),
 | 
						|
				'count'    => $count,
 | 
						|
			]
 | 
						|
		);
 | 
						|
 | 
						|
		if ( ! $this->is_success() ) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		return $response;
 | 
						|
	}
 | 
						|
}
 |