<?php /** * Plugin statistics handling * * Handles all user plugin statistics and detection. * * @package System * @author Pierre Lannoy <https://pierre.lannoy.fr/>. * @since 1.0.0 */ namespace Vibes\System; /** * Define the plugin statistics functionality. * * Handles all plugin statistics operations and detection. * * @package System * @author Pierre Lannoy <https://pierre.lannoy.fr/>. * @since 1.0.0 */ class Statistics { /** * The unique instance of the class. * * @since 1.0.0 * @var self $instance The unique instance of the class. */ private static $instance; /** * The number of active installs for this plugin. * * @since 1.0.0 * @var integer $installs The number of active installs. */ public $installs = -1; /** * The number of active downloads for this plugin. * * @since 1.0.0 * @var integer $downloads The number of downloads. */ public $downloads = -1; /** * The rating of this plugin. * * @since 1.0.0 * @var integer $rating The rating. */ public $rating = -1; /** * The number of reviews for this plugin. * * @since 1.0.0 * @var integer $reviews The number of reviews. */ public $reviews = -1; /** * Initializes the class and set its properties. * * @since 1.0.0 */ public function __construct() { $this->get_wp_stats(); } /** * Get the WP stats about active installs, downloads, rating and reviews. * * @since 1.0.0 */ private function get_wp_stats() { $stats = Cache::get_global( '/Plugin/WPstats' ); if ( ! $stats ) { try { if ( ! function_exists( 'plugins_api' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; } $query = [ 'active_installs' => true, 'downloaded' => true, 'rating' => true, 'num_ratings' => true, ]; $api = plugins_api( 'plugin_information', [ 'slug' => VIBES_SLUG, 'fields' => $query, ] ); if ( ! is_wp_error( $api ) ) { $result = get_object_vars( $api ); Cache::set_global( '/Plugin/WPstats', $result, 'plugin-statistics' ); $stats = $result; } else { $stats = false; } } catch ( \Throwable $ex ) { $stats = false; } } if ( false !== $stats ) { if ( array_key_exists( 'active_installs', $stats ) ) { $this->installs = $stats['active_installs']; } if ( array_key_exists( 'downloaded', $stats ) ) { $this->downloads = $stats['downloaded']; } if ( array_key_exists( 'rating', $stats ) ) { $this->rating = $stats['rating']; } if ( array_key_exists( 'num_ratings', $stats ) ) { $this->reviews = $stats['num_ratings']; } } } /** * Get the statistics as shortcode. * * @param array $attributes Attributes of the shortcode. * @return int|string The output of the shortcode, ready to print. * @since 1.0.0 */ public static function sc_get_raw( $attributes ) { $_attributes = shortcode_atts( [ 'item' => 'rating', ], $attributes ); if ( ! isset( self::$instance ) ) { self::$instance = new Statistics(); } switch ( $_attributes['item'] ) { case 'installs': $result = self::$instance->installs; break; case 'downloads': $result = self::$instance->downloads; break; case 'rating': $result = self::$instance->rating; break; case 'reviews': $result = self::$instance->reviews; break; default: $result = ''; } return $result; } }