Commit realizado el 12:13:52 08-04-2024
This commit is contained in:
285
wp-content/plugins/web-stories/includes/Analytics.php
Normal file
285
wp-content/plugins/web-stories/includes/Analytics.php
Normal file
@@ -0,0 +1,285 @@
|
||||
<?php
|
||||
/**
|
||||
* Class Analytics
|
||||
*
|
||||
* @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;
|
||||
|
||||
/**
|
||||
* Class Analytics
|
||||
*/
|
||||
class Analytics extends Service_Base {
|
||||
/**
|
||||
* Settings instance.
|
||||
*
|
||||
* @var Settings Settings instance.
|
||||
*/
|
||||
private Settings $settings;
|
||||
|
||||
/**
|
||||
* Analytics constructor.
|
||||
*
|
||||
* @since 1.12.0
|
||||
*
|
||||
* @param Settings $settings Settings instance.
|
||||
* @return void
|
||||
*/
|
||||
public function __construct( Settings $settings ) {
|
||||
$this->settings = $settings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes all hooks.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function register(): void {
|
||||
add_action( 'web_stories_print_analytics', [ $this, 'print_analytics_tag' ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Google Analytics tracking ID.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @return string Tracking ID.
|
||||
*/
|
||||
public function get_tracking_id(): string {
|
||||
/**
|
||||
* Tracking ID.
|
||||
*
|
||||
* @var string $tracking_id
|
||||
*/
|
||||
$tracking_id = $this->settings->get_setting( $this->settings::SETTING_NAME_TRACKING_ID );
|
||||
|
||||
// For some reasons, some sites use the plugin's own tracking ID (as used in the admin)
|
||||
// for their stories. Prevent accidental erroneous tracking in such a case.
|
||||
if ( Tracking::TRACKING_ID === $tracking_id ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return $tracking_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default analytics configuration.
|
||||
*
|
||||
* Note: variables in single quotes will be substituted by <amp-analytics>.
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
||||
*
|
||||
* @see https://github.com/ampproject/amphtml/blob/main/docs/spec/amp-var-substitutions.md
|
||||
*
|
||||
* @param string $tracking_id Tracking ID.
|
||||
* @return array<string, array<string, mixed>> <amp-analytics> configuration.
|
||||
*/
|
||||
public function get_default_configuration( string $tracking_id ): array {
|
||||
$config = [
|
||||
'vars' => [
|
||||
'gtag_id' => $tracking_id,
|
||||
'config' => [
|
||||
$tracking_id => [ 'groups' => 'default' ],
|
||||
],
|
||||
],
|
||||
'triggers' => [
|
||||
// Fired when a story page becomes visible.
|
||||
'storyProgress' => [
|
||||
'on' => 'story-page-visible',
|
||||
'request' => 'event',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_progress',
|
||||
'event_category' => '${title}',
|
||||
'event_label' => '${storyPageIndex}',
|
||||
'event_value' => '${storyProgress}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
// Fired when the last page in the story is shown to the user.
|
||||
// This can be used to measure completion rate.
|
||||
'storyEnd' => [
|
||||
'on' => 'story-last-page-visible',
|
||||
'request' => 'event',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_complete',
|
||||
'event_category' => '${title}',
|
||||
'event_label' => '${storyPageCount}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
// Fired when clicking an element that opens a tooltip (<a> or <amp-twitter>).
|
||||
'trackFocusState' => [
|
||||
'on' => 'story-focus',
|
||||
'tagName' => 'a',
|
||||
'request' => 'click ',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_focus',
|
||||
'event_category' => '${title}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
// Fired when clicking on a tooltip.
|
||||
'trackClickThrough' => [
|
||||
'on' => 'story-click-through',
|
||||
'tagName' => 'a',
|
||||
'request' => 'click ',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_click_through',
|
||||
'event_category' => '${title}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
// Fired when opening a drawer or dialog inside a story (e.g. page attachment).
|
||||
'storyOpen' => [
|
||||
'on' => 'story-open',
|
||||
'request' => 'event',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_open',
|
||||
'event_category' => '${title}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
// Fired when closing a drawer or dialog inside a story (e.g. page attachment).
|
||||
'storyClose' => [
|
||||
'on' => 'story-close',
|
||||
'request' => 'event',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_close',
|
||||
'event_category' => '${title}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
// Fired when the user initiates an interaction to mute the audio for the current story.
|
||||
'audioMuted' => [
|
||||
'on' => 'story-audio-muted',
|
||||
'request' => 'event',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_audio_muted',
|
||||
'event_category' => '${title}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
// Fired when the user initiates an interaction to unmute the audio for the current story.
|
||||
'audioUnmuted' => [
|
||||
'on' => 'story-audio-unmuted',
|
||||
'request' => 'event',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_audio_unmuted',
|
||||
'event_category' => '${title}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
// Fired when a page attachment is opened by the user.
|
||||
'pageAttachmentEnter' => [
|
||||
'on' => 'story-page-attachment-enter',
|
||||
'request' => 'event',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_page_attachment_enter',
|
||||
'event_category' => '${title}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
// Fired when a page attachment is dismissed by the user.
|
||||
'pageAttachmentExit' => [
|
||||
'on' => 'story-page-attachment-exit',
|
||||
'request' => 'event',
|
||||
'vars' => [
|
||||
'event_name' => 'custom',
|
||||
'event_action' => 'story_page_attachment_exit',
|
||||
'event_category' => '${title}',
|
||||
'send_to' => $tracking_id,
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
/**
|
||||
* Filters the Web Stories Google Analytics configuration.
|
||||
*
|
||||
* Only used when not using <amp-story-auto-analytics>, which is the default.
|
||||
*
|
||||
* @param array $config Analytics configuration.
|
||||
*/
|
||||
return apply_filters( 'web_stories_analytics_configuration', $config );
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints the analytics tag for single stories.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function print_analytics_tag(): void {
|
||||
$tracking_id = $this->get_tracking_id();
|
||||
|
||||
if ( ! $tracking_id ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( $this->settings->get_setting( $this->settings::SETTING_NAME_USING_LEGACY_ANALYTICS ) ) {
|
||||
$this->print_amp_analytics_tag( $tracking_id );
|
||||
} else {
|
||||
$this->print_amp_story_auto_analytics_tag( $tracking_id );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints the legacy <amp-analytics> tag for single stories.
|
||||
*
|
||||
* @since 1.12.0
|
||||
*
|
||||
* @param string $tracking_id Tracking ID.
|
||||
*/
|
||||
private function print_amp_analytics_tag( string $tracking_id ): void {
|
||||
?>
|
||||
<amp-analytics type="gtag" data-credentials="include">
|
||||
<script type="application/json">
|
||||
<?php echo wp_json_encode( $this->get_default_configuration( $tracking_id ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
||||
</script>
|
||||
</amp-analytics>
|
||||
<?php
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints the <amp-story-auto-analytics> tag for single stories.
|
||||
*
|
||||
* @since 1.12.0
|
||||
*
|
||||
* @param string $tracking_id Tracking ID.
|
||||
*/
|
||||
private function print_amp_story_auto_analytics_tag( string $tracking_id ): void {
|
||||
?>
|
||||
<amp-story-auto-analytics gtag-id="<?php echo esc_attr( $tracking_id ); ?>"></amp-story-auto-analytics>
|
||||
<?php
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user