PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-stats-admin / src / class-dashboard.php
jetpack / jetpack_vendor / automattic / jetpack-stats-admin / src Last commit date
class-admin-post-list-column.php 2 days ago class-dashboard.php 2 days ago class-main.php 2 days ago class-notices.php 8 months ago class-odyssey-assets.php 2 weeks ago class-odyssey-config-data.php 2 days ago class-rest-controller.php 1 month ago class-wp-dashboard-odyssey-widget.php 2 years ago class-wpcom-client.php 2 days ago
class-dashboard.php
187 lines
1 <?php
2 /**
3 * A class that adds a stats dashboard to wp-admin.
4 *
5 * @package automattic/jetpack-stats-admin
6 */
7
8 namespace Automattic\Jetpack\Stats_Admin;
9
10 use Automattic\Jetpack\Connection\Initial_State as Connection_Initial_State;
11 use Automattic\Jetpack\Stats\Options as Stats_Options;
12
13 /**
14 * Responsible for adding a stats dashboard to wp-admin.
15 *
16 * @package jetpack-stats-admin
17 */
18 class Dashboard {
19 /**
20 * Whether the class has been initialized
21 *
22 * @var boolean
23 */
24 private static $initialized = false;
25
26 /**
27 * Priority for the dashboard menu
28 * For Jetpack sites: Jetpack uses 998 and 'Admin_Menu' uses 1000, so we need to use 999.
29 * For simple site: the value is overriden in a child class with value 100000 to wait for all menus to be registered.
30 *
31 * @var int
32 */
33 protected $menu_priority = 999;
34
35 /**
36 * Init Stats dashboard.
37 */
38 public static function init() {
39 if ( ! self::$initialized ) {
40 self::$initialized = true;
41 ( new self() )->init_hooks();
42 }
43 }
44
45 /**
46 * Initialize the hooks.
47 */
48 public function init_hooks() {
49 self::$initialized = true;
50 // Jetpack uses 998 and 'Admin_Menu' uses 1000.
51 add_action( 'admin_menu', array( $this, 'add_wp_admin_menu' ), $this->menu_priority );
52 }
53
54 /**
55 * Add a "Stats" top-level admin menu.
56 *
57 * @return void
58 */
59 public function add_wp_admin_menu() {
60 /**
61 * Disable this menu for dashboard.wordpress.com because older versions of Jetpack need to fetch the old Stats UI.
62 *
63 * If this menu is registered, it will conflict with the back-end and break non-odyssey Stats.
64 */
65 if ( defined( 'IS_WPCOM' ) && IS_WPCOM && 120742 === get_current_blog_id() ) {
66 return;
67 }
68
69 $page_suffix = add_menu_page(
70 __( 'Stats', 'jetpack-stats-admin' ),
71 _x( 'Stats', 'product name shown in menu', 'jetpack-stats-admin' ),
72 $this->get_capability(),
73 'stats',
74 array( $this, 'render' ),
75 'dashicons-chart-bar',
76 2
77 );
78
79 if ( $page_suffix ) {
80 add_action( 'load-' . $page_suffix, array( $this, 'admin_init' ) );
81 }
82 }
83
84 /**
85 * Capability a user needs to reach the dashboard.
86 *
87 * Until the site is connected the page exists to pick a plan and connect, which only a user
88 * who can manage the connection can act on. Once connected it is a reporting page, open to
89 * everyone allowed to view stats.
90 *
91 * Pre-connection that is `jetpack_connect`: it maps to `manage_options` on a normal site,
92 * but is `do_not_allow` in offline mode and honours the same multisite/filter rules as the
93 * register endpoint, so the menu is not offered where the connection cannot be completed.
94 *
95 * @return string
96 */
97 protected function get_capability() {
98 return Main::is_site_connected() ? 'view_stats' : 'jetpack_connect';
99 }
100
101 /**
102 * Override render funtion
103 */
104 public function render() {
105 // Record the number of views of the stats dashboard on the initial several loads for the
106 // purpose of showing feedback notice. Views before the site is connected show the plan
107 // choice rather than the dashboard, and there is nothing to give feedback on yet.
108 $views = intval( Stats_Options::get_option( 'views' ) ) + 1;
109 if ( $views <= Notices::VIEWS_TO_SHOW_FEEDBACK && Main::is_site_connected() ) {
110 Stats_Options::set_option( 'views', $views );
111 }
112
113 ?>
114 <div id="wpcom" class="jp-stats-dashboard" style="min-height: calc(100vh - 100px);">
115 <div class="hide-if-js"><?php esc_html_e( 'Your Jetpack Stats dashboard requires JavaScript to function properly.', 'jetpack-stats-admin' ); ?></div>
116 <div class="hide-if-no-js" style="height: 100%">
117 <img
118 class="jp-stats-dashboard-loading-spinner"
119 width="32"
120 height="32"
121 style="position: absolute; left: 50%; top: 50%;"
122 alt=<?php echo esc_attr( __( 'Loading', 'jetpack-stats-admin' ) ); ?>
123 src="//en.wordpress.com/i/loading/loading-64.gif"
124 />
125 </div>
126 </div>
127 <?php
128 }
129
130 /**
131 * The dashboard bootstrap: load the icon sprite, and keep in-app links inside the dashboard.
132 *
133 * @return string
134 */
135 private function get_bootstrap_script() {
136 return <<<'JS'
137 jQuery(document).ready(function($) {
138 // Load SVG sprite.
139 $.get("https://widgets.wp.com/odyssey-stats/common/gridicons-506499ddac13811fee8e.svg", function(data) {
140 var div = document.createElement("div");
141 div.innerHTML = new XMLSerializer().serializeToString(data.documentElement);
142 div.style = 'display: none';
143 document.body.insertBefore(div, document.body.childNodes[0]);
144 });
145 // we intercept on all anchor tags and change it to hashbang style.
146 $("#wpcom").on('click', 'a', function (e) {
147 const link = e && e.currentTarget && e.currentTarget.attributes && e.currentTarget.attributes.href && e.currentTarget.attributes.href.value;
148 if( link && link.startsWith( '/stats' ) ) {
149 location.hash = `#!${link}`;
150 return false;
151 }
152 });
153 });
154 JS;
155 }
156
157 /**
158 * Initialize the admin resources.
159 */
160 public function admin_init() {
161 add_action( 'admin_enqueue_scripts', array( $this, 'load_admin_scripts' ) );
162 }
163
164 /**
165 * Load the admin scripts.
166 */
167 public function load_admin_scripts() {
168 ( new Odyssey_Assets() )->load_admin_scripts( 'jp-stats-dashboard', 'build.min', array( 'config_variable_name' => 'jetpackStatsOdysseyAppConfigData' ) );
169
170 // The bootstrap runs on jQuery, which the Odyssey bundle does not depend on. It gets its own
171 // handle rather than jQuery being added to that bundle, which the dashboard widget shares
172 // and which has no use for it.
173 wp_register_script( 'jp-stats-dashboard-bootstrap', false, array( 'jquery' ), Main::VERSION, true );
174 wp_enqueue_script( 'jp-stats-dashboard-bootstrap' );
175 wp_add_inline_script( 'jp-stats-dashboard-bootstrap', $this->get_bootstrap_script() );
176
177 // The app is served from our CDN and so cannot bundle the connection package. Print the
178 // state Search and Protect print on their own pages, so it can read the connection status
179 // and register the site through the connection REST API itself. Connected sites fetch
180 // `jetpack/v4/connection` over REST instead, and must not receive registrationNonce and
181 // the connected-plugin list on a page that `view_stats` users can open.
182 if ( ! Main::is_site_connected() ) {
183 Connection_Initial_State::render_script( 'jp-stats-dashboard' );
184 }
185 }
186 }
187