$license) {
if (empty($license['products'])) continue;
if (in_array($slug, $license['products'])) {
return $key;
}
}
return null;
}
/**
* Retrieve the status of a given plugin slug.
*
* @param string $slug The slug of the plugin.
*
* @return string|null The status of the plugin, e.g. 'valid', 'expired', or null if no matching license was found.
*/
public static function getPluginLicenseStatus($slug)
{
$licenseKey = self::getPluginLicense($slug);
$status = self::getLicenseInfo($licenseKey);
return $status['status'] ?? null;
}
/**
* Checks if the given plugin slug has a valid license.
*
* @param string $slug The slug of the plugin.
*
* @return bool True if the plugin has a valid license, false otherwise.
*/
public static function isPluginLicenseValid($slug)
{
$status = self::getPluginLicenseStatus($slug);
return $status === 'valid';
}
/**
* Checks if the given plugin is expired.
*
* @param string $slug The slug of the plugin.
*/
public static function isPluginLicenseExpired($slug)
{
$status = self::getPluginLicenseStatus($slug);
return $status === 'license_expired';
}
/**
* Store license details in the WordPress database.
*
* @param string $licenseKey
* @param object $license
*/
public static function storeLicense($licenseKey, $licenseData)
{
$data = [
'status' => $licenseData->status,
'type' => $licenseData->license_details->type ?? null,
'sku' => $licenseData->license_details->sku ?? null,
'max_domains' => $licenseData->license_details->max_domains ?? null,
'user' => $licenseData->license_details->user ?? null,
'products' => isset($licenseData->products) ? wp_list_pluck($licenseData->products, 'slug') : null,
];
Option::saveOptionGroup($licenseKey, $data, self::LICENSE_OPTION_KEY);
}
/**
* Update license in the database
*
* @param string $licenseKey
* @param object $license
*/
public static function updateLicense($licenseKey, $licenseData)
{
Option::saveOptionGroup($licenseKey, $licenseData, self::LICENSE_OPTION_KEY);
}
/**
* Removes a license from WordPress database.
*
* @param string $licenseKey
*
* @return void
*/
public static function removeLicense($licenseKey)
{
Option::deleteOptionGroup($licenseKey, self::LICENSE_OPTION_KEY);
}
/**
* Checks if user has any valid license or not.
*
* @return bool
*/
public static function isValidLicenseAvailable()
{
return !empty(self::getLicenses());
}
/**
* Checks all stored licenses to see if any of them is premium.
*
* @return string|null License key. `null` if no premium licenses were found.
*/
public static function isPremiumLicenseAvailable()
{
foreach (self::getLicenses() as $key => $data) {
if (!empty($data['sku']) && $data['sku'] === 'premium') {
return $key;
}
}
return null;
}
/**
* Checks all stored licenses to see if they are valid or not.
*
* @return void
*/
public static function checkLicensesStatus()
{
$apiCommunicator = new ApiCommunicator();
$licenses = LicenseHelper::getLicenses('all');
foreach ($licenses as $key => $data) {
try {
$licenseData = $apiCommunicator->validateLicense($key);
LicenseHelper::storeLicense($key, $licenseData);
} catch (LicenseException $e) {
// If status is empty, do nothing (probably server error, or connection issue)
if (!$e->getStatus()) return;
// If license is expired, update the status
if ($e->getStatus() === 'license_expired') {
$data['status'] = $e->getStatus();
LicenseHelper::updateLicense($key, $data);
return;
}
// If license is invalid, remove the license
LicenseHelper::removeLicense($key);
}
}
}
/**
* Renders the license status link based on the license state and optional promo banner.
*
* @param bool $isPremium Whether the user has a premium license.
* @param object|null $promoBanner The promotional banner object, if available.
* @param bool $isMobile Whether the link is for the mobile menu.
* @return string The HTML for the license status link.
*/
public static function renderLicenseStatusLink($isPremium, $promoBanner, $isMobile = false)
{
$baseUrl = esc_url(WP_STATISTICS_SITE_URL . '/pricing/?utm_source=wp-statistics&utm_medium=link&utm_campaign=header');
if ($promoBanner && Option::get('display_notifications', false)) {
$banner = [
'url' => esc_url($promoBanner->getUrl()),
'tooltip' => $promoBanner->getTooltip(),
'title' => esc_html($promoBanner->getTitle()),
'textColor' => esc_html($promoBanner->getTextColor()),
'bgColor' => esc_html($promoBanner->getBackgroundColor()),
'icon' => esc_html($promoBanner->getIcon()),
];
$titleText = $banner['tooltip'] ?: $banner['title'];
$classes = array_filter([
'wps-license-status',
'wps-license-status--custom',
$banner['tooltip'] ? 'wps-tooltip' : '',
$banner['textColor'],
$banner['bgColor'],
]);
$class = implode(' ', $classes);
return sprintf(
'%s%s',
esc_url($banner['url']),
esc_attr($titleText),
esc_attr($class),
esc_html($banner['icon']),
esc_html($banner['title'])
);
}
if (!$isPremium && !self::isValidLicenseAvailable()) {
return sprintf(
'%s',
$baseUrl,
esc_html__('Upgrade To Premium', 'wp-statistics')
);
}
$licenseText = sprintf(
esc_html__('License: %s/%s', 'wp-statistics'),
count(PluginHelper::getLicensedPlugins()),
count(PluginHelper::$plugins)
);
return sprintf(
'%s %s',
$baseUrl,
$licenseText,
esc_html__('Upgrade', 'wp-statistics')
);
}
}