From 4f711d065b55b9b0a336ee0ccac801be99f95cdc Mon Sep 17 00:00:00 2001 From: Aurorum <43215253+Aurorum@users.noreply.github.com> Date: Fri, 2 Feb 2024 23:02:08 +0000 Subject: [PATCH 1/8] Add changelog --- projects/plugins/jetpack/changelog/add-blog-stats-visitors | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 projects/plugins/jetpack/changelog/add-blog-stats-visitors diff --git a/projects/plugins/jetpack/changelog/add-blog-stats-visitors b/projects/plugins/jetpack/changelog/add-blog-stats-visitors new file mode 100644 index 0000000000000..47ef98f81b9a1 --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-blog-stats-visitors @@ -0,0 +1,4 @@ +Significance: minor +Type: enhancement + +Blog Stats Block: allow displaying site's number of visitors. From ec9ffbd5d72e6efb66ba5e735c8f92477839f941 Mon Sep 17 00:00:00 2001 From: Aurorum <43215253+Aurorum@users.noreply.github.com> Date: Fri, 2 Feb 2024 23:05:50 +0000 Subject: [PATCH 2/8] Blog Stats block: Include visitors data --- ...-wpcom-rest-api-v2-endpoint-blog-stats.php | 7 ++-- .../extensions/blocks/blog-stats/block.json | 6 +++- .../blocks/blog-stats/blog-stats.php | 27 ++++++++------- .../extensions/blocks/blog-stats/controls.js | 34 +++++++++++++++++-- .../extensions/blocks/blog-stats/edit.js | 27 +++++++++++---- .../extensions/blocks/blog-stats/editor.scss | 4 +-- .../blocks/blog-stats/test/controls.js | 25 ++++++++++++-- .../test/fixtures/jetpack__blog__stats.json | 1 + 8 files changed, 100 insertions(+), 31 deletions(-) diff --git a/projects/plugins/jetpack/_inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-blog-stats.php b/projects/plugins/jetpack/_inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-blog-stats.php index b127f64ab6b46..3ef40782d57c2 100644 --- a/projects/plugins/jetpack/_inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-blog-stats.php +++ b/projects/plugins/jetpack/_inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-blog-stats.php @@ -63,7 +63,7 @@ public function get_blog_stats( $request ) { ( new WPCOM_Stats() )->get_stats( array( 'fields' => 'stats' ) ) ); - if ( ! isset( $blog_data->stats->views ) ) { + if ( ! isset( $blog_data->stats->views ) || ! isset( $blog_data->stats->visitors ) ) { return false; } @@ -72,8 +72,9 @@ public function get_blog_stats( $request ) { } return array( - 'post-views' => $post_data->views, - 'blog-views' => $blog_data->stats->views, + 'post-views' => $post_data->views, + 'blog-visitors' => $blog_data->stats->visitors, + 'blog-views' => $blog_data->stats->views, ); } } diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/block.json b/projects/plugins/jetpack/extensions/blocks/blog-stats/block.json index a29f588cb4d0e..7a49113967e81 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/block.json +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/block.json @@ -4,7 +4,7 @@ "name": "jetpack/blog-stats", "title": "Blog Stats", "description": "Show a stats counter for your blog.", - "keywords": [ "views", "hits", "analytics", "counter" ], + "keywords": [ "views", "hits", "analytics", "counter", "visitors" ], "version": "1.0", "textdomain": "jetpack", "category": "grow", @@ -31,6 +31,10 @@ "label": { "type": "string" }, + "statsData": { + "type": "string", + "default": "views" + }, "statsOption": { "type": "string", "default": "site" diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php b/projects/plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php index 81ed1209c10b0..78e4600a631fb 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php @@ -44,7 +44,7 @@ function register_block() { function load_assets( $attributes ) { Jetpack_Gutenberg::load_assets_as_required( __DIR__ ); - $views = 0; + $stats = 0; // For when there's no post ID - eg. search pages. if ( $attributes['statsOption'] === 'post' && ! get_the_ID() ) { @@ -71,28 +71,31 @@ function load_assets( $attributes ) { ); if ( isset( $data->views ) ) { - $views = $data->views; + $stats = $data->views; } } else { $data = convert_stats_array_to_object( ( new WPCOM_Stats() )->get_stats( array( 'fields' => 'stats' ) ) ); - if ( isset( $data->stats->views ) ) { - $views = $data->stats->views; + if ( $attributes['statsData'] === 'views' && isset( $data->stats->views ) ) { + $stats = $data->stats->views; + } + + if ( $attributes['statsData'] === 'visitors' && isset( $data->stats->visitors ) ) { + $stats = $data->stats->visitors; } } - $label = $attributes['label'] ? $attributes['label'] : esc_html( + $fallback_label = $attributes['statsData'] === 'visitors' ? esc_html( + _n( 'visitor', 'visitors', $stats, 'jetpack' ) + ) : esc_html( /* Translators: Number of views */ - _n( - 'hit', - 'hits', - $views, - 'jetpack' - ) + _n( 'hit', 'hits', $stats, 'jetpack' ) ); + $label = $attributes['label'] ? $attributes['label'] : $fallback_label; + $wrapper_attributes = \WP_Block_Supports::get_instance()->apply_block_supports(); return sprintf( @@ -100,7 +103,7 @@ function load_assets( $attributes ) { ! empty( $attributes['className'] ) ? ' ' . esc_attr( $attributes['className'] ) : '', ! empty( $wrapper_attributes['class'] ) ? ' ' . esc_attr( $wrapper_attributes['class'] ) : '', ! empty( $wrapper_attributes['style'] ) ? ' style="' . esc_attr( $wrapper_attributes['style'] ) . '"' : '', - esc_html( number_format_i18n( $views ) ), + esc_html( number_format_i18n( $stats ) ), wp_kses_post( $label ) ); } diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/controls.js b/projects/plugins/jetpack/extensions/blocks/blog-stats/controls.js index 3b9a815979325..abe69da2babe1 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/controls.js +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/controls.js @@ -2,9 +2,20 @@ import { PanelBody, RadioControl } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; export function BlogStatsInspectorControls( { attributes, setAttributes } ) { - const { statsOption } = attributes; + const { statsData, statsOption } = attributes; - const RADIO_OPTIONS = [ + const STATS_DATA_RADIO = [ + { + value: 'views', + label: __( 'Views', 'jetpack' ), + }, + { + value: 'visitors', + label: __( 'Visitors', 'jetpack' ), + }, + ]; + + const STATS_OPTION_RADIO = [ { value: 'site', label: __( 'My whole site', 'jetpack' ), @@ -19,10 +30,27 @@ export function BlogStatsInspectorControls( { attributes, setAttributes } ) { <> setAttributes( { statsData: value } ) } + options={ STATS_DATA_RADIO } + help={ __( + 'Views represent site visits, whereas visitors represent unique individuals.', + 'jetpack' + ) } + /> + setAttributes( { statsOption: value } ) } - options={ RADIO_OPTIONS } + options={ STATS_OPTION_RADIO } + disabled={ statsData === 'visitors' } + help={ + statsData === 'visitors' + ? __( 'Visitor counts are not available for individual posts.', 'jetpack' ) + : null + } /> { __( 'Stats are delayed for up to 5 minutes.', 'jetpack' ) } diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js index 1d35626a7267c..61d50aa5e322f 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js @@ -11,10 +11,13 @@ import { InactiveStatsPlaceholder } from './inactive-placeholder'; function BlogStatsEdit( { attributes, className, setAttributes } ) { const { isLoadingModules, isChangingStatus, isModuleActive, changeStatus } = useModuleStatus( 'stats' ); - const { label, statsOption } = attributes; + const { label, statsData, statsOption } = attributes; const [ blogViews, setBlogViews ] = useState( null ); + const [ blogVisitors, setBlogVisitors ] = useState(); const [ postViews, setPostViews ] = useState(); - const views = statsOption === 'post' ? postViews : blogViews; + + const blogStats = statsData === 'views' ? blogViews : blogVisitors; + const stats = statsOption === 'post' ? postViews : blogStats; const postId = useSelect( select => select( 'core/editor' ).getCurrentPostId(), [] ); @@ -26,6 +29,7 @@ function BlogStatsEdit( { attributes, className, setAttributes } ) { : '/wpcom/v2/blog-stats', } ).then( response => { setBlogViews( response[ 'blog-views' ] ); + setBlogVisitors( response[ 'blog-visitors' ] ); // Display "12,345" as an obvious placeholder when we have no Post ID. // Applies to widgets, FSE templates etc. @@ -34,6 +38,13 @@ function BlogStatsEdit( { attributes, className, setAttributes } ) { } }, [ postId, isModuleActive ] ); + // We don't collect visitor data for individual posts. + useEffect( () => { + if ( statsData === 'visitors' ) { + setAttributes( { statsOption: 'site' } ); + } + }, [ statsData, setAttributes ] ); + if ( ! isModuleActive && ! isLoadingModules ) { return ( @@ -55,13 +71,10 @@ function BlogStatsEdit( { attributes, className, setAttributes } ) {

{ __( 'Loading stats…', 'jetpack' ) }

) : (

- { numberFormat( views ) } + { numberFormat( stats ) } setAttributes( { label: newLabel } ) } diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/editor.scss b/projects/plugins/jetpack/extensions/blocks/blog-stats/editor.scss index aa02e1a34ac55..89cf6e2db37cf 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/editor.scss +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/editor.scss @@ -1,5 +1,3 @@ -@import '@automattic/jetpack-base-styles/gutenberg-base-styles'; - .wp-block-jetpack-blog-stats { .jetpack-blog-stats__loading { // Same as RichText component's placeholder opacity from Core. @@ -12,5 +10,5 @@ } .jetpack-blog-stats__delay-notice { - color: $gray-700; + font-size: 12px; } diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/test/controls.js b/projects/plugins/jetpack/extensions/blocks/blog-stats/test/controls.js index 65081051304e4..69637cfd20e97 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/test/controls.js +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/test/controls.js @@ -5,6 +5,7 @@ import { BlogStatsInspectorControls } from '../controls'; describe( 'BlogStatsControls', () => { const defaultAttributes = { label: 'hits', + statsData: 'views', statsOption: 'site', }; @@ -19,10 +20,30 @@ describe( 'BlogStatsControls', () => { } ); describe( 'Inspector settings', () => { - test( 'loads and displays settings', () => { + test( 'loads and displays views or visitors settings', () => { + render( ); + + expect( screen.getByLabelText( 'Views' ) ).toBeInTheDocument(); + expect( screen.getByLabelText( 'Visitors' ) ).toBeInTheDocument(); + } ); + + test( 'defaults stats data to views', () => { + render( ); + + expect( screen.getByLabelText( 'Views' ) ).toBeChecked(); + } ); + + test( 'sets the statsData attribute', async () => { + const user = userEvent.setup(); + render( ); + await user.click( screen.getByLabelText( 'Visitors' ) ); + + expect( setAttributes ).toHaveBeenCalledWith( { statsData: 'visitors' } ); + } ); + + test( 'loads and displays option settings', () => { render( ); - expect( screen.getByText( 'Settings' ) ).toBeInTheDocument(); expect( screen.getByLabelText( 'My whole site' ) ).toBeInTheDocument(); expect( screen.getByLabelText( 'This individual post' ) ).toBeInTheDocument(); } ); diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/test/fixtures/jetpack__blog__stats.json b/projects/plugins/jetpack/extensions/blocks/blog-stats/test/fixtures/jetpack__blog__stats.json index ee897e0720944..7d96889e5e41c 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/test/fixtures/jetpack__blog__stats.json +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/test/fixtures/jetpack__blog__stats.json @@ -4,6 +4,7 @@ "name": "jetpack/blog-stats", "isValid": true, "attributes": { + "statsData": "views", "statsOption": "site" }, "innerBlocks": [], From 6e4ad75729656c6d34df4d49e810f1be981d955d Mon Sep 17 00:00:00 2001 From: Aurorum <43215253+Aurorum@users.noreply.github.com> Date: Sun, 4 Feb 2024 10:46:40 +0000 Subject: [PATCH 3/8] Remove unneeded class name --- .../plugins/jetpack/extensions/blocks/blog-stats/controls.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/controls.js b/projects/plugins/jetpack/extensions/blocks/blog-stats/controls.js index abe69da2babe1..25da773f91709 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/controls.js +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/controls.js @@ -40,7 +40,6 @@ export function BlogStatsInspectorControls( { attributes, setAttributes } ) { ) } /> setAttributes( { statsOption: value } ) } @@ -48,7 +47,7 @@ export function BlogStatsInspectorControls( { attributes, setAttributes } ) { disabled={ statsData === 'visitors' } help={ statsData === 'visitors' - ? __( 'Visitor counts are not available for individual posts.', 'jetpack' ) + ? __( "Visitor counts aren't available for individual posts.", 'jetpack' ) : null } /> From 54d78c51f80f0070531c357d75303eae11d32fff Mon Sep 17 00:00:00 2001 From: Jasper Kang Date: Mon, 5 Feb 2024 10:40:10 +1300 Subject: [PATCH 4/8] Update projects/plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php --- .../plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php b/projects/plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php index 78e4600a631fb..6f39903b90168 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/blog-stats.php @@ -88,6 +88,7 @@ function load_assets( $attributes ) { } $fallback_label = $attributes['statsData'] === 'visitors' ? esc_html( + /* Translators: Number of visitors */ _n( 'visitor', 'visitors', $stats, 'jetpack' ) ) : esc_html( /* Translators: Number of views */ From 924d9bead4bc06b53461f874bef2cd95eb235d0e Mon Sep 17 00:00:00 2001 From: Aurorum <43215253+Aurorum@users.noreply.github.com> Date: Sun, 4 Feb 2024 21:49:22 +0000 Subject: [PATCH 5/8] Try fix tests --- .../extensions/blocks/blog-stats/edit.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js index 61d50aa5e322f..525f41cb01265 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js @@ -55,10 +55,20 @@ function BlogStatsEdit( { attributes, className, setAttributes } ) { ); } - const visitorsPlaceholder = _n( 'visitor', 'visitors', parseInt( stats ), 'jetpack' ); - - /* Translators: Number of views */ - const viewsPlaceholder = _n( 'hit', 'hits', parseInt( stats ), 'jetpack' ); + const visitorsPlaceholder = _n( + /* Translators: Number of visitors */ + 'visitor', + 'visitors', + parseInt( stats ), + 'jetpack' + ); + const viewsPlaceholder = _n( + /* Translators: Number of views */ + 'hit', + 'hits', + parseInt( stats ), + 'jetpack' + ); return ( <> From 2057abc27e5db2d7f21f01bcbab8e616c82bcec4 Mon Sep 17 00:00:00 2001 From: Aurorum <43215253+Aurorum@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:26:14 +0000 Subject: [PATCH 6/8] Fix translator comment --- .../extensions/blocks/blog-stats/edit.js | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js index 525f41cb01265..32bb84bf68fcd 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js @@ -55,20 +55,11 @@ function BlogStatsEdit( { attributes, className, setAttributes } ) { ); } - const visitorsPlaceholder = _n( - /* Translators: Number of visitors */ - 'visitor', - 'visitors', - parseInt( stats ), - 'jetpack' - ); - const viewsPlaceholder = _n( - /* Translators: Number of views */ - 'hit', - 'hits', - parseInt( stats ), - 'jetpack' - ); + /* Translators: Number of visitors */ + const visitorsPlaceholder = _n( 'visitor', 'visitors', parseInt( stats ), 'jetpack', 0 ); + + /* Translators: Number of views */ + const viewsPlaceholder = _n( 'hit', 'hits', parseInt( stats ), 'jetpack', 0 ); return ( <> From f8a461dc805e0156609f219e55b9ca64f3462ea5 Mon Sep 17 00:00:00 2001 From: Aurorum <43215253+Aurorum@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:52:13 +0000 Subject: [PATCH 7/8] Update translator string --- .../extensions/blocks/blog-stats/edit.js | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js index 32bb84bf68fcd..8234185d4f28d 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js @@ -55,11 +55,23 @@ function BlogStatsEdit( { attributes, className, setAttributes } ) { ); } - /* Translators: Number of visitors */ - const visitorsPlaceholder = _n( 'visitor', 'visitors', parseInt( stats ), 'jetpack', 0 ); + const visitorsPlaceholder = _n( + /* Translators: Number of visitors */ + 'visitor', + 'visitors', + parseInt( stats ), + 'jetpack', + 0 + ); - /* Translators: Number of views */ - const viewsPlaceholder = _n( 'hit', 'hits', parseInt( stats ), 'jetpack', 0 ); + const viewsPlaceholder = _n( + /* Translators: Number of views */ + 'hit', + 'hits', + parseInt( stats ), + 'jetpack', + 0 + ); return ( <> From 3dbaa4c5a1750b406b63e18cc9fdd122cf1616a2 Mon Sep 17 00:00:00 2001 From: Aurorum <43215253+Aurorum@users.noreply.github.com> Date: Tue, 6 Feb 2024 22:22:13 +0000 Subject: [PATCH 8/8] Fix comments again --- .../extensions/blocks/blog-stats/edit.js | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js index 8234185d4f28d..789673de74d83 100644 --- a/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js +++ b/projects/plugins/jetpack/extensions/blocks/blog-stats/edit.js @@ -55,23 +55,13 @@ function BlogStatsEdit( { attributes, className, setAttributes } ) { ); } - const visitorsPlaceholder = _n( + const visitorsPlaceholder = /* Translators: Number of visitors */ - 'visitor', - 'visitors', - parseInt( stats ), - 'jetpack', - 0 - ); + _n( 'visitor', 'visitors', parseInt( stats ), 'jetpack', 0 ); - const viewsPlaceholder = _n( + const viewsPlaceholder = /* Translators: Number of views */ - 'hit', - 'hits', - parseInt( stats ), - 'jetpack', - 0 - ); + _n( 'hit', 'hits', parseInt( stats ), 'jetpack', 0 ); return ( <>