'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 "
";
}
}