????
Current Path : /home/webcloude/public_html/wp-content/plugins/templately/includes/API/ |
Current File : //home/webcloude/public_html/wp-content/plugins/templately/includes/API/Items.php |
<?php namespace Templately\API; use WP_REST_Request; use Templately\Utils\Database; use function json_decode; class Items extends API { public function permission_check( WP_REST_Request $request ) { $this->request = $request; $_route = $request->get_route(); if( $_route === '/templately/v1/items/favourite' || $_route === '/templately/v1/items/rating' ) { return parent::permission_check( $request ); } return true; } public function register_routes() { $this->get( 'items', [ $this, 'get_items' ], [ 'type' => [ 'default' => 'items', 'required' => false, // 'validate_callback' => function( $param, $request, $key ){ // return in_array( $param, [ 'items', 'sections', 'blocks', 'packs', 'pages' ], true ); // } ], 'platform' => [ 'default' => 'elementor', 'required' => false ], 'per_page' => [ 'default' => 40, 'required' => false ], ] ); $this->get( 'items/(?P<slug>[a-zA-Z0-9-]+)', [ $this, 'get_item' ], [ 'slug' => [ 'required' => true, ], 'type' => [ 'default' => 'block' ] ] ); $this->get( 'items/search/(?P<keyword>[a-zA-Z0-9-]+)', [ $this, 'get_search_results' ], [ 'keyword' => [ 'required' => true, ], 'platform' => [ 'default' => 'elementor', ], 'query_type' => [ 'default' => 'block', ], ] ); $this->post( 'items/favourite', [ $this, 'set_favourite' ] ); $this->post( 'items/rating', [ $this, 'set_rating' ] ); $this->get( 'items-count', [ $this, 'get_counts' ] ); $this->get( 'featured-items', [ $this, 'featured_items' ] ); } /** * @param string $type * * @return string */ public function get_query_types( $type = 'blocks' ) { $item_types = ( $type === 'blocks' || $type === 'sections' ) ? 'items' : trim( $type ); return in_array( $item_types, [ 'items', 'pages', 'packs' ], true ) ? $item_types : false; } public function get_items( WP_REST_Request $request ) { $_type = $this->get_param( 'type', 'blocks' ); $type = $this->get_query_types( $_type ); $plan = $this->get_param( 'plan', 'all' ); $plan_type = $this->get_plan( $plan ); $platform = $this->get_param( 'platform', 'elementor' ); $search = $this->get_param( 'search' ); $include_search = $this->get_param( 'include_search' ); $page = $this->get_param( 'page', 1, 'intval' ); $per_page = $this->get_param( 'per_page', 40, 'intval' ); $template_type_id = $this->get_param( 'template_type_id', 0, 'intval' ); $category_id = $this->get_param( 'category_id', 0, 'intval' ); $dependencies = $request->get_param( 'dependencies' ); $tags = $request->get_param( 'tags' ); $funcArgs = [ 'page' => $page, 'per_page' => $per_page, 'platform' => $platform, ]; if ( $plan_type > 1 ) { $funcArgs['plan_type'] = $plan_type; } if ( $category_id ) { $funcArgs['category_id'] = $category_id; } if ( $template_type_id > 0 ) { $funcArgs['template_type_id'] = $template_type_id; } if ( ! empty( $dependencies['include'] ) || ! empty( $dependencies['exclude'] ) ) { $funcArgs['dependencies'] = wp_slash( json_encode( $dependencies ) ); } if ( ! empty( $tags ) ) { $funcArgs['tag_id'] = wp_slash( json_encode( $tags ) ); } if ( ! empty( $search ) ) { $funcArgs['search'] = $search; } if ( ! empty( $include_search ) ) { $funcArgs['include_search'] = $include_search; } $query = 'total_page, current_page, data { id, fullsite_import, name, price, rating, downloads, type, template_type{ slug }, slug, favourite_count, thumbnail, thumbnail2, thumbnail3 }'; if( $type !== 'packs' ) { $query = 'total_page, current_page, data { id, name, price, rating, downloads, type, template_type{ slug }, slug, favourite_count, dependencies{ id, name, icon, plugin_file, plugin_original_slug, is_pro, link }, thumbnail }'; } if( $type === false ) { return $this->error( 'invalid_type_call', __( 'Invalid Type Call', 'templately' ) ); } return $this->http()->query( $type, $query, $funcArgs )->post(); } public function get_item() { $slug = $this->get_param( 'slug' ); $_type = $this->get_param( 'type', 'blocks' ); $type = $this->get_query_types( $_type ); if ( empty( $slug ) ) { return $this->error( 'invalid_item_slug', __( 'Items slug cannot be empty.', 'templately' ), 'items/:slug', '400' ); } if( $type === false ) { return $this->error( 'invalid_type_call', __( 'Invalid Type Call', 'templately' ) ); } $items_params = 'id, name, rating, type, description, slug, price, features, favourite_count, thumbnail, downloads, categories{ id, name, slug }, dependencies{ id, name, icon, plugin_file, plugin_original_slug, is_pro, link }, tags{ name, id }, categories{ name, id }, screenshots{ url }, banner, pack{ id, name, slug, items{ id, price, name, type, slug, thumbnail } }, live_url, template_type{ id, name, slug }'; $params = 'data { ' . $items_params . ', variations { name, slug, type, platform } }'; if ( $type == 'packs' ) { $params = 'data { id, fullsite_import, has_settings, has_attachments, name, rating, type, slug, live_url, price, features, favourite_count, thumbnail, downloads, categories{ id, name, slug }, items { ' . $items_params . ' }, variations { name, slug, type, platform } }'; } $response = $this->http()->query( $type, $params, [ 'slug' => $slug ] )->post(); if ( is_wp_error( $response ) ) { return $response; } if( empty( $response['data'] ) ) { return $this->error( 'invalid_response', __('Item data not found', 'templately'), '/items\/' . $slug, '404' ); } return current( $response['data'] ); } public function get_search_results( WP_REST_Request $request ) { $keyword = $request->get_param( 'keyword' ); $platform = $request->get_param( 'platform' ); $query_type = $request->get_param( 'query_type' ); if ( empty( $keyword ) ) { return $this->error( 'invalid_search_keyword', __( 'Search keyword cannot be empty.', 'templately' ), 'items/search/:keyword', '400' ); } $funcArgs = [ 'search' => $keyword, 'platform' => $platform, 'query_type' => $query_type ]; $response = $this->http()->query( 'getItemsAndPacks', 'total_page, current_page, data { id, name, rating, type, slug, favourite_count, thumbnail }', $funcArgs )->post(); if( is_wp_error( $response ) ){ return $response; } $modified_response = [ 'data' => [] ]; if ( ! empty( $response['data'] ) ) { $modified_response['data'] = array_map( function( $item ){ $item['id'] = (int) $item['id']; return $item; }, $response['data'] ); unset( $response['data'] ); } return array_merge( $response, $modified_response ); } public function set_favourite(){ $id = $this->get_param( 'id', 0, 'intval' ); $type = $this->get_param( 'itemType', 'block' ); $action = $this->get_param( 'action', 'do' ); $query = 'status, message, data'; if( $action === 'undo' ) { $query = ''; } $funcArgs = [ 'api_key' => $this->api_key, 'type_id' => $id, 'type' => $type, ]; $response = $this->http()->mutation( $action === 'undo' ? 'unFavourite' : 'favourite', $query, $funcArgs )->post(); if( is_wp_error( $response ) ) { return $response; } $_response = []; $_data = $response; if( $action == 'do' ) { if( ! empty( $_data['data'] ) && $_data['status'] === 'success' ) { $_data['data'] = $_temp_data = json_decode( $_data['data'] ); $_temp_data = [ $_temp_data ]; $_favourites = $this->utils('options')->get('favourites'); $_favourites = $this->utils('helper')->normalizeFavourites( $_temp_data, $_favourites ); $this->utils('options')->set('favourites', $_favourites); $_response['status'] = 'success'; $_response['data'] = $_favourites; } } if( $action == 'undo' ) { $_temp_data = [ 'id' => $id, 'type' => $type == 'block' || $type == 'page' ? 'item' : 'pack' ]; if( $response == 1 ) { $_favourites = $this->utils('options')->get('favourites'); $_favourites = $this->utils('helper')->normalizeFavourites( $_temp_data, $_favourites, true ); $this->utils('options')->set('favourites', $_favourites); $_response['status'] = 'success'; $_response['data'] = $_favourites; } else { $_response['status'] = 'error'; $_response['message'] = __( 'Unfavourite Action Failed: Something went wrong.', 'templately' ); } } return $_response; } public function set_rating(){ $type_id = $this->get_param( 'type_id', 0, 'intval' ); $itemType = $this->get_param( 'itemType', 'pack' ); $rating = $this->get_param( 'rating', 5, 'intval' ); $query = 'status, message, data'; $funcArgs = [ 'api_key' => $this->api_key, 'type_id' => $type_id, 'type' => $itemType, 'rating' => $rating, ]; $response = $this->http()->mutation( 'review', $query, $funcArgs )->post(); if( is_wp_error( $response ) ) { return $response; } if( empty( $response['data'] ) ) { return $this->error( 'invalid_response', __('Something went wrong.', 'templately'), '/items\/rating', '404' ); } if( ! empty( $response['data'] ) && $response['status'] === 'success' ) { $response['data'] = json_decode( $response['data'], true ); $_ratings = $this->utils('options')->get('reviews', []); // $_reviews = $this->utils( 'helper' )->normalizeReviews( $response['user']['reviews'] ); $_ratings[ $itemType ][ $type_id ] = $rating; $this->utils('options')->set('reviews', $_ratings); $_ratings[ $itemType ][ "avg_$type_id" ] = (float) $response['data']['avg_rating']; $response['data']['reviews'] = $_ratings; } return $response; } public function get_counts(){ $defaults = Database::get_transient( 'counts' ); if( $defaults ) { return $defaults; } $defaults = [ 'elementor' => [ 'items' => [ 'total' => '1469', 'starter' => '964', 'pro' => '415', ], 'blocks' => [ 'total' => '517', 'starter' => '358', 'pro' => '159', ], 'pages' => [ 'total' => '803', 'starter' => '506', 'pro' => '297', ], 'packs' => [ 'total' => '149', 'starter' => '100', 'pro' => '49', ] ], 'gutenberg' => [ 'blocks' => [ 'total' => '3', 'starter' => '3', 'pro' => '0', ], 'pages' => [ 'total' => '3', 'starter' => '3', 'pro' => '0', ], 'packs' => [ 'total' => '3', 'starter' => '3', 'pro' => '0', ], ] ]; $response = $this->http()->query( 'getCounts', 'key, value' )->post(); if ( is_wp_error( $response ) ) { return $defaults; } $new_array = [ 'items' => [], 'blocks' => [], 'pages' => [], 'packs' => [], ]; $_new_data = []; array_walk( $response, function( $item ) use ( &$new_array, &$_new_data ) { if( in_array( $item['key'] , ['elementor', 'gutenberg'], true ) ) { $values = json_decode($item['value'], true); array_walk( $values, function( $_item ) use ( &$new_array ) { $new_key = explode('-', $_item['key']); if( count( $new_key ) === 2 ) { if( isset( $new_array[ $new_key[1] ] )) { $new_array[ $new_key[1] ] = array_merge( $new_array[ $new_key[1] ], [ $new_key[0] => $_item['value'] ] ); $temp_array = $new_array[ $new_key[1] ]; unset( $temp_array['total'] ); $new_array[ $new_key[1] ]['total'] = array_sum( $temp_array ); } } }); $_new_data[ $item['key'] ] = $new_array; } }); Database::set_transient( 'counts', $_new_data ); return $_new_data; } /** * Get Featured Item List * @param WP_REST_Request $request * @return mixed */ public function featured_items(WP_REST_Request $request){ $defaults = Database::get_transient( 'featuredItems' ); if( $defaults ) { return $defaults; } $platform = $request->get_param( 'platform' ); $funcArgs = [ // 'page' => 1, // 'per_page' => 10, 'platform' => $platform, ]; $response = $this->http()->query( 'featuredItems', 'data{ id, name, slug, price, type, thumbnail }', $funcArgs )->post(); if( ! is_wp_error( $response ) ) { Database::set_transient( 'featuredItems', $response ); } return $response; } }