2022-02-18 19:09:35 +07:00

162 lines
4.5 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace WP_Rocket\Subscriber\Plugin;
use WP_Rocket\Event_Management\Subscriber_Interface;
/**
* Manages the plugin information.
*
* @since 3.3.6
* @author Grégory Viguier
*/
class Information_Subscriber implements Subscriber_Interface {
use \WP_Rocket\Traits\Updater_Api_Tools;
/**
* Plugin slug.
*
* @var string
* @since 3.3.6
* @access private
* @author Grégory Viguier
*/
private $plugin_slug;
/**
* URL to contact to get plugin info.
*
* @var string
* @since 3.3.6
* @access private
* @author Grégory Viguier
*/
private $api_url;
/**
* An ID to use when a API request fails.
*
* @var string
* @since 3.3.6
* @access protected
* @author Grégory Viguier
*/
protected $request_error_id = 'plugins_api_failed';
/**
* Constructor
*
* @since 3.3.6
* @access public
* @author Grégory Viguier
*
* @param array $args {
* Required arguments to populate the class properties.
*
* @type string $plugin_file Full path to the plugin.
* @type string $api_url URL to contact to get update info.
* }
*/
public function __construct( $args ) {
if ( isset( $args['plugin_file'] ) ) {
$this->plugin_slug = $this->get_plugin_slug( $args['plugin_file'] );
}
if ( isset( $args['api_url'] ) ) {
$this->api_url = $args['api_url'];
}
}
/**
* {@inheritdoc}
*/
public static function get_subscribed_events() {
return [
'plugins_api' => [ 'exclude_rocket_from_wp_info', 10, 3 ],
'plugins_api_result' => [ 'add_rocket_info', 10, 3 ],
];
}
/** ----------------------------------------------------------------------------------------- */
/** PLUGIN INFO ============================================================================= */
/** ----------------------------------------------------------------------------------------- */
/**
* Dont ask for plugin info to the repository.
*
* @since 3.3.6
* @access public
* @see plugins_api()
* @author Grégory Viguier
*
* @param false|object|array $bool The result object or array. Default false.
* @param string $action The type of information being requested from the Plugin Install API.
* @param object $args Plugin API arguments.
* @return false|object|array Empty object if slug is WP Rocket, default value otherwise.
*/
public function exclude_rocket_from_wp_info( $bool, $action, $args ) {
if ( ! $this->is_requesting_rocket_info( $action, $args ) ) {
return $bool;
}
return new \stdClass();
}
/**
* Insert WP Rocket plugin info.
*
* @since 3.3.6
* @access public
* @see plugins_api()
* @author Grégory Viguier
*
* @param object|\WP_Error $res Response object or WP_Error.
* @param string $action The type of information being requested from the Plugin Install API.
* @param object $args Plugin API arguments.
* @return object|\WP_Error Updated response object or WP_Error.
*/
public function add_rocket_info( $res, $action, $args ) {
if ( ! $this->is_requesting_rocket_info( $action, $args ) || empty( $res->external ) ) {
return $res;
}
$request = wp_remote_post(
$this->api_url,
[
'timeout' => 30,
'action' => 'plugin_information',
'request' => maybe_serialize( $args ),
]
);
if ( is_wp_error( $request ) ) {
return $this->get_request_error( $request->get_error_message() );
}
$res = maybe_unserialize( wp_remote_retrieve_body( $request ) );
$code = wp_remote_retrieve_response_code( $request );
if ( 200 !== $code || ! ( is_object( $res ) || is_array( $res ) ) ) {
return $this->get_request_error( wp_remote_retrieve_body( $request ) );
}
return $res;
}
/** ----------------------------------------------------------------------------------------- */
/** TOOLS =================================================================================== */
/** ----------------------------------------------------------------------------------------- */
/**
* Tell if requesting WP Rocket plugin info.
*
* @since 3.3.6
* @access private
* @author Grégory Viguier
*
* @param string $action The type of information being requested from the Plugin Install API.
* @param object $args Plugin API arguments.
* @return bool
*/
private function is_requesting_rocket_info( $action, $args ) {
return ( 'query_plugins' === $action || 'plugin_information' === $action ) && isset( $args->slug ) && $args->slug === $this->plugin_slug;
}
}