PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 0.9.6
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v0.9.6
1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 0.8.7 All 34 releases
desktop-mode / includes / widgets / widget-site-views.php

widget-site-views.php in OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin 0.9.6, at includes/widgets/widget-site-views.php

151 lines 4.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Desktop Mode — Site Views Widget.
4 *
5 * Sparkline graph of page views over the last 7 days with
6 * week-over-week delta. Tries Jetpack Stats first, falls back
7 * to a _post_views_YYYY-MM-DD meta-key aggregator.
8 *
9 * Refresh: every 10 minutes.
10 * Requires: Desktop Mode 0.18.0+ (desktop_mode_register_widget).
11 *
12 * @package WPDesktopMode
13 * @since 0.26.0
14 */
15
16 defined( 'ABSPATH' ) || exit;
17
18 /**
19 * Register the REST endpoint that aggregates per-post view counts
20 * from the _post_views_YYYY-MM-DD meta key (plain-WP fallback).
21 *
22 * Route: GET /desktop-mode/v1/site-views-meta
23 * Permission: edit_posts.
24 *
25 * @since 0.26.0
26 */
27 function desktop_mode_register_site_views_rest_route() {
28 register_rest_route(
29 'desktop-mode/v1',
30 '/site-views-meta',
31 array(
32 'methods' => WP_REST_Server::READABLE,
33 'callback' => 'desktop_mode_site_views_meta_callback',
34 'permission_callback' => static function () {
35 return current_user_can( 'edit_posts' );
36 },
37 )
38 );
39 }
40 add_action( 'rest_api_init', 'desktop_mode_register_site_views_rest_route' );
41
42 /**
43 * Aggregate _post_views_YYYY-MM-DD meta across all posts for 14 days.
44 *
45 * @param WP_REST_Request $request REST request.
46 * @return array
47 */
48 function desktop_mode_site_views_meta_callback( $request ) {
49 global $wpdb;
50
51 $rows = array();
52 $today = current_time( 'Y-m-d' );
53
54 for ( $i = 0; $i < 14; $i++ ) {
55 $date = gmdate( 'Y-m-d', strtotime( $today . ' -' . $i . ' days' ) );
56 $meta_key = '_post_views_' . $date;
57 $total = (int) $wpdb->get_var(
58 $wpdb->prepare(
59 "SELECT COALESCE( SUM( CAST( meta_value AS UNSIGNED ) ), 0 )
60 FROM {$wpdb->postmeta}
61 WHERE meta_key = %s",
62 $meta_key
63 )
64 );
65 $rows[] = array(
66 'date' => $date,
67 'views' => $total,
68 );
69 }
70
71 $has_data = array_sum( array_column( $rows, 'views' ) ) > 0;
72
73 return array(
74 'source' => 'post-meta',
75 'has_data' => $has_data,
76 'days' => array_reverse( $rows ),
77 );
78 }
79
80 /**
81 * Register the JS + CSS assets.
82 *
83 * @since 0.26.0
84 */
85 function desktop_mode_register_site_views_widget_assets() {
86 $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
87 $version = defined( 'DESKTOP_MODE_VERSION' ) ? DESKTOP_MODE_VERSION : '0';
88
89 $js_path = DESKTOP_MODE_DIR . 'assets/js/widget-site-views' . $suffix . '.js';
90 $css_path = DESKTOP_MODE_DIR . 'assets/js/widget-site-views' . $suffix . '.css';
91
92 wp_register_style(
93 'desktop-mode-site-views-widget',
94 DESKTOP_MODE_URL . 'assets/js/widget-site-views' . $suffix . '.css',
95 array(),
96 file_exists( $css_path ) ? (string) filemtime( $css_path ) : $version
97 );
98
99 wp_register_script(
100 'desktop-mode-site-views-widget',
101 DESKTOP_MODE_URL . 'assets/js/widget-site-views' . $suffix . '.js',
102 array( 'wp-api-fetch' ),
103 file_exists( $js_path ) ? (string) filemtime( $js_path ) : $version,
104 true
105 );
106 }
107 add_action( 'init', 'desktop_mode_register_site_views_widget_assets', 5 );
108
109 /**
110 * Eagerly enqueue the CSS on shell pages.
111 *
112 * @since 0.26.0
113 */
114 function desktop_mode_enqueue_site_views_widget_styles() {
115 if ( function_exists( 'desktop_mode_is_enabled' ) && ! desktop_mode_is_enabled() ) {
116 return;
117 }
118 if ( function_exists( 'desktop_mode_is_chromeless_request' ) && desktop_mode_is_chromeless_request() ) {
119 return;
120 }
121 wp_enqueue_style( 'desktop-mode-site-views-widget' );
122 }
123 add_action( 'admin_enqueue_scripts', 'desktop_mode_enqueue_site_views_widget_styles', 20 );
124
125 /**
126 * Register the widget definition.
127 *
128 * @since 0.26.0
129 */
130 function desktop_mode_register_site_views_widget() {
131 if ( ! function_exists( 'desktop_mode_register_widget' ) ) {
132 return;
133 }
134 desktop_mode_register_widget(
135 'desktop-mode/site-views',
136 array(
137 'label' => __( 'Site Views', 'desktop-mode' ),
138 'description' => __( 'Sparkline of page views over the last 7 days with week-over-week delta.', 'desktop-mode' ),
139 'icon' => 'dashicons-chart-area',
140 'script' => 'desktop-mode-site-views-widget',
141 'movable' => true,
142 'resizable' => true,
143 'min_width' => 240,
144 'min_height' => 160,
145 'default_width' => 300,
146 'default_height' => 200,
147 )
148 );
149 }
150 add_action( 'init', 'desktop_mode_register_site_views_widget', 6 );
151