晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/stando/www/wp-content/plugins/google-analytics-premium/includes/admin/pages/ |
Upload File : |
<?php
/**
* Addons class.
*
* @since 6.0.0
*
* @package MonsterInsights
* @author Chris Christoff
*/
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
function monsterinsights_is_addons_page() {
$current_screen = get_current_screen();
global $admin_page_hooks;
if ( ! is_object( $current_screen ) || empty( $current_screen->id ) || empty( $admin_page_hooks ) ) {
return false;
}
$settings_page = false;
if ( ! empty( $admin_page_hooks['monsterinsights_dashboard'] ) && $current_screen->id === $admin_page_hooks['monsterinsights_dashboard'] . '_page_monsterinsights_addons' ) {
$settings_page = true;
}
if ( ! empty( $admin_page_hooks['monsterinsights_settings'] ) && $current_screen->id === $admin_page_hooks['monsterinsights_settings'] . '_page_monsterinsights_addons' ) {
$settings_page = true;
}
if ( ! empty( $admin_page_hooks['monsterinsights_network'] ) && $current_screen->id === $admin_page_hooks['monsterinsights_network'] . '_page_monsterinsights_addons-network' ) {
$settings_page = true;
}
return $settings_page;
}
/**
* Maybe refreshes the addons page.
*
* @since 6.0.0
*
* @return null Return early if not refreshing the addons.
*/
function monsterinsights_maybe_refresh_addons() {
if ( ! monsterinsights_is_addons_page() ) {
return;
}
if ( empty( $_POST['google-analytics-for-wordpress-refresh-addons-submit'] ) ) {
return;
}
if ( ! wp_verify_nonce( $_POST['google-analytics-for-wordpress-refresh-addons'], 'google-analytics-for-wordpress-refresh-addons' ) ) {
return;
}
monsterinsights_get_addons_data( MonsterInsights()->license->get_valid_license_key() );
}
add_action( 'current_screen', 'monsterinsights_maybe_refresh_addons' );
/**
* Callback to output the MonsterInsights addons page.
*
* @since 6.0.0
*/
function monsterinsights_addons_page() {
/**
* Developer Alert:
*
* Per the README, this is considered an internal hook and should
* not be used by other developers. This hook's behavior may be modified
* or the hook may be removed at any time, without warning.
*/
do_action('monsterinsights_head');
?>
<?php echo monsterinsights_ublock_notice(); ?>
<div id="monsterinsights-addon-heading" class="monsterinsights-addons-subheading monsterinsights-clearfix-after">
<h1><?php esc_html_e( 'MonsterInsights Addons', 'google-analytics-for-wordpress' ); ?></h1>
<form id="add-on-search">
<span class="spinner"></span>
<input id="add-on-searchbox" name="monsterinsights-addon-search" value="" placeholder="<?php esc_attr_e( 'Search MI Addons', 'google-analytics-for-wordpress' ); ?>" />
<select id="monsterinsights-filter-select">
<option value="asc"><?php esc_html_e( 'Sort Ascending (A-Z)', 'google-analytics-for-wordpress' ); ?></option>
<option value="desc"><?php esc_html_e( 'Sort Descending (Z-A)', 'google-analytics-for-wordpress' ); ?></option>
</select>
</form>
</div>
<div id="monsterinsights-addons" class="wrap">
<div class="monsterinsights-clear">
<?php
/**
* Developer Alert:
*
* Per the README, this is considered an internal hook and should
* not be used by other developers. This hook's behavior may be modified
* or the hook may be removed at any time, without warning.
*/
?>
<?php do_action( 'monsterinsights_addons_section' ); ?>
</div>
</div>
<?php
}
/**
* Callback for displaying the UI for Addons.
*
* @since 6.0.0
*/
function monsterinsights_addons_content() {
// If error(s) occurred during license key verification, display them and exit now.
if ( monsterinsights_is_pro_version() && ! MonsterInsights()->license->get_valid_license_key() ) {
?>
<div class="error below-h2">
<p>
<?php esc_html_e( 'In order to get access to Addons, you need to resolve your license key errors.', 'google-analytics-for-wordpress' ); ?>
</p>
</div>
<?php
return;
}
// Get Addons
$addons = monsterinsights_get_addons();
// If no Addon(s) were returned, our API call returned an error.
// Show an error message with a button to reload the page, which will trigger another API call.
if ( ! $addons ) {
?>
<form id="monsterinsights-addons-refresh-addons-form" method="post">
<p>
<?php esc_html_e( 'There was an issue retrieving the addons for this site. Please click on the button below the refresh the addons data.', 'google-analytics-for-wordpress' ); ?>
</p>
<p>
<a href="<?php echo esc_url( $_SERVER['REQUEST_URI'] ); ?>" class="button button-primary"><?php esc_html_e( 'Refresh Addons', 'google-analytics-for-wordpress' ); ?></a>
</p>
</form>
<?php
return;
}
// If here, we have Addons to display, so let's output them now.
// Get installed plugins and upgrade URL
$installed_plugins = get_plugins();
$upgrade_url = monsterinsights_get_upgrade_link();
?>
<div id="monsterinsights-addons">
<?php
// Output Addons the User is licensed to use.
if ( count( $addons['licensed'] )> 0 ) {
?>
<div class="monsterinsights-addons-area licensed" class="monsterinsights-clear">
<h3><?php esc_html_e( 'Available Addons:', 'google-analytics-for-wordpress' ); ?></h3>
<div id="monsterinsights-addons-licensed" class="monsterinsights-addons">
<!-- list container class required for list.js -->
<div class="list">
<?php
foreach ( (array) $addons['licensed'] as $i => $addon ) {
monsterinsights_get_addon_card( $addon, $i, true, $installed_plugins );
}
?>
</div>
</div>
</div>
<?php
} // Close licensed addons
// Output Addons the User isn't licensed to use.
if ( count( $addons['unlicensed'] ) > 0 ) {
?>
<div class="monsterinsights-addons-area unlicensed" class="monsterinsights-clear">
<h3><?php esc_html_e( 'Unlock More Addons', 'google-analytics-for-wordpress' ); ?></h3>
<p><?php echo sprintf( esc_html__( '%1$sWant even more addons?%2$sUpgrade your MonsterInsights account%3$s and unlock the following addons:', 'google-analytics-for-wordpress' ), '<strong>', '</strong> <a href="' . $upgrade_url. '">', '</a>' ); ?></p>
<div id="monsterinsights-addons-unlicensed" class="monsterinsights-addons">
<!-- list container class required for list.js -->
<div class="list">
<?php
foreach ( (array) $addons['unlicensed'] as $i => $addon ) {
monsterinsights_get_addon_card( $addon, $i, false, $installed_plugins );
}
?>
</div>
</div>
</div>
<?php
} // Close unlicensed addons
?>
</div>
<?php
}
add_action( 'monsterinsights_addons_section', 'monsterinsights_addons_content' );
/**
* Retrieves addons from the stored transient or remote server.
*
* @since 6.0.0
*
* @return bool | array false | Array of licensed and unlicensed Addons.
*/
function monsterinsights_get_addons() {
// Get license key and type.
$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.
*
* @since 6.0.0
*
* @param string $key The user license key.
* @return array Array of addon data otherwise.
*/
function monsterinsights_get_addons_data( $key ) {
$type = is_network_admin() ? MonsterInsights()->license->get_network_license_type() : MonsterInsights()->license->get_site_license_type();
// Get Addons
// If the key is valid, we'll get personalised upgrade URLs for each Addon (if necessary) and plugin update information.
if ( $key ) {
$addons = MonsterInsights()->license_actions->perform_remote_request( 'get-addons-data-v600', array( 'tgm-updater-key' => $key ) );
} else {
$addons = MonsterInsights()->license_actions->perform_remote_request( 'get-all-addons-data', array() );
}
// 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;
}
/**
* Retrieve the plugin basename from the plugin slug.
*
* @since 6.0.0
*
* @param string $slug The plugin slug.
* @return string The plugin basename if found, else the plugin slug.
*/
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;
}
/**
* Outputs the addon "box" on the addons page.
*
* @since 6.0.0
*
* @param object $addon Addon data from the API / transient call
* @param int $counter Index of this Addon in the collection
* @param bool $is_licensed Whether the Addon is licensed for use
* @param array $installed_plugins Installed WordPress Plugins
*/
function monsterinsights_get_addon_card( $addon, $counter = 0, $is_licensed = false, $installed_plugins = false ) {
// Setup some vars
$slug = str_replace( 'monsterinsights-', '', $addon->slug );
$slug = 'monsterinsights-' . $addon->slug;
if ( $slug === 'monsterinsights-ecommerce' ) {
$slug = 'ga-ecommerce';
}
$plugin_basename = monsterinsights_get_plugin_basename_from_slug( $slug );
$categories = implode( ',', $addon->categories );
if ( ! $installed_plugins ) {
$installed_plugins = get_plugins();
}
// If the Addon doesn't supply an upgrade_url key, it's because the user hasn't provided a license
// get_upgrade_link() will return the Lite or Pro link as necessary for us.
if ( ! isset( $addon->upgrade_url ) ) {
$addon->upgrade_url = monsterinsights_get_upgrade_link();
}
// Link user to doc to install MI pro to install addons
if ( ! monsterinsights_is_pro_version() && $is_licensed && ! isset( $installed_plugins[ $plugin_basename ] ) ) {
$addon->url = monsterinsights_get_url( 'addons-page', 'install-addons-link', "https://www.monsterinsights.com/docs/install-monsterinsights-pro-to-use-addons" );
}
// Output the card
?>
<div class="monsterinsights-addon">
<h3 class="monsterinsights-addon-title"><?php echo esc_html( $addon->title ); ?></h3>
<?php
if ( ! empty( $addon->image ) ) {
?>
<img class="monsterinsights-addon-thumb" src="<?php echo esc_attr( esc_url( $addon->image ) ); ?>" alt="<?php echo esc_attr( $addon->title ); ?>" />
<?php
}
?>
<p class="monsterinsights-addon-excerpt"><?php echo esc_html( $addon->excerpt ); ?></p>
<?php
// If the Addon is unlicensed, show the upgrade button
if ( ! $is_licensed ) {
?>
<div class="monsterinsights-addon-active monsterinsights-addon-message">
<div class="interior">
<div class="monsterinsights-addon-upgrade">
<a href="<?php echo esc_attr( esc_url( $addon->upgrade_url ) ); ?>" target="_blank" rel="noopener noreferrer" referrer="no-referrer" class="button button-primary monsterinsights-addon-upgrade-button" rel="<?php echo esc_attr( $plugin_basename ); ?>">
<?php esc_html_e( 'Upgrade Now', 'google-analytics-for-wordpress' ); ?>
</a>
<span class="spinner monsterinsights-spinner"></span>
</div>
</div>
</div>
<?php
} else {
// Addon is licensed
// If the plugin is not installed, display an install message and button.
if ( ! isset( $installed_plugins[ $plugin_basename ] ) ) {
if ( empty( $addon->url ) ) {
$addon->url = '';
}
?>
<div class="monsterinsights-addon-not-installed monsterinsights-addon-message">
<div class="interior">
<?php if ( monsterinsights_is_pro_version() ) { ?>
<span class="addon-status"><?php echo sprintf( esc_html__( 'Status: %1$sNot Installed%2$s', 'google-analytics-for-wordpress' ), '<span>', '</span>' ); ?></span>
<?php } ?>
<div class="monsterinsights-addon-action">
<?php if ( monsterinsights_is_pro_version() ) { ?>
<a class="button button-primary monsterinsights-addon-action-button monsterinsights-install-addon" href="#" rel="<?php echo esc_attr( esc_url( $addon->url ) ); ?>">
<i class="monsterinsights-cloud-download"></i>
<?php esc_html_e( 'Install', 'google-analytics-for-wordpress' ); ?>
</a>
<?php } else { ?>
<a class="button button-primary monsterinsights-addon-action-button" href="<?php echo esc_url( $addon->url ); ?>" rel="noopener noreferrer" referrer="no-referrer" target="_blank">
<i class="monsterinsights-cloud-download"></i>
<?php esc_html_e( "Why can't I install addons?", 'google-analytics-for-wordpress' ); ?>
</a>
<?php } ?>
<span class="spinner monsterinsights-spinner"></span>
</div>
</div>
</div>
<?php
} else {
// Plugin is installed.
$active = false;
$ms_active = is_plugin_active_for_network( $plugin_basename );
$ss_active = is_plugin_active( $plugin_basename );
if ( is_multisite() && is_network_admin() ) {
$active = is_plugin_active_for_network( $plugin_basename );
} else {
$active = is_plugin_active( $plugin_basename );
}
if ( $active ) {
// Plugin is active. Display the active message and deactivate button.
?>
<div class="monsterinsights-addon-active monsterinsights-addon-message">
<div class="interior">
<?php if ( $ms_active ) { ?>
<span class="addon-status"><?php echo sprintf( esc_html__( 'Status: %1$sNetwork Active%2$s', 'google-analytics-for-wordpress'), '<span>', '</span>' ); ?></span>
<?php } else { ?>
<span class="addon-status"><?php echo sprintf( esc_html__( 'Status: %1$sActive%2$s', 'google-analytics-for-wordpress'), '<span>', '</span>' ); ?></span>
<?php } ?>
<?php if ( ( is_multisite() && is_network_admin() && $ms_active ) || ! is_multisite() || ( is_multisite() && !is_network_admin() && !$ms_active && $ss_active ) ) { ?>
<div class="monsterinsights-addon-action">
<a class="button button-primary monsterinsights-addon-action-button monsterinsights-deactivate-addon" href="#" rel="<?php echo esc_attr( $plugin_basename ); ?>">
<i class="monsterinsights-toggle-on"></i>
<?php if ( is_multisite() && is_network_admin() && $ms_active ) { ?>
<?php esc_html_e( 'Network deactivate', 'google-analytics-for-wordpress' ); ?>
<?php } else if ( is_multisite() && !is_network_admin() && !$ms_active && $ss_active ) { ?>
<?php esc_html_e( 'Deactivate', 'google-analytics-for-wordpress' ); ?>
<?php } else { ?>
<?php esc_html_e( 'Deactivate', 'google-analytics-for-wordpress' ); ?>
<?php } ?>
</a>
<span class="spinner google-analytics-for-wordpress-spinner"></span>
</div>
<?php } ?>
</div>
</div>
<?php
} else {
// Plugin is inactivate. Display the inactivate mesage and activate button.
?>
<div class="monsterinsights-addon-inactive monsterinsights-addon-message">
<div class="interior">
<?php if ( $ms_active ) { ?>
<span class="addon-status"><?php echo sprintf( esc_html__( 'Status: %1$sNetwork Inactive%2$s', 'google-analytics-for-wordpress'), '<span>', '</span>' ); ?></span>
<?php } else { ?>
<span class="addon-status"><?php echo sprintf( esc_html__( 'Status: %1$sInactive%2$s', 'google-analytics-for-wordpress'), '<span>', '</span>' ); ?></span>
<?php } ?>
<div class="monsterinsights-addon-action">
<a class="button button-primary monsterinsights-addon-action-button monsterinsights-activate-addon" href="#" rel="<?php echo esc_attr( $plugin_basename ); ?>">
<i class="monsterinsights-toggle-on"></i>
<?php if ( is_multisite() && is_network_admin() && ! $ms_active ) { ?>
<?php esc_html_e( 'Network activate', 'google-analytics-for-wordpress' ); ?>
<?php } else { ?>
<?php esc_html_e( 'Activate', 'google-analytics-for-wordpress' ); ?>
<?php } ?>
</a>
<span class="spinner monsterinsights-spinner"></span>
</div>
</div>
</div>
<?php
}
}
}
?>
</div>
<?php
}