first commit
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
namespace Elementor\App\Modules\KitLibrary\Connect;
|
||||
|
||||
use Elementor\Core\Common\Modules\Connect\Apps\Base_App;
|
||||
use Elementor\Core\Common\Modules\Connect\Apps\Library;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
class Kit_Library extends Library {
|
||||
const DEFAULT_BASE_ENDPOINT = 'https://my.elementor.com/api/v1/kits-library';
|
||||
const FALLBACK_BASE_ENDPOINT = 'https://ms-8874.elementor.com/api/v1/kits-library';
|
||||
|
||||
public function get_title() {
|
||||
return esc_html__( 'Kit Library', 'elementor' );
|
||||
}
|
||||
|
||||
public function get_all( $args = [] ) {
|
||||
return $this->http_request( 'GET', 'kits/plugin-version/' . ELEMENTOR_VERSION, $args );
|
||||
}
|
||||
|
||||
public function get_by_id( $id ) {
|
||||
return $this->http_request( 'GET', 'kits/' . $id );
|
||||
}
|
||||
|
||||
public function get_taxonomies() {
|
||||
return $this->http_request( 'GET', 'taxonomies' );
|
||||
}
|
||||
|
||||
public function get_manifest( $id ) {
|
||||
return $this->http_request( 'GET', "kits/{$id}/manifest" );
|
||||
}
|
||||
|
||||
public function download_link( $id ) {
|
||||
return $this->http_request( 'GET', "kits/{$id}/download-link" );
|
||||
}
|
||||
|
||||
protected function get_api_url() {
|
||||
return [
|
||||
static::DEFAULT_BASE_ENDPOINT,
|
||||
static::FALLBACK_BASE_ENDPOINT,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the connect information
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function get_connect_info() {
|
||||
$connect_info = $this->get_base_connect_info();
|
||||
|
||||
$additional_info = [];
|
||||
|
||||
// BC Support.
|
||||
$old_kit_library = new \Elementor\Core\App\Modules\KitLibrary\Connect\Kit_Library();
|
||||
|
||||
/**
|
||||
* Additional connect info.
|
||||
*
|
||||
* Filters the connection information when connecting to Elementor servers.
|
||||
* This hook can be used to add more information or add more data.
|
||||
*
|
||||
* @param array $additional_info Additional connecting information array.
|
||||
* @param Base_App $this The base app instance.
|
||||
*/
|
||||
$additional_info = apply_filters( 'elementor/connect/additional-connect-info', $additional_info, $old_kit_library );
|
||||
|
||||
return array_merge( $connect_info, $additional_info );
|
||||
}
|
||||
|
||||
protected function init() {
|
||||
// Remove parent init actions.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
namespace Elementor\App\Modules\KitLibrary\Data;
|
||||
|
||||
use Elementor\Plugin;
|
||||
use Elementor\Data\V2\Base\Controller;
|
||||
use Elementor\Core\Utils\Collection;
|
||||
use Elementor\Modules\Library\User_Favorites;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
abstract class Base_Controller extends Controller {
|
||||
/**
|
||||
* @var Repository
|
||||
*/
|
||||
private $repository;
|
||||
|
||||
/**
|
||||
* @return Repository
|
||||
*/
|
||||
public function get_repository() {
|
||||
if ( ! $this->repository ) {
|
||||
/** @var \Elementor\Core\Common\Modules\Connect\Module $connect */
|
||||
$connect = Plugin::$instance->common->get_component( 'connect' );
|
||||
|
||||
$subscription_plans = ( new Collection( $connect->get_subscription_plans() ) )
|
||||
->map( function ( $value ) {
|
||||
return $value['label'];
|
||||
} );
|
||||
|
||||
$this->repository = new Repository(
|
||||
$connect->get_app( 'kit-library' ),
|
||||
new User_Favorites( get_current_user_id() ),
|
||||
$subscription_plans
|
||||
);
|
||||
}
|
||||
|
||||
return $this->repository;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
namespace Elementor\App\Modules\KitLibrary\Data\Kits;
|
||||
|
||||
use Elementor\App\Modules\KitLibrary\Data\Base_Controller;
|
||||
use Elementor\Data\V2\Base\Exceptions\Error_404;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Controller extends Base_Controller {
|
||||
|
||||
public function get_name() {
|
||||
return 'kits';
|
||||
}
|
||||
|
||||
public function get_items( $request ) {
|
||||
$data = $this->get_repository()->get_all( $request->get_param( 'force' ) );
|
||||
|
||||
return [
|
||||
'data' => $data->values(),
|
||||
];
|
||||
}
|
||||
|
||||
public function get_item( $request ) {
|
||||
$data = $this->get_repository()->find( $request->get_param( 'id' ) );
|
||||
|
||||
if ( ! $data ) {
|
||||
return new Error_404( esc_html__( 'Kit not exists.', 'elementor' ), 'kit_not_exists' );
|
||||
}
|
||||
|
||||
return [
|
||||
'data' => $data,
|
||||
];
|
||||
}
|
||||
|
||||
public function get_collection_params() {
|
||||
return [
|
||||
'force' => [
|
||||
'description' => 'Force an API request and skip the cache.',
|
||||
'required' => false,
|
||||
'default' => false,
|
||||
'type' => 'boolean',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function register_endpoints() {
|
||||
$this->index_endpoint->register_item_route( \WP_REST_Server::READABLE, [
|
||||
'id' => [
|
||||
'description' => 'Unique identifier for the object.',
|
||||
'type' => 'string',
|
||||
'required' => true,
|
||||
],
|
||||
'id_arg_type_regex' => '[\w]+',
|
||||
] );
|
||||
|
||||
$this->register_endpoint( new Endpoints\Download_Link( $this ) );
|
||||
$this->register_endpoint( new Endpoints\Favorites( $this ) );
|
||||
}
|
||||
|
||||
public function get_permission_callback( $request ) {
|
||||
return current_user_can( 'administrator' );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
namespace Elementor\App\Modules\KitLibrary\Data\Kits\Endpoints;
|
||||
|
||||
use Elementor\Data\V2\Base\Endpoint;
|
||||
use Elementor\App\Modules\KitLibrary\Data\Kits\Controller;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
/**
|
||||
* @property Controller $controller
|
||||
*/
|
||||
class Download_Link extends Endpoint {
|
||||
public function get_name() {
|
||||
return 'download-link';
|
||||
}
|
||||
|
||||
public function get_format() {
|
||||
return 'kits/download-link/{id}';
|
||||
}
|
||||
|
||||
protected function register() {
|
||||
$this->register_item_route( \WP_REST_Server::READABLE, [
|
||||
'id_arg_type_regex' => '[\w]+',
|
||||
] );
|
||||
}
|
||||
|
||||
public function get_item( $id, $request ) {
|
||||
$repository = $this->controller->get_repository();
|
||||
$data = $repository->get_download_link( $id );
|
||||
|
||||
return [
|
||||
'data' => $data,
|
||||
'meta' => [
|
||||
'nonce' => wp_create_nonce( 'kit-library-import' ),
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
namespace Elementor\App\Modules\KitLibrary\Data\Kits\Endpoints;
|
||||
|
||||
use Elementor\App\Modules\KitLibrary\Data\Kits\Controller;
|
||||
use Elementor\Data\V2\Base\Endpoint;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
/**
|
||||
* @property Controller $controller
|
||||
*/
|
||||
class Favorites extends Endpoint {
|
||||
public function get_name() {
|
||||
return 'favorites';
|
||||
}
|
||||
|
||||
public function get_format() {
|
||||
return 'kits/favorites/{id}';
|
||||
}
|
||||
|
||||
protected function register() {
|
||||
$args = [
|
||||
'id_arg_type_regex' => '[\w]+',
|
||||
];
|
||||
|
||||
$this->register_item_route( \WP_REST_Server::CREATABLE, $args );
|
||||
$this->register_item_route( \WP_REST_Server::DELETABLE, $args );
|
||||
}
|
||||
|
||||
public function create_item( $id, $request ) {
|
||||
$repository = $this->controller->get_repository();
|
||||
$kit = $repository->add_to_favorites( $id );
|
||||
|
||||
return [
|
||||
'data' => $kit,
|
||||
];
|
||||
}
|
||||
|
||||
public function delete_item( $id, $request ) {
|
||||
$repository = $this->controller->get_repository();
|
||||
|
||||
$kit = $repository->remove_from_favorites( $id );
|
||||
|
||||
return [
|
||||
'data' => $kit,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,339 @@
|
||||
<?php
|
||||
namespace Elementor\App\Modules\KitLibrary\Data;
|
||||
|
||||
use Elementor\Core\Common\Modules\Connect\Module as ConnectModule;
|
||||
use Elementor\Core\Utils\Collection;
|
||||
use Elementor\Data\V2\Base\Exceptions\Error_404;
|
||||
use Elementor\Data\V2\Base\Exceptions\WP_Error_Exception;
|
||||
use Elementor\Modules\Library\User_Favorites;
|
||||
use Elementor\App\Modules\KitLibrary\Connect\Kit_Library;
|
||||
use Elementor\Plugin;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Repository {
|
||||
/**
|
||||
* There is no label for subscription plan with access_level=0 + it should not
|
||||
* be translated.
|
||||
*/
|
||||
const SUBSCRIPTION_PLAN_FREE_TAG = 'Free';
|
||||
|
||||
const TAXONOMIES_KEYS = [ 'tags', 'categories', 'main_category', 'third_category', 'features', 'types' ];
|
||||
|
||||
const KITS_CACHE_KEY = 'elementor_remote_kits';
|
||||
const KITS_TAXONOMIES_CACHE_KEY = 'elementor_remote_kits_taxonomies';
|
||||
|
||||
const KITS_CACHE_TTL_HOURS = 12;
|
||||
const KITS_TAXONOMIES_CACHE_TTL_HOURS = 12;
|
||||
|
||||
/**
|
||||
* @var Kit_Library
|
||||
*/
|
||||
protected $api;
|
||||
|
||||
/**
|
||||
* @var User_Favorites
|
||||
*/
|
||||
protected $user_favorites;
|
||||
|
||||
/**
|
||||
* @var Collection
|
||||
*/
|
||||
protected $subscription_plans;
|
||||
|
||||
/**
|
||||
* Get all kits.
|
||||
*
|
||||
* @param false $force_api_request
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
public function get_all( $force_api_request = false ) {
|
||||
return $this->get_kits_data( $force_api_request )
|
||||
->map( function ( $kit ) {
|
||||
return $this->transform_kit_api_response( $kit );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get specific kit.
|
||||
*
|
||||
* @param $id
|
||||
* @param array $options
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
public function find( $id, $options = [] ) {
|
||||
$options = wp_parse_args( $options, [
|
||||
'manifest_included' => true,
|
||||
] );
|
||||
|
||||
$item = $this->get_kits_data()
|
||||
->find( function ( $kit ) use ( $id ) {
|
||||
return $kit->_id === $id;
|
||||
} );
|
||||
|
||||
if ( ! $item ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$manifest = null;
|
||||
|
||||
if ( $options['manifest_included'] ) {
|
||||
$manifest = $this->api->get_manifest( $id );
|
||||
|
||||
if ( is_wp_error( $manifest ) ) {
|
||||
throw new WP_Error_Exception( $manifest );
|
||||
}
|
||||
}
|
||||
|
||||
return $this->transform_kit_api_response( $item, $manifest );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param false $force_api_request
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
public function get_taxonomies( $force_api_request = false ) {
|
||||
return $this->get_taxonomies_data( $force_api_request )
|
||||
->only( static::TAXONOMIES_KEYS )
|
||||
->reduce( function ( Collection $carry, $taxonomies, $type ) {
|
||||
return $carry->merge( array_map( function ( $taxonomy ) use ( $type ) {
|
||||
return [
|
||||
'text' => $taxonomy->name,
|
||||
'type' => $type,
|
||||
];
|
||||
}, $taxonomies ) );
|
||||
}, new Collection( [] ) )
|
||||
->merge(
|
||||
$this->subscription_plans->map( function ( $label ) {
|
||||
return [
|
||||
'text' => $label ? $label : self::SUBSCRIPTION_PLAN_FREE_TAG,
|
||||
'type' => 'subscription_plans',
|
||||
];
|
||||
} )
|
||||
)
|
||||
->unique( [ 'text', 'type' ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $id
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function get_download_link( $id ) {
|
||||
$response = $this->api->download_link( $id );
|
||||
|
||||
if ( is_wp_error( $response ) ) {
|
||||
throw new WP_Error_Exception( $response );
|
||||
}
|
||||
|
||||
return [ 'download_link' => $response->download_link ];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $id
|
||||
*
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function add_to_favorites( $id ) {
|
||||
$kit = $this->find( $id, [ 'manifest_included' => false ] );
|
||||
|
||||
if ( ! $kit ) {
|
||||
throw new Error_404( esc_html__( 'Kit not found', 'elementor' ), 'kit_not_found' );
|
||||
}
|
||||
|
||||
$this->user_favorites->add( 'elementor', 'kits', $kit['id'] );
|
||||
|
||||
$kit['is_favorite'] = true;
|
||||
|
||||
return $kit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $id
|
||||
*
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function remove_from_favorites( $id ) {
|
||||
$kit = $this->find( $id, [ 'manifest_included' => false ] );
|
||||
|
||||
if ( ! $kit ) {
|
||||
throw new Error_404( esc_html__( 'Kit not found', 'elementor' ), 'kit_not_found' );
|
||||
}
|
||||
|
||||
$this->user_favorites->remove( 'elementor', 'kits', $kit['id'] );
|
||||
|
||||
$kit['is_favorite'] = false;
|
||||
|
||||
return $kit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $force_api_request
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
private function get_kits_data( $force_api_request = false ) {
|
||||
$data = get_transient( static::KITS_CACHE_KEY );
|
||||
|
||||
$experiments_manager = Plugin::$instance->experiments;
|
||||
$kits_editor_layout_type = $experiments_manager->is_feature_active( 'container' ) ? 'container_flexbox' : '';
|
||||
|
||||
if ( ! $data || $force_api_request ) {
|
||||
$args = [
|
||||
'body' => [
|
||||
'editor_layout_type' => $kits_editor_layout_type,
|
||||
],
|
||||
];
|
||||
|
||||
/**
|
||||
* Filters arguments for the request to the Kits API.
|
||||
*
|
||||
* @since 3.11.0
|
||||
*
|
||||
* @param array[] $args Array of http arguments.
|
||||
*/
|
||||
$args = apply_filters( 'elementor/kit-library/get-kits-data/args', $args );
|
||||
|
||||
$data = $this->api->get_all( $args );
|
||||
|
||||
if ( is_wp_error( $data ) ) {
|
||||
throw new WP_Error_Exception( $data );
|
||||
}
|
||||
|
||||
set_transient( static::KITS_CACHE_KEY, $data, static::KITS_CACHE_TTL_HOURS * HOUR_IN_SECONDS );
|
||||
}
|
||||
|
||||
return new Collection( $data );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $force_api_request
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
private function get_taxonomies_data( $force_api_request = false ) {
|
||||
$data = get_transient( static::KITS_TAXONOMIES_CACHE_KEY );
|
||||
|
||||
if ( ! $data || $force_api_request ) {
|
||||
$data = $this->api->get_taxonomies();
|
||||
|
||||
if ( is_wp_error( $data ) ) {
|
||||
throw new WP_Error_Exception( $data );
|
||||
}
|
||||
|
||||
set_transient( static::KITS_TAXONOMIES_CACHE_KEY, $data, static::KITS_TAXONOMIES_CACHE_TTL_HOURS * HOUR_IN_SECONDS );
|
||||
}
|
||||
|
||||
return new Collection( (array) $data );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $kit
|
||||
* @param null $manifest
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function transform_kit_api_response( $kit, $manifest = null ) {
|
||||
// BC: Support legacy APIs that don't have access tiers.
|
||||
if ( isset( $kit->access_tier ) ) {
|
||||
$access_tier = $kit->access_tier;
|
||||
} else {
|
||||
$access_tier = 0 === $kit->access_level
|
||||
? ConnectModule::ACCESS_TIER_FREE
|
||||
: ConnectModule::ACCESS_TIER_ESSENTIAL;
|
||||
}
|
||||
|
||||
$subscription_plan_tag = $this->subscription_plans->get( $access_tier );
|
||||
|
||||
$taxonomies = ( new Collection( ( (array) $kit )['taxonomies'] ) )
|
||||
->filter( function ( $taxonomy ) {
|
||||
return in_array( $taxonomy->type, self::TAXONOMIES_KEYS );
|
||||
} )
|
||||
->flatten()
|
||||
->pluck( 'name' )
|
||||
->push( $subscription_plan_tag ? $subscription_plan_tag : self::SUBSCRIPTION_PLAN_FREE_TAG );
|
||||
|
||||
return array_merge(
|
||||
[
|
||||
'id' => $kit->_id,
|
||||
'title' => $kit->title,
|
||||
'thumbnail_url' => $kit->thumbnail,
|
||||
'access_level' => $kit->access_level,
|
||||
'access_tier' => $access_tier,
|
||||
'keywords' => $kit->keywords,
|
||||
'taxonomies' => $taxonomies->values(),
|
||||
'is_favorite' => $this->user_favorites->exists( 'elementor', 'kits', $kit->_id ),
|
||||
// TODO: Remove all the isset when the API stable.
|
||||
'trend_index' => isset( $kit->trend_index ) ? $kit->trend_index : 0,
|
||||
'featured_index' => isset( $kit->featured_index ) ? $kit->featured_index : 0,
|
||||
'popularity_index' => isset( $kit->popularity_index ) ? $kit->popularity_index : 0,
|
||||
'created_at' => isset( $kit->created_at ) ? $kit->created_at : null,
|
||||
'updated_at' => isset( $kit->updated_at ) ? $kit->updated_at : null,
|
||||
//
|
||||
],
|
||||
$manifest ? $this->transform_manifest_api_response( $manifest ) : []
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $manifest
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function transform_manifest_api_response( $manifest ) {
|
||||
$manifest_content = ( new Collection( (array) $manifest->content ) )
|
||||
->reduce( function ( $carry, $content, $type ) {
|
||||
$mapped_documents = array_map( function ( $document ) use ( $type ) {
|
||||
// TODO: Fix it!
|
||||
// Hack to override a bug when a document with type of 'wp-page' is declared as 'wp-post'.
|
||||
if ( 'page' === $type ) {
|
||||
$document->doc_type = 'wp-page';
|
||||
}
|
||||
|
||||
return $document;
|
||||
}, (array) $content );
|
||||
|
||||
return $carry + $mapped_documents;
|
||||
}, [] );
|
||||
|
||||
$content = ( new Collection( (array) $manifest->templates ) )
|
||||
->union( $manifest_content )
|
||||
->map( function ( $manifest_item, $key ) {
|
||||
return [
|
||||
'id' => isset( $manifest_item->id ) ? $manifest_item->id : $key,
|
||||
'title' => $manifest_item->title,
|
||||
'doc_type' => $manifest_item->doc_type,
|
||||
'thumbnail_url' => $manifest_item->thumbnail,
|
||||
'preview_url' => isset( $manifest_item->url ) ? $manifest_item->url : null,
|
||||
];
|
||||
} );
|
||||
|
||||
return [
|
||||
'description' => $manifest->description,
|
||||
'preview_url' => isset( $manifest->site ) ? $manifest->site : '',
|
||||
'documents' => $content->values(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Kit_Library $kit_library
|
||||
* @param User_Favorites $user_favorites
|
||||
* @param Collection $subscription_plans
|
||||
*/
|
||||
public function __construct( Kit_Library $kit_library, User_Favorites $user_favorites, Collection $subscription_plans ) {
|
||||
$this->api = $kit_library;
|
||||
$this->user_favorites = $user_favorites;
|
||||
$this->subscription_plans = $subscription_plans;
|
||||
}
|
||||
|
||||
public static function clear_cache() {
|
||||
delete_transient( static::KITS_CACHE_KEY );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
namespace Elementor\App\Modules\KitLibrary\Data\Taxonomies;
|
||||
|
||||
use Elementor\App\Modules\KitLibrary\Data\Base_Controller;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Controller extends Base_Controller {
|
||||
|
||||
public function get_name() {
|
||||
return 'kit-taxonomies';
|
||||
}
|
||||
|
||||
public function get_collection_params() {
|
||||
return [
|
||||
'force' => [
|
||||
'description' => 'Force an API request and skip the cache.',
|
||||
'required' => false,
|
||||
'default' => false,
|
||||
'type' => 'boolean',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function get_items( $request ) {
|
||||
$data = $this->get_repository()->get_taxonomies( $request->get_param( 'force' ) );
|
||||
|
||||
return [
|
||||
'data' => $data->values(),
|
||||
];
|
||||
}
|
||||
|
||||
public function get_permission_callback( $request ) {
|
||||
return current_user_can( 'administrator' );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
namespace Elementor\App\Modules\KitLibrary;
|
||||
|
||||
use Elementor\Core\Admin\Menu\Interfaces\Admin_Menu_Item;
|
||||
use Elementor\TemplateLibrary\Source_Local;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Kit_Library_Menu_Item implements Admin_Menu_Item {
|
||||
|
||||
public function is_visible() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function get_parent_slug() {
|
||||
return Source_Local::ADMIN_MENU_SLUG;
|
||||
}
|
||||
|
||||
public function get_label() {
|
||||
return esc_html__( 'Kit Library', 'elementor' );
|
||||
}
|
||||
|
||||
public function get_capability() {
|
||||
return 'manage_options';
|
||||
}
|
||||
}
|
||||
117
wp-content/plugins/elementor/app/modules/kit-library/module.php
Normal file
117
wp-content/plugins/elementor/app/modules/kit-library/module.php
Normal file
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
namespace Elementor\App\Modules\KitLibrary;
|
||||
|
||||
use Elementor\App\Modules\KitLibrary\Data\Repository;
|
||||
use Elementor\Core\Admin\Menu\Admin_Menu_Manager;
|
||||
use Elementor\Core\Admin\Menu\Main as MainMenu;
|
||||
use Elementor\Plugin;
|
||||
use Elementor\TemplateLibrary\Source_Local;
|
||||
use Elementor\Core\Base\Module as BaseModule;
|
||||
use Elementor\App\Modules\KitLibrary\Connect\Kit_Library;
|
||||
use Elementor\Core\Common\Modules\Connect\Module as ConnectModule;
|
||||
use Elementor\App\Modules\KitLibrary\Data\Kits\Controller as Kits_Controller;
|
||||
use Elementor\App\Modules\KitLibrary\Data\Taxonomies\Controller as Taxonomies_Controller;
|
||||
use Elementor\Core\Utils\Promotions\Filtered_Promotions_Manager;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
class Module extends BaseModule {
|
||||
/**
|
||||
* Get name.
|
||||
*
|
||||
* @access public
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_name() {
|
||||
return 'kit-library';
|
||||
}
|
||||
|
||||
private function register_admin_menu( MainMenu $menu ) {
|
||||
$menu->add_submenu( [
|
||||
'page_title' => esc_html__( 'Kit Library', 'elementor' ),
|
||||
'menu_title' => '<span id="e-admin-menu__kit-library">' . esc_html__( 'Kit Library', 'elementor' ) . '</span>',
|
||||
'menu_slug' => Plugin::$instance->app->get_base_url() . '#/kit-library',
|
||||
'index' => 40,
|
||||
] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the admin menu the old way.
|
||||
*/
|
||||
private function register_admin_menu_legacy( Admin_Menu_Manager $admin_menu ) {
|
||||
$admin_menu->register(
|
||||
Plugin::$instance->app->get_base_url() . '#/kit-library',
|
||||
new Kit_Library_Menu_Item()
|
||||
);
|
||||
}
|
||||
|
||||
private function set_kit_library_settings() {
|
||||
if ( ! Plugin::$instance->common ) {
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var ConnectModule $connect */
|
||||
$connect = Plugin::$instance->common->get_component( 'connect' );
|
||||
|
||||
/** @var Kit_Library $kit_library */
|
||||
$kit_library = $connect->get_app( 'kit-library' );
|
||||
|
||||
Plugin::$instance->app->set_settings( 'kit-library', [
|
||||
'has_access_to_module' => current_user_can( 'administrator' ),
|
||||
'subscription_plans' => $this->apply_filter_subscription_plans( $connect->get_subscription_plans( 'kit-library' ) ),
|
||||
'is_pro' => false,
|
||||
'is_library_connected' => $kit_library->is_connected(),
|
||||
'library_connect_url' => $kit_library->get_admin_url( 'authorize', [
|
||||
'utm_source' => 'kit-library',
|
||||
'utm_medium' => 'wp-dash',
|
||||
'utm_campaign' => 'library-connect',
|
||||
'utm_term' => '%%page%%', // Will be replaced in the frontend.
|
||||
] ),
|
||||
'access_level' => ConnectModule::ACCESS_LEVEL_CORE,
|
||||
'access_tier' => ConnectModule::ACCESS_TIER_FREE,
|
||||
'app_url' => Plugin::$instance->app->get_base_url() . '#/' . $this->get_name(),
|
||||
] );
|
||||
}
|
||||
|
||||
private function apply_filter_subscription_plans( array $subscription_plans ): array {
|
||||
foreach ( $subscription_plans as $key => $plan ) {
|
||||
if ( null === $plan['promotion_url'] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$subscription_plans[ $key ] = Filtered_Promotions_Manager::get_filtered_promotion_data(
|
||||
$plan,
|
||||
'elementor/kit_library/' . $key . '/promotion',
|
||||
'promotion_url'
|
||||
);
|
||||
}
|
||||
|
||||
return $subscription_plans;
|
||||
}
|
||||
|
||||
/**
|
||||
* Module constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
Plugin::$instance->data_manager_v2->register_controller( new Kits_Controller() );
|
||||
Plugin::$instance->data_manager_v2->register_controller( new Taxonomies_Controller() );
|
||||
|
||||
// Assigning this action here since the repository is being loaded by demand.
|
||||
add_action( 'elementor/experiments/feature-state-change/container', [ Repository::class, 'clear_cache' ], 10, 0 );
|
||||
|
||||
add_action( 'elementor/admin/menu/register', function( Admin_Menu_Manager $admin_menu ) {
|
||||
$this->register_admin_menu_legacy( $admin_menu );
|
||||
}, Source_Local::ADMIN_MENU_PRIORITY + 30 );
|
||||
|
||||
add_action( 'elementor/connect/apps/register', function ( ConnectModule $connect_module ) {
|
||||
$connect_module->register_app( 'kit-library', Kit_Library::get_class_name() );
|
||||
} );
|
||||
|
||||
add_action( 'elementor/init', function () {
|
||||
$this->set_kit_library_settings();
|
||||
}, 12 /** after the initiation of the connect kit library */ );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user