You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

275 lines
8.0 KiB
PHP

<?php
/**
* Class Site_Kit
*
* @link https://github.com/googleforcreators/web-stories-wp
*
* @copyright 2020 Google LLC
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
*/
/**
* Copyright 2020 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
declare(strict_types = 1);
namespace Google\Web_Stories\Integrations;
use Google\Web_Stories\Analytics;
use Google\Web_Stories\Context;
use Google\Web_Stories\Service_Base;
/**
* Class Site_Kit.
*
* @phpstan-type GtagOpt array{
* vars: array{
* gtag_id?: string
* },
* triggers?: array<string, mixed>
* }
*/
class Site_Kit extends Service_Base {
/**
* Analytics instance.
*
* @var Analytics Analytics instance.
*/
protected Analytics $analytics;
/**
* Context instance.
*
* @var Context Context instance.
*/
private Context $context;
/**
* Plugin_Status instance.
*
* @var Plugin_Status Plugin_Status instance.
*/
private Plugin_Status $plugin_status;
/**
* Constructor.
*
* @param Analytics $analytics Analytics instance.
* @param Context $context Context instance.
* @param Plugin_Status $plugin_status Plugin_Status instance.
*/
public function __construct( Analytics $analytics, Context $context, Plugin_Status $plugin_status ) {
$this->analytics = $analytics;
$this->context = $context;
$this->plugin_status = $plugin_status;
}
/**
* Initializes all hooks.
*
* @since 1.2.0
*/
public function register(): void {
add_filter( 'googlesitekit_amp_gtag_opt', [ $this, 'filter_site_kit_gtag_opt' ] );
if ( $this->is_analytics_module_active() ) {
remove_action( 'web_stories_print_analytics', [ $this->analytics, 'print_analytics_tag' ] );
}
}
/**
* Filters Site Kit's Google Analytics configuration.
*
* @since 1.2.0
*
* @param array|mixed $gtag_opt Array of gtag configuration options.
* @return array|mixed Modified configuration options.
*
* @phpstan-param GtagOpt $gtag_opt
*/
public function filter_site_kit_gtag_opt( $gtag_opt ) {
if (
! \is_array( $gtag_opt ) ||
! isset( $gtag_opt['vars']['gtag_id'] ) ||
! $this->context->is_web_story()
) {
return $gtag_opt;
}
$default_config = $this->analytics->get_default_configuration( $gtag_opt['vars']['gtag_id'] );
$default_config['triggers'] = $default_config['triggers'] ?? [];
$gtag_opt['triggers'] ??= [];
$gtag_opt['triggers'] = array_merge( $default_config['triggers'], $gtag_opt['triggers'] );
return $gtag_opt;
}
/**
* Returns the Site Kit plugin status.
*
* @since 1.2.0
*
* @return array{installed: bool, active: bool, analyticsActive: bool, adsenseActive: bool, analyticsLink: string, adsenseLink: string} Plugin status.
*/
public function get_plugin_status(): array {
$is_installed = \array_key_exists( 'google-site-kit/google-site-kit.php', $this->plugin_status->get_plugins() );
$is_active = $this->is_plugin_active();
$is_analytics_active = $this->is_analytics_module_active();
$is_adsense_active = $this->is_adsense_module_active();
$analytics_link = __( 'https://wordpress.org/plugins/google-site-kit/', 'web-stories' );
$adsense_link = __( 'https://wordpress.org/plugins/google-site-kit/', 'web-stories' );
$dashboard = admin_url( 'admin.php?page=googlesitekit-dashboard' );
$settings = admin_url( 'admin.php?page=googlesitekit-settings' );
if ( $is_active ) {
$dashboard_capability = current_user_can( 'googlesitekit_view_dashboard' ); // phpcs:ignore WordPress.WP.Capabilities.Unknown
$settings_capability = current_user_can( 'googlesitekit_manage_options' ); // phpcs:ignore WordPress.WP.Capabilities.Unknown
// If analytics is active and current user can view dashboard.
if ( $is_analytics_active && $dashboard_capability ) {
$analytics_link = $dashboard;
} elseif ( $settings_capability ) {
$analytics_link = $settings;
} elseif ( $dashboard_capability ) {
$analytics_link = $dashboard;
}
// If adsense is active and current user can view dashboard.
if ( $is_adsense_active && $dashboard_capability ) {
$adsense_link = $dashboard;
} elseif ( $settings_capability ) {
$adsense_link = $settings;
} elseif ( $dashboard_capability ) {
$adsense_link = $dashboard;
}
} elseif ( $is_installed ) {
if ( current_user_can( 'activate_plugin', 'google-site-kit/google-site-kit.php' ) ) {
$analytics_link = admin_url( 'plugins.php' );
$adsense_link = $analytics_link;
}
} elseif ( current_user_can( 'install_plugins' ) ) {
$analytics_link = admin_url(
add_query_arg(
[
's' => rawurlencode( __( 'Site Kit by Google', 'web-stories' ) ),
'tab' => 'search',
],
'plugin-install.php'
)
);
$adsense_link = $analytics_link;
}
return [
'installed' => $is_active || $is_installed,
'active' => $is_active,
'analyticsActive' => $is_analytics_active,
'adsenseActive' => $is_adsense_active,
'analyticsLink' => $analytics_link,
'adsenseLink' => $adsense_link,
];
}
/**
* Determines whether Site Kit is active.
*
* @since 1.2.0
*
* @return bool Whether Site Kit is active.
*/
protected function is_plugin_active(): bool {
return \defined( 'GOOGLESITEKIT_VERSION' );
}
/**
* Determines whether the built-in adsense module in Site Kit is active.
*
* @since 1.8.0
*
* @return bool Whether Site Kit's analytics module is active.
*/
protected function is_adsense_module_active(): bool {
$adsense_module_active = \in_array( 'adsense', $this->get_site_kit_active_modules_option(), true );
$adsense_options = (array) get_option( 'googlesitekit_adsense_settings' );
$adsense_options_client_id = ! empty( $adsense_options['clientID'] );
$adsense_options_use_snippet = ! empty( $adsense_options['useSnippet'] );
$adsense_web_stories_ad_unit = ! empty( $adsense_options['webStoriesAdUnit'] );
return $adsense_module_active && $adsense_options_use_snippet && $adsense_web_stories_ad_unit && $adsense_options_client_id;
}
/**
* Determines whether the built-in Analytics module in Site Kit is active.
*
* @since 1.2.0
*
* @return bool Whether Site Kit's analytics module is active.
*/
protected function is_analytics_module_active(): bool {
$analytics_module_active = \in_array( 'analytics', $this->get_site_kit_active_modules_option(), true );
$analytics_options = (array) get_option( 'googlesitekit_analytics_settings' );
$analytics_use_snippet = ! empty( $analytics_options['useSnippet'] );
return $analytics_module_active && $analytics_use_snippet;
}
/**
* Gets the option containing the active Site Kit modules.
*
* Checks two options as it was renamed at some point in Site Kit.
*
* Bails early if the Site Kit plugin itself is not active.
*
* @since 1.2.0
*
* @see \Google\Site_Kit\Core\Modules\Modules::get_active_modules_option
*
* @return string[] List of active module slugs.
*/
protected function get_site_kit_active_modules_option(): array {
if ( ! $this->is_plugin_active() ) {
return [];
}
/**
* Option value.
*
* @var string[]|false $option
*/
$option = get_option( 'googlesitekit_active_modules' );
if ( \is_array( $option ) ) {
return $option;
}
/**
* Legacy option value.
*
* @var string[]|false $legacy_option
*/
$legacy_option = get_option( 'googlesitekit-active-modules' );
if ( \is_array( $legacy_option ) ) {
return $legacy_option;
}
return [];
}
}