{
return true;
}
/**
* Mark template as favorite.
*
* Add the template to the user favorite templates.
*
* @since 1.9.0
* @access public
*
* @param array $args Template arguments.
*
* @return mixed Whether the template marked as favorite.
*/
public function mark_template_as_favorite( $args ) {
$validate_args = $this->ensure_args( [ 'source', 'template_id', 'favorite' ], $args );
if ( is_wp_error( $validate_args ) ) {
return $validate_args;
}
$source = $this->get_source( $args['source'] );
return $source->mark_as_favorite( $args['template_id'], filter_var( $args['favorite'], FILTER_VALIDATE_BOOLEAN ) );
}
public function import_from_json( array $args ) {
$validate_args = $this->ensure_args( [ 'editor_post_id', 'elements' ], $args );
if ( is_wp_error( $validate_args ) ) {
return $validate_args;
}
$elements = json_decode( $args['elements'], true );
$document = Plugin::$instance->documents->get( $args['editor_post_id'] );
if ( ! $document ) {
return new \WP_Error( 'template_error', 'Document not found.' );
}
$import_data = $document->get_import_data( [ 'content' => $elements ] );
return $import_data['content'];
}
/**
* Register default template sources.
*
* Register the 'local' and 'remote' template sources that Elementor use by
* default.
*
* @since 1.0.0
* @access private
*/
private function register_default_sources() {
$sources = [
'local',
'remote',
];
foreach ( $sources as $source_filename ) {
$class_name = ucwords( $source_filename );
$class_name = str_replace( '-', '_', $class_name );
$this->register_source( __NAMESPACE__ . '\Source_' . $class_name );
}
}
/**
* Handle ajax request.
*
* Fire authenticated ajax actions for any given ajax request.
*
* @since 1.0.0
* @access private
*
* @param string $ajax_request Ajax request.
*
* @param array $data
*
* @return mixed
* @throws \Exception
*/
private function handle_ajax_request( $ajax_request, array $data ) {
if ( ! User::is_current_user_can_edit_post_type( Source_Local::CPT ) ) {
throw new \Exception( 'Access denied.' );
}
if ( ! empty( $data['editor_post_id'] ) ) {
$editor_post_id = absint( $data['editor_post_id'] );
if ( ! get_post( $editor_post_id ) ) {
throw new \Exception( 'Post not found.' );
}
Plugin::$instance->db->switch_to_post( $editor_post_id );
}
$result = call_user_func( [ $this, $ajax_request ], $data );
if ( is_wp_error( $result ) ) {
throw new \Exception( $result->get_error_message() );
}
return $result;
}
/**
* Init ajax calls.
*
* Initialize template library ajax calls for allowed ajax requests.
*
* @since 2.3.0
* @access public
*
* @param Ajax $ajax
*/
public function register_ajax_actions( Ajax $ajax ) {
$library_ajax_requests = [
'get_library_data',
'get_template_data',
'save_template',
'update_templates',
'delete_template',
'import_template',
'mark_template_as_favorite',
'import_from_json',
];
foreach ( $library_ajax_requests as $ajax_request ) {
$ajax->register_ajax_action( $ajax_request, function( $data ) use ( $ajax_request ) {
return $this->handle_ajax_request( $ajax_request, $data );
} );
}
}
/**
* @since 2.3.0
* @access public
*/
public function handle_direct_actions() {
if ( ! User::is_current_user_can_edit_post_type( Source_Local::CPT ) ) {
return;
}
/** @var Ajax $ajax */
$ajax = Plugin::$instance->common->get_component( 'ajax' );
if ( ! $ajax->verify_request_nonce() ) {
$this->handle_direct_action_error( 'Access Denied' );
}
$action = Utils::get_super_global_value( $_REQUEST, 'library_action' ); // phpcs:ignore -- Nonce already verified.
$result = $this->$action( $_REQUEST ); // phpcs:ignore -- Nonce already verified.
if ( is_wp_error( $result ) ) {
/** @var \WP_Error $result */
$this->handle_direct_action_error( $result->get_error_message() . '.' );
}
$callback = "on_{$action}_success";
if ( method_exists( $this, $callback ) ) {
$this->$callback( $result );
}
die;
}
/**
* On successful template import.
*
* Redirect the user to the template library after template import was
* successful finished.
*
* @since 2.3.0
* @access private
*/
private function on_direct_import_template_success() {
wp_safe_redirect( admin_url( Source_Local::ADMIN_MENU_SLUG ) );
}
/**
* @since 2.3.0
* @access private
*/
private function handle_direct_action_error( $message ) {
_default_wp_die_handler( $message, 'Elementor Library' );
}
/**
* Ensure arguments exist.
*
* Checks whether the required arguments exist in the specified arguments.
*
* @since 1.0.0
* @access private
*
* @param array $required_args Required arguments to check whether they
* exist.
* @param array $specified_args The list of all the specified arguments to
* check against.
*
* @return \WP_Error|true True on success, 'WP_Error' otherwise.
*/
private function ensure_args( array $required_args, array $specified_args ) {
$not_specified_args = array_diff( $required_args, array_keys( $specified_args ) );
if ( $not_specified_args ) {
return new \WP_Error( 'arguments_not_specified', sprintf( 'The required argument(s) "%s" not specified.', implode( ', ', $not_specified_args ) ) );
}
return true;
}
}