post( 'insert', [ $this, 'insert_template' ] ); $this->post( $this->endpoint, [ $this, 'import_in_library' ] ); $this->post( $this->endpoint . '/page', [ $this, 'import_as_page' ] ); } public function insert_template() { // A fatal mid-insert (broken template data, dependency plugin code) would // otherwise reach the client as an unparseable blank 500 — capture it. FatalGuard::arm( 'single-import/insert' ); $platform = $this->get_param( 'platform', 'elementor' ); $origin = $this->get_param( 'origin', 'remote' ); $id = $this->get_param( 'id', 0, 'intval' ); $postId = $this->get_param( 'postId', 0, 'intval' ); $settings = $this->get_param( 'settings', [], null ); if( $id <= 0 || $id == null ) { return $this->error('invalid_item_id', __( 'Invalid ID is provided.', 'templately' ), 'get_content', 404 ); } if($platform === 'elementor') { if(Helper::enable_elementor_container()) { return $this->error( 'retry_again', __( 'Please try again we enabled container.', 'templately' ), 'insert', 404 ); } } @set_time_limit( 0 ); // Unlimited execution time for this request. Utils::add_gd_editor_filter(); switch ( $origin ) { case 'cloud': $template_data = $this->get_cloud_content( $id, $platform ); break; case 'remote': $template_data = $this->get_remote_content( $id ); break; case 'local': default: $template_data = $this->get_local_content( $id, $platform ); $template_data = isset( $template_data['data'] ) ? $template_data['data'] : []; break; } /** * A fallback for old cloud items. */ $template_data = is_string( $template_data ) ? json_decode( wp_unslash($template_data), true ) : $template_data; if( is_wp_error( $template_data ) ) { return $template_data; } if( empty( $template_data ) || ! is_array( $template_data ) || empty( $template_data['content'] ) ) { return $this->error( 'invalid_template_data', __( 'Template data is invalid. Please kindly contact Templately Support.', 'templately' ), 'insert', 404 ); } return $this->platform( $platform )->insert( $template_data, $postId, $settings ); } private function get_cloud_content( $id = null, $platform = 'elementor' ){ $response = $this->http()->query( 'myCloudInsert', '', [ 'api_key' => $this->api_key, 'file_id' => $id, 'file_type' => $platform ] )->post(); if( is_wp_error( $response ) ) { // FIXME: need to return an error with handler in react app return $this->error( 'invalid_data', $response->get_error_message(), 'get_cloud_content', 404 ); } return is_string( $response ) ? json_decode( $response, true ) : $response; } private function get_remote_content( $id = null ){ $response = $this->http()->query( 'itemContent', 'status, message, data', [ 'api_key' => $this->api_key, 'id' => $id ] )->post(); if( is_wp_error( $response ) ) { // FIXME: need to return an error with handler in react app return $this->error( 'invalid_data', $response->get_error_message(), 'get_remote_content', 404 ); } if( isset( $response['status'] ) && $response['status'] === 'error' ) { return $this->error( 'invalid_data', $response['message'], 'get_content', 404 ); } if( isset( $response['status'] ) && $response['status'] === 'required-pro-acc' ) { return $this->error( 'required_pro_templately', $response['message'], 'get_remote_content', 404 ); } // The app can now report that a template's file could not be loaded // (docs/ai-editor/plugin-instructions.md §0). There is NO `data` on this status — // check status before reading data, surface the app's message, and // abandon the insert (no auto-retry: a missing file stays missing). if( isset( $response['status'] ) && $response['status'] === 'content-unavailable' ) { $message = ! empty( $response['message'] ) ? $response['message'] : __( 'This template’s file could not be loaded. Please try again, and contact support if it keeps happening.', 'templately' ); return $this->error( 'content_unavailable', $message, 'get_remote_content', 404 ); } if( ! empty( $response[ 'data' ] ) && is_string( $response[ 'data' ] ) ) { $data = json_decode( $response[ 'data' ], true ); } else { $data = isset( $response[ 'data' ] ) ? (array) $response[ 'data' ] : []; } return $data; } private function get_local_content( $id = null, $platform = 'elementor' ){ /** * @var \Templately\Modules\ElementorIntegration\Platform\Elementor $platformInstance */ $platformInstance = $this->platform( $platform ); $response = $platformInstance->get_content( $id ); if( isset( $response['status'] ) && $response['status'] === 'error' ) { return $this->error( 'invalid_data', $response['message'], 'get_local_content', 404 ); } return $response; } public function get_content ( $id = null, $platform = 'elementor', $origin = 'remote' ) { switch ( $origin ) { case 'cloud': $template_data = $this->get_cloud_content( $id, $platform ); break; case 'remote': $template_data = $this->get_remote_content( $id ); break; case 'local': default: $template_data = $this->get_local_content( $id, $platform ); break; } return $template_data; } public function import_in_library(){ FatalGuard::arm( 'single-import/library' ); $platform = $this->get_param( 'platform', 'elementor' ); $id = $this->get_param( 'id', 0, 'intval' ); $settings = $this->get_param( 'settings', [], null ); $template_type = $this->get_param( 'template_type', '', 'sanitize_text_field' ); $type = $this->get_param( 'type', '', 'sanitize_text_field' ); if( $id == 0 ) { return $this->error('invalid_item_id', __( 'Invalid ID is provided.', 'templately' ), 'import/page', 404 ); } if($platform === 'elementor') { if(Helper::enable_elementor_container()) { return $this->error( 'retry_again', __( 'Please try again we enabled container.', 'templately' ), 'insert', 404 ); } } @set_time_limit( 0 ); // Unlimited execution time for this request. Utils::add_gd_editor_filter(); return $this->platform( $platform )->import_in_library( $id, $this, $settings, $template_type, $type ); } public function import_as_page(){ FatalGuard::arm( 'single-import/page' ); $platform = $this->get_param( 'platform', 'elementor' ); $id = $this->get_param( 'id', 0, 'intval' ); $title = $this->get_param( 'title' ); $settings = $this->get_param( 'settings', [], null ); if( $id == 0 ) { return $this->error('invalid_item_id', __( 'Invalid ID is provided.', 'templately' ), 'import/page', 404 ); } if($platform === 'elementor') { if(Helper::enable_elementor_container()) { return $this->error( 'retry_again', __( 'Please try again we enabled container.', 'templately' ), 'insert', 404 ); } } @set_time_limit( 0 ); // Unlimited execution time for this request. Utils::add_gd_editor_filter(); return $this->platform( $platform )->create_page( $id, $title, $this, $settings ); } }