202 lines
5.2 KiB
PHP
202 lines
5.2 KiB
PHP
<?php
|
|
/**
|
|
* Addons class.
|
|
*
|
|
* @since 6.0.0
|
|
*
|
|
* @package MonsterInsights
|
|
* @author Chris Christoff
|
|
*/
|
|
|
|
// Exit if accessed directly
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
|
|
/**
|
|
* Callback to output the MonsterInsights addons page.
|
|
*
|
|
* @since 6.0.0
|
|
*/
|
|
function monsterinsights_addons_page() {
|
|
echo monsterinsights_ublock_notice(); // phpcs:ignore
|
|
monsterinsights_settings_error_page( 'monsterinsights-addons' );
|
|
monsterinsights_settings_inline_js();
|
|
}
|
|
|
|
/**
|
|
* Retrieves addons from the stored transient or remote server.
|
|
*
|
|
* @return bool | array false | Array of licensed and unlicensed Addons.
|
|
* @since 6.0.0
|
|
*
|
|
*/
|
|
function monsterinsights_get_addons() {
|
|
|
|
// Get license key and type.
|
|
$key = '';
|
|
$type = 'lite';
|
|
if ( monsterinsights_is_pro_version() ) {
|
|
$key = is_network_admin() ? MonsterInsights()->license->get_network_license_key() : MonsterInsights()->license->get_site_license_key();
|
|
$type = is_network_admin() ? MonsterInsights()->license->get_network_license_type() : MonsterInsights()->license->get_site_license_type();
|
|
}
|
|
|
|
// Get addons data from transient or perform API query if no transient.
|
|
if ( false === ( $addons = get_transient( '_monsterinsights_addons' ) ) ) {
|
|
$addons = monsterinsights_get_addons_data( $key );
|
|
}
|
|
|
|
// If no Addons exist, return false
|
|
if ( ! $addons ) {
|
|
return false;
|
|
}
|
|
|
|
// Iterate through Addons, to build two arrays:
|
|
// - Addons the user is licensed to use,
|
|
// - Addons the user isn't licensed to use.
|
|
$results = array(
|
|
'licensed' => array(),
|
|
'unlicensed' => array(),
|
|
);
|
|
foreach ( (array) $addons as $i => $addon ) {
|
|
|
|
// Determine whether the user is licensed to use this Addon or not.
|
|
if (
|
|
empty( $type ) ||
|
|
( in_array( 'Pro', $addon->categories ) && ( $type != 'pro' && $type != 'master' ) ) ||
|
|
( in_array( 'Plus', $addon->categories ) && $type != 'plus' && $type != 'pro' && $type != 'master' ) ||
|
|
( in_array( 'Basic', $addon->categories ) && ( $type != 'basic' && $type != 'plus' && $type != 'pro' && $type != 'master' ) )
|
|
) {
|
|
// Unlicensed
|
|
$results['unlicensed'][] = $addon;
|
|
continue;
|
|
}
|
|
|
|
// Licensed
|
|
$results['licensed'][] = $addon;
|
|
|
|
}
|
|
|
|
// Return Addons, split by licensed and unlicensed.
|
|
return $results;
|
|
|
|
}
|
|
|
|
/**
|
|
* Pings the remote server for addons data.
|
|
*
|
|
* @param string $key The user license key.
|
|
*
|
|
* @return array Array of addon data otherwise.
|
|
* @since 6.0.0
|
|
*
|
|
*/
|
|
function monsterinsights_get_addons_data( $key ) {
|
|
// Get Addons
|
|
// If the key is valid, we'll get personalised upgrade URLs for each Addon (if necessary) and plugin update information.
|
|
if ( monsterinsights_is_pro_version() && $key ) {
|
|
$addons = monsterinsights_perform_remote_request( 'get-addons-data-v600', array( 'tgm-updater-key' => $key ) );
|
|
} else {
|
|
$addons = monsterinsights_get_all_addons_data();
|
|
}
|
|
|
|
// If there was an API error, set transient for only 10 minutes.
|
|
if ( ! $addons ) {
|
|
set_transient( '_monsterinsights_addons', false, 10 * MINUTE_IN_SECONDS );
|
|
|
|
return false;
|
|
}
|
|
|
|
// If there was an error retrieving the addons, set the error.
|
|
if ( isset( $addons->error ) ) {
|
|
set_transient( '_monsterinsights_addons', false, 10 * MINUTE_IN_SECONDS );
|
|
|
|
return false;
|
|
}
|
|
|
|
// Otherwise, our request worked. Save the data and return it.
|
|
set_transient( '_monsterinsights_addons', $addons, 4 * HOUR_IN_SECONDS );
|
|
|
|
return $addons;
|
|
|
|
}
|
|
|
|
/**
|
|
* Get all addons without a license, for lite users.
|
|
*
|
|
* @return array|bool|mixed|object
|
|
*/
|
|
function monsterinsights_get_all_addons_data() {
|
|
|
|
$body = array(
|
|
'tgm-updater-action' => 'get-all-addons-data',
|
|
'tgm-updater-key' => '',
|
|
'tgm-updater-wp-version' => get_bloginfo( 'version' ),
|
|
'tgm-updater-referer' => site_url(),
|
|
'tgm-updater-mi-version' => MONSTERINSIGHTS_VERSION,
|
|
'tgm-updater-is-pro' => false,
|
|
);
|
|
|
|
return monsterinsights_perform_remote_request( 'verify-key', $body );
|
|
}
|
|
|
|
function monsterinsights_get_addon( $installed_plugins, $addons_type, $addon, $slug ) {
|
|
$active = false;
|
|
$installed = false;
|
|
|
|
$slug = apply_filters( 'monsterinsights_addon_slug', $slug );
|
|
|
|
$plugin_basename = monsterinsights_get_plugin_basename_from_slug( $slug );
|
|
|
|
if ( isset( $installed_plugins[ $plugin_basename ] ) ) {
|
|
$installed = true;
|
|
|
|
if ( is_multisite() && is_network_admin() ) {
|
|
$active = is_plugin_active_for_network( $plugin_basename );
|
|
} else {
|
|
$active = is_plugin_active( $plugin_basename );
|
|
}
|
|
}
|
|
if ( empty( $addon->url ) ) {
|
|
$addon->url = '';
|
|
}
|
|
|
|
$active_version = false;
|
|
if ( $active ) {
|
|
if ( ! empty( $installed_plugins[ $plugin_basename ]['Version'] ) ) {
|
|
$active_version = $installed_plugins[ $plugin_basename ]['Version'];
|
|
}
|
|
}
|
|
|
|
$addon->type = $addons_type;
|
|
$addon->installed = $installed;
|
|
$addon->active_version = $active_version;
|
|
$addon->active = $active;
|
|
$addon->basename = $plugin_basename;
|
|
|
|
return $addon;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the plugin basename from the plugin slug.
|
|
*
|
|
* @param string $slug The plugin slug.
|
|
*
|
|
* @return string The plugin basename if found, else the plugin slug.
|
|
* @since 6.0.0
|
|
*
|
|
*/
|
|
function monsterinsights_get_plugin_basename_from_slug( $slug ) {
|
|
$keys = array_keys( get_plugins() );
|
|
|
|
foreach ( $keys as $key ) {
|
|
if ( preg_match( '|^' . $slug . '|', $key ) ) {
|
|
return $key;
|
|
}
|
|
}
|
|
|
|
return $slug;
|
|
|
|
}
|