$timeout, 'body' => [ // Which API version is used. 'api_version' => ELEMENTOR_VERSION, // Which language to return. 'site_lang' => get_bloginfo( 'language' ), ], ] ); if ( is_wp_error( $response ) || 200 !== (int) wp_remote_retrieve_response_code( $response ) ) { set_transient( $cache_key, [], 2 * HOUR_IN_SECONDS ); return false; } $info_data = json_decode( wp_remote_retrieve_body( $response ), true ); if ( empty( $info_data ) || ! is_array( $info_data ) ) { set_transient( $cache_key, [], 2 * HOUR_IN_SECONDS ); return false; } if ( isset( $info_data['templates'] ) ) { update_option( 'elementor_remote_info_templates_data', $info_data['templates'], 'no' ); unset( $info_data['templates'] ); } if ( isset( $info_data['feed'] ) ) { update_option( 'elementor_remote_info_feed_data', $info_data['feed'], 'no' ); unset( $info_data['feed'] ); } set_transient( $cache_key, $info_data, 12 * HOUR_IN_SECONDS ); } return $info_data; } /** * Get upgrade notice. * * Retrieve the upgrade notice if one exists, or false otherwise. * * @since 1.0.0 * @access public * @static * * @return array|false Upgrade notice, or false none exist. */ public static function get_upgrade_notice() { $data = self::_get_info_data(); if ( empty( $data['upgrade_notice'] ) ) { return false; } return $data['upgrade_notice']; } /** * Get templates data. * * Retrieve the templates data from a remote server. * * @since 1.0.0 * @access public * @static * * @param bool $force_update Optional. Whether to force the data update or * not. Default is false. * * @return array The templates data. */ public static function get_templates_data( $force_update = false ) { self::_get_info_data( $force_update ); $templates = get_option( 'elementor_remote_info_templates_data' ); if ( empty( $templates ) ) { return []; } return $templates; } /** * @since 1.9.0 * @static * @access public */ public static function get_feed_data( $force_update = false ) { self::_get_info_data( $force_update ); $feed = get_option( 'elementor_remote_info_feed_data' ); if ( empty( $feed ) ) { return []; } return $feed; } /** * Get template content. * * Retrieve the templates content recieved from a remote server. * * @since 1.0.0 * @access public * @static * * @param int $template_id The template ID. * * @return array The template content. */ public static function get_template_content( $template_id ) { $url = sprintf( self::$api_get_template_content_url, $template_id ); $body_args = [ // Which API version is used. 'api_version' => ELEMENTOR_VERSION, // Which language to return. 'site_lang' => get_bloginfo( 'language' ), ]; /** * API: Template body args. * * Filters the body arguments send with the GET request when fetching the content. * * @since 1.0.0 * * @param array $body_args Body arguments. */ $body_args = apply_filters( 'elementor/api/get_templates/body_args', $body_args ); $response = wp_remote_get( $url, [ 'timeout' => 40, 'body' => $body_args, ] ); if ( is_wp_error( $response ) ) { return $response; } $response_code = (int) wp_remote_retrieve_response_code( $response ); if ( 200 !== $response_code ) { return new \WP_Error( 'response_code_error', 'The request returned with a status code of ' . $response_code ); } $template_content = json_decode( wp_remote_retrieve_body( $response ), true ); if ( isset( $template_content['error'] ) ) { return new \WP_Error( 'response_error', $template_content['error'] ); } if ( empty( $template_content['data'] ) && empty( $template_content['content'] ) ) { return new \WP_Error( 'template_data_error', 'An invalid data was returned' ); } return $template_content; } /** * Send Feedback. * * Fires a request to Elementor server with the feedback data. * * @since 1.0.0 * @access public * @static * * @param string $feedback_key Feedback key. * @param string $feedback_text Feedback text. * * @return array The response of the request. */ public static function send_feedback( $feedback_key, $feedback_text ) { return wp_remote_post( self::$api_feedback_url, [ 'timeout' => 30, 'body' => [ 'api_version' => ELEMENTOR_VERSION, 'site_lang' => get_bloginfo( 'language' ), 'feedback_key' => $feedback_key, 'feedback' => $feedback_text, ], ] ); } /** * Ajax reset API data. * * Reset Elementor library API data using an ajax call. * * @since 1.0.0 * @access public * @static */ public static function ajax_reset_api_data() { check_ajax_referer( 'elementor_reset_library', '_nonce' ); self::_get_info_data( true ); wp_send_json_success(); } /** * Init. * * Initialize Elementor API. * * @since 1.0.0 * @access public * @static */ public static function init() { add_action( 'wp_ajax_elementor_reset_library', [ __CLASS__, 'ajax_reset_api_data' ] ); } }