'dashicons-admin-plugins', 'category' => 'apis', 'preview_image' => Consts::get_url() . 'admin/img/blocks/plugin.jpg', 'description' => __( 'Display a Plugin informations from the official WordPress repository.', 'advanced-gutenberg-blocks' ), ); Blocks::register_block( 'advanced-gutenberg-blocks/plugin', __( 'WordPress Plugin Card', 'advanced-gutenberg-blocks' ), $args ); } public function register_render() { if ( ! function_exists( 'register_block_type' ) or is_admin() ) { return; } register_block_type( 'advanced-gutenberg-blocks/plugin', [ 'render_callback' => array( $this, 'render_block' ) ] ); } public function render_block( $attributes ) { require_once( ABSPATH . "wp-admin" . '/includes/plugin-install.php' ); if( ! isset( $attributes['slug'] ) ) { return; } $request = array( 'slug' => $attributes['slug'], 'fields' => $this->get_api_fields() ); // Get datas from API $result = plugins_api('plugin_information', $request); // Prepare datas for template $plugin = $this->prepare_data( $result ); // Start cached output $output = ""; ob_start(); // Get template include apply_filters( 'advanced_gutenberg_blocks_template', Consts::get_path() . 'public/templates/plugin.php', 'plugin' ); // En cached output $output = ob_get_contents(); ob_end_clean(); return $output; } // Ajax: Search plugins for SearchPlugin component public function search_plugins() { require_once( ABSPATH . "wp-admin" . '/includes/plugin-install.php' ); $request = array( 'per_page' => 24, 'search' => $_POST['search'], 'fields' => $this->get_api_fields() ); $results = plugins_api('query_plugins', $request); $data = array(); $plugins = array(); foreach( $results->plugins as $plugin ) { $plugins[] = $this->prepare_data( $plugin ); } $data['info'] = $results->info; $data['plugins'] = $plugins; echo json_encode($data); die(); } // Ajax: Get plugin data for Preview component public function get_plugin() { require_once( ABSPATH . "wp-admin" . '/includes/plugin-install.php' ); $request = array( 'slug' => $_POST['slug'], 'fields' => $this->get_api_fields() ); // Get datas from API $result = plugins_api( 'plugin_information', $request ); // Prepare datas for template $plugin = $this->prepare_data( $result ); echo json_encode( $plugin ); die(); } // Additional fields to get via plugins API private function get_api_fields() { return array( 'short_description' => true, 'active_installs' => true, 'icons' => true, 'sections' => false, ); } // --- Datas relative methods private function prepare_data( $data ) { return array( 'slug' => $data->slug, 'name' => html_entity_decode( $data->name ), 'description' => html_entity_decode( $data->short_description ), 'icon' => $this->define_image( $data->icons ), 'stars' => $this->set_stars( $data->rating ), 'activeInstalls' => $this->format_installs( $data->active_installs ), 'downloadLink' => "https://wordpress.org/plugins/" . $data->slug, 'rating' => $data->rating, 'numRatings' => $data->num_ratings, 'author' => strip_tags( $data->author ), 'homepage' => $data->homepage, 'numRatings' => $data->num_ratings, ); } private function define_image( $icons ) { if ( $icons['2x'] ) { return $icons['2x']; } else if($icons['1x']) { return $icons['1x']; } return $icons->default; } private function format_installs( $installs ) { if ( $installs > 1000000 ) { return __( '1+ Million', 'advanced-gutenberg-blocks' ); } else if( $installs < 10 ) { return __( 'Less than 10', 'advanced-gutenberg-blocks' ); } return $installs . '+'; } private function set_stars( $rating ) { $rating = intval( $rating ) / 20; $floor = floor( $rating ); $max = 5; $last = 0; $stars = ''; for( $i=0; $i < $floor; $i++ ) { $stars.= $this->get_star_svg( 'filled' ); $last++; } if( $floor != $rating ) { $stars.= $this->get_star_svg( 'half' ); $last++; } for ( $i = $last; $i < $max; $i++ ) { $stars.= $this->get_star_svg( 'empty' ); } return $stars; } private function get_star_svg( $type ) { if( $type == "filled" ) { return " "; } else if ( $type == "half" ) { return " "; } return " "; } }