<?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; class Plugin { /** * The details of the plugin. * * @since 1.0.0 * @var array $details The details of the plugin. */ private $details = []; /** * The full slug of the plugin. * * @since 1.0.0 * @var string $slug The full slug of the plugin. */ private $slug = ''; /** * Initializes the class and set its properties. * * @param string $slug The slug of the plugin. * @param boolean $skip_detection Optional. Skip header parsing. * @since 1.0.0 */ public function __construct( $slug, $skip_detection = true ) { $this->slug = $slug . '/' . $slug . '.php'; $plugin = WP_PLUGIN_DIR . '/' . $this->slug; if ( $skip_detection ) { $this->details = [ 'detection' => 'skipped']; } else { if ( ! function_exists( 'get_plugin_data' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } if ( file_exists( $plugin ) ) { $this->details = \get_plugin_data( $plugin, false ); } } } /** * Get a value. * * @param string $key The value to retrieve. * @return string The value. * @since 1.0.0 */ public function get( $key ) { if ( is_array( $this->details ) && array_key_exists( $key, $this->details ) ) { return $this->details[ $key ]; } else { return ''; } } /** * Verify if the plugin was correctly detected. * * @return boolean True if the plugin was detected, false otherwise. * @since 1.0.0 */ public function is_detected() { return [] !== $this->details; } /** * Verify the waiting update. * * @return boolean|string The new version if plugin needs update, false otherwise. * @since 1.0.0 */ public function waiting_update() { if ( ! $this->is_detected() ) { return false; } $update_cache = get_site_transient( 'update_plugins' ); $update_cache = is_object( $update_cache ) ? $update_cache : new \stdClass(); if ( empty( $update_cache->response ) || empty( $update_cache->response[ $this->slug ] ) ) { return false; } return $update_cache->response[ $this->slug ]->new_version; } /** * Verify the auto-update status. * * @return boolean True if plugin is auto-updatable, false otherwise. * @since 2.0.0 */ public function auto_update() { if ( ! $this->is_detected() ) { return false; } return in_array( $this->slug, (array) get_site_option( 'auto_update_plugins', [] ), true ); } /** * Set the auto-update status. * * @param boolean $status Optional. The status to set. * @return boolean True if it is successful, false otherwise. * @since 2.0.0 */ public function set_auto_update( $status = true ) { if ( ! $this->is_detected() ) { return false; } $auto_updates = (array) get_site_option( 'auto_update_plugins', [] ); if ( $status ) { $auto_updates[] = $this->slug; $auto_updates = array_unique( $auto_updates ); } else { $auto_updates = array_diff( $auto_updates, [ $this->slug ] ); } $all_items = apply_filters( 'all_plugins', get_plugins() ); $auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) ); return update_site_option( 'auto_update_plugins', $auto_updates ); } /** * Switch the auto-update status. * * @return boolean True if it is successful, false otherwise. * @since 2.0.0 */ public function switch_auto_update() { return $this->set_auto_update( ! $this->auto_update() ); } /** * Verify if the WP version is ok. * * @return boolean True if the WP version is ok, false otherwise. * @since 1.0.0 */ public function is_required_wp_ok() { global $wp_version; return ( ! version_compare( $wp_version, $this->get( 'RequiresWP' ), '<' ) ); } /** * Verify if the PHP version is ok. * * @return boolean True if the PHP version is ok, false otherwise. * @since 1.0.0 */ public function is_required_php_ok() { return ( ! version_compare( PHP_VERSION, $this->get( 'RequiresPHP' ), '<' ) ); } }