Elementor Code Reference
  • Developers
  • Code Reference
  • Docs
  • Blog
  • Account
  • Developers
  • Code Reference
  • Docs
  • Blog
  • Account

Base_App

Base_App()


Methods

  • __construct — Base_App::__construct() Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php public function __construct() { add_action( 'admin_notices', [ $this, 'admin_notice' ] ); /** * Allow extended apps to customize the __construct without call parent::__construct. */ $this->init(); } Uses core/common/modules/connect/apps/base-app.php: Base_App::init()
  • action_authorize — Base_App::action_authorize() Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php public function action_authorize() { if ( $this->is_connected() ) { $this->redirect_to_admin_page(); return; } $this->set_client_id(); $this->set_request_state(); wp_redirect( $this->get_remote_authorize_url() ); die; } Uses core/common/modules/connect/apps/base-app.php: Base_App::redirect_to_admin_page() core/common/modules/connect/apps/base-app.php: Base_App::is_connected() core/common/modules/connect/apps/base-app.php: Base_App::set_client_id() core/common/modules/connect/apps/base-app.php: Base_App::set_request_state() core/common/modules/connect/apps/base-app.php: Base_App::get_remote_authorize_url()
  • action_disconnect — Base_App::action_disconnect() Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php public function action_disconnect() { if ( $this->is_connected() ) { $this->disconnect(); $this->add_notice( __( 'Disconnected Successfully.', 'elementor' ) ); } $this->redirect_to_admin_page(); } Uses core/common/modules/connect/apps/base-app.php: Base_App::redirect_to_admin_page() core/common/modules/connect/apps/base-app.php: Base_App::is_connected() core/common/modules/connect/apps/base-app.php: Base_App::add_notice() core/common/modules/connect/apps/base-app.php: Base_App::disconnect()
  • action_get_token — Base_App::action_get_token() Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php public function action_get_token() { if ( $this->is_connected() ) { $this->redirect_to_admin_page(); } if ( $_REQUEST['state'] !== $this->get( 'state' ) ) { $this->add_notice( 'Get Token: Invalid Request.', 'error' ); $this->redirect_to_admin_page(); } $response = $this->request( 'get_token', [ 'grant_type' => 'authorization_code', 'code' => $_REQUEST['code'], 'redirect_uri' => rawurlencode( $this->get_admin_url( 'get_token' ) […]
  • add — Base_App::add( $key,  $value,  $default = '' ) Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php protected function add( $key, $value, $default = '' ) { $new_value = $this->get( $key, $default ); if ( is_array( $new_value ) ) { $new_value[] = $value; } elseif ( is_string( $new_value ) ) { $new_value .= $value; } elseif ( is_numeric( $new_value ) ) […]
  • add_notice — Base_App::add_notice( $content,  $type = 'success' ) Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php protected function add_notice( $content, $type = 'success' ) { $this->add( 'notices', compact( 'content', 'type' ), [] ); } Uses core/common/modules/connect/apps/base-app.php: Base_App::add()
  • admin_notice — Base_App::admin_notice() Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php public function admin_notice() { $notices = $this->get( 'notices' ); if ( ! $notices ) { return; } echo '<div id="message" class="updated notice is-dismissible"><p>'; foreach ( $notices as $notice ) { echo wp_kses_post( sprintf( '<div class="%s"><p>%s</p></div>', $notice['type'], wpautop( $notice['content'] ) ) ); } echo '</p><button type="button" class="notice-dismiss"><span […]
  • after_connect — Base_App::after_connect() Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php protected function after_connect() {} Used By core/common/modules/connect/apps/base-app.php: Base_App::action_get_token()
  • delete — Base_App::delete( $key = null ) Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php protected function delete( $key = null ) { $this->init_data(); if ( $key ) { unset( $this->data[ $key ] ); } else { $this->data = []; } $this->update_settings(); } Uses core/common/modules/connect/apps/base-app.php: Base_App::init_data() core/common/modules/connect/apps/base-app.php: Base_App::update_settings()
  • disconnect — Base_App::disconnect() Changelog Changelog Version Description 2.3.0 Introduced. Source core/common/modules/connect/apps/base-app.php protected function disconnect() { // Try update the server, but not needed to handle errors. $this->request( 'disconnect' ); $this->delete(); } Uses core/common/modules/connect/apps/base-app.php: Base_App::delete() core/common/modules/connect/apps/base-app.php: Base_App::is_connected() core/common/modules/connect/apps/base-app.php: Base_App::request()

Source

core/common/modules/connect/apps/base-app.php

abstract class Base_App {

	const OPTION_NAME_PREFIX = 'elementor_connect_';

	const SITE_URL = 'https://my.elementor.com/connect/v1';

	const API_URL = 'https://my.elementor.com/api/connect/v1';

	protected $data = [];

	abstract public function render_admin_widget();

	abstract protected function get_slug();

	abstract protected function update_settings();

	public static function get_class_name() {
		return get_called_class();
	}

	protected function get_option_name() {
		return static::OPTION_NAME_PREFIX . $this->get_slug();
	}

	public function admin_notice() {
		$notices = $this->get( 'notices' );

		if ( ! $notices ) {
			return;
		}
		echo '<div id="message" class="updated notice is-dismissible"><p>';

		foreach ( $notices as $notice ) {
			echo wp_kses_post( sprintf( '<div class="%s"><p>%s</p></div>', $notice['type'], wpautop( $notice['content'] ) ) );
		}

		echo '</p><button type="button" class="notice-dismiss"><span class="screen-reader-text">' .
			__( 'Dismiss', 'elementor' ) .
			'</span></button></div>';

		$this->delete( 'notices' );
	}

	public function action_authorize() {
		if ( $this->is_connected() ) {
			$this->redirect_to_admin_page();
			return;
		}

		$this->set_client_id();
		$this->set_request_state();

		wp_redirect( $this->get_remote_authorize_url() );
		die;
	}

	public function action_get_token() {
		if ( $this->is_connected() ) {
			$this->redirect_to_admin_page();
		}

		if ( $_REQUEST['state'] !== $this->get( 'state' ) ) {
			$this->add_notice( 'Get Token: Invalid Request.', 'error' );
			$this->redirect_to_admin_page();
		}

		$response = $this->request( 'get_token', [
			'grant_type' => 'authorization_code',
			'code' => $_REQUEST['code'],
			'redirect_uri' => rawurlencode( $this->get_admin_url( 'get_token' ) ),
			'client_id' => $this->get( 'client_id' ),
		] );

		if ( is_wp_error( $response ) ) {
			$notice = 'Cannot Get Token:' . $response->get_error_message();
			$this->add_notice( $notice, 'error' );
			$this->redirect_to_admin_page();
		}

		$this->delete( 'state' );
		$this->set( (array) $response );

		$this->after_connect();

		// Add the notice *after* the method `after_connect`, so an app can redirect without the notice.
		$this->add_notice( __( 'Connected Successfully.', 'elementor' ) );

		$this->redirect_to_admin_page();
	}

	public function action_disconnect() {
		if ( $this->is_connected() ) {
			$this->disconnect();
			$this->add_notice( __( 'Disconnected Successfully.', 'elementor' ) );
		}

		$this->redirect_to_admin_page();
	}

	public function get_admin_url( $action, $params = [] ) {
		$params = [
			'app' => $this->get_slug(),
			'action' => $action,
			'nonce' => wp_create_nonce( $this->get_slug() . $action ),
		] + $params;

		return add_query_arg( $params, Admin::$url );
	}

	public function is_connected() {
		return (bool) $this->get( 'access_token' );
	}

	protected function init() {}

	protected function init_data() {}

	protected function after_connect() {}

	public function get( $key, $default = null ) {
		$this->init_data();

		return isset( $this->data[ $key ] ) ? $this->data[ $key ] : $default;
	}

	protected function set( $key, $value = null ) {
		$this->init_data();

		if ( is_array( $key ) ) {
			$this->data = array_replace_recursive( $this->data, $key );
		} else {
			$this->data[ $key ] = $value;
		}

		$this->update_settings();
	}

	protected function delete( $key = null ) {
		$this->init_data();

		if ( $key ) {
			unset( $this->data[ $key ] );
		} else {
			$this->data = [];
		}

		$this->update_settings();
	}

	protected function add( $key, $value, $default = '' ) {
		$new_value = $this->get( $key, $default );

		if ( is_array( $new_value ) ) {
			$new_value[] = $value;
		} elseif ( is_string( $new_value ) ) {
			$new_value .= $value;
		} elseif ( is_numeric( $new_value ) ) {
			$new_value += $value;
		}

		$this->set( $key, $new_value );
	}

	protected function add_notice( $content, $type = 'success' ) {
		$this->add( 'notices', compact( 'content', 'type' ), [] );
	}

	protected function request( $action, $request_body = [] ) {
		$request_body = [
			'app' => $this->get_slug(),
			'access_token' => $this->get( 'access_token' ),
			'client_id' => $this->get( 'client_id' ),
			'local_id' => get_current_user_id(),
			'site_key' => $this->get_site_key(),
			'home_url' => trailingslashit( home_url() ),
		] + $request_body;

		$headers = [];

		if ( $this->is_connected() ) {
			$headers['X-Elementor-Signature'] = hash_hmac( 'sha256', wp_json_encode( $request_body, JSON_NUMERIC_CHECK ), $this->get( 'access_token_secret' ) );
		}

		$response = wp_remote_post( $this->get_api_url() . '/' . $action, [
			'body' => $request_body,
			'headers' => $headers,
		] );

		if ( is_wp_error( $response ) ) {
			wp_die( $response, [
				'back_link' => true,
			] );
		}

		$body = wp_remote_retrieve_body( $response );
		$response_code = (int) wp_remote_retrieve_response_code( $response );

		if ( ! $response_code ) {
			return new \WP_Error( 500, 'No Response' );

		}

		// Server sent a success message without content.
		if ( 'null' === $body ) {
			$body = true;
		}

		$body = json_decode( $body );

		if ( false === $body ) {
			return new \WP_Error( 422, 'Wrong Server Response' );
		}

		if ( 200 !== $response_code ) {
			$message = $body->message ? $body->message : wp_remote_retrieve_response_message( $response );
			$code = $body->code ? $body->code : $response_code;

			if ( 'Reconnect' === $message ) {
				$this->delete();
				wp_redirect( $this->get_remote_authorize_url() );
				die;
			}

			return new \WP_Error( $code, $message );
		}

		return $body;
	}

	protected function get_api_url() {
		return static::API_URL . '/' . $this->get_slug();
	}

	protected function get_remote_site_url() {
		return static::SITE_URL . '/' . $this->get_slug();
	}

	protected function get_remote_authorize_url() {
		$redirect_uri = $this->get_admin_url( 'get_token' );
		if ( ! empty( $_REQUEST['mode'] ) && 'popup' === $_REQUEST['mode'] ) {
			$redirect_uri = add_query_arg( 'mode', 'popup', $redirect_uri );
		}

		$url = add_query_arg( [
			'action' => 'authorize',
			'response_type' => 'code',
			'client_id' => $this->get( 'client_id' ),
			'auth_secret' => $this->get( 'auth_secret' ),
			'state' => $this->get( 'state' ),
			'redirect_uri' => rawurlencode( $redirect_uri ),
		], $this->get_remote_site_url() );

		return $url;
	}

	protected function redirect_to_admin_page( $url = '' ) {
		if ( ! $url ) {
			$url = Admin::$url;
		}

		if ( ! empty( $_REQUEST['mode'] ) && 'popup' === $_REQUEST['mode'] ) {
			$this->print_popup_close_script( $url );
		} else {
			wp_safe_redirect( $url );
			die;
		}
	}

	protected function set_client_id() {
		if ( $this->get( 'client_id' ) ) {
			return;
		}

		$response = $this->request( 'get_client_id' );

		if ( is_wp_error( $response ) ) {
			wp_die( $response, $response->get_error_message() );
		}

		$this->set( 'client_id', $response->client_id );
		$this->set( 'auth_secret', $response->auth_secret );
	}

	protected function set_request_state() {
		$this->set( 'state', wp_generate_password( 12, false ) );
	}

	protected function print_popup_close_script( $url ) {
		?>
		<script>
			if ( opener && opener !== window ) {
				opener.jQuery( 'body' ).trigger( 'elementorConnected' );
				window.close();
				opener.focus();
			} else {
				location = '<?php echo $url; ?>';
			}
		</script>
		<?php
		die;
	}

	protected function disconnect() {
		// Try update the server, but not needed to handle errors.
		$this->request( 'disconnect' );

		$this->delete();
	}

	protected function get_site_key() {
		$site_key = get_option( 'elementor_connect_site_key' );

		if ( ! $site_key ) {
			$site_key = md5( uniqid( wp_generate_password() ) );
			update_option( 'elementor_connect_site_key', $site_key );
		}

		return $site_key;
	}

	public function __construct() {
		add_action( 'admin_notices', [ $this, 'admin_notice' ] );

		/**
		 * Allow extended apps to customize the __construct without call parent::__construct.
		 */
		$this->init();
	}
}
Elementor Code Reference
  • Code Reference
  • Elementor Hooks
    • PHP Hooks
    • JS Hooks
  • Elementor Classes
  • Elementor Methods
  • Elementor Functions
Developer Resources

Visit the official Developer Resources to learn how to extend Elementor.

Get Involved

Visit Elementor GitHub repository to contribute code or suggest new ideas.

  • Contact
  • About Us
  • Terms of Service
  • Privacy Policy
  • Template Library
  • Features
  • Theme Builder
  • Get Pro
Theme by Pojo.me
//Made in Elementor Page Builder
Enter your email and be the first to learn about new updates and features.
No thanks, I just want to download Elementor