PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.9-a.7
Jetpack – WP Security, Backup, Speed, & Growth v15.9-a.7
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 / modules / notes.php
jetpack / modules Last commit date
canonical-urls 2 months ago carousel 2 days ago comment-likes 6 months ago comments 1 week ago custom-post-types 3 months ago external-media 6 months ago google-fonts 4 months ago gravatar 5 years ago infinite-scroll 1 week ago likes 1 week ago markdown 1 week ago memberships 1 week ago photon-cdn 1 month ago plugin-search 4 weeks ago post-by-email 6 months ago related-posts 2 days ago scan 2 months ago seo-tools 1 week ago sharedaddy 1 week ago shortcodes 1 week ago shortlinks 1 week ago simple-payments 6 months ago site-icon 6 months ago sitemaps 1 week ago stats 5 months ago subscriptions 2 days ago theme-tools 2 weeks ago tiled-gallery 1 week ago verification-tools 2 weeks ago videopress 1 week ago widget-visibility 1 week ago widgets 2 days ago woocommerce-analytics 1 month ago wordads 1 month ago wpcom-tos 5 months ago account-protection.php 1 month ago blaze.php 6 months ago blocks.php 6 months ago canonical-urls.php 3 months ago carousel.php 6 months ago comment-likes.php 6 months ago comments.php 2 months ago contact-form.php 6 months ago copy-post.php 2 weeks ago custom-content-types.php 1 month ago google-fonts.php 1 month ago gravatar-hovercards.php 1 week ago infinite-scroll.php 6 months ago json-api.php 6 months ago latex.php 1 week ago likes.php 4 weeks ago markdown.php 6 months ago module-extras.php 6 months ago module-headings.php 1 week ago module-info.php 3 months ago monitor.php 2 days ago notes.php 5 months ago photon-cdn.php 6 months ago photon.php 6 months ago plugin-search.php 4 weeks ago post-by-email.php 1 month ago post-list.php 6 months ago protect.php 1 month ago publicize.php 6 months ago related-posts.php 2 weeks ago search.php 6 months ago seo-tools.php 6 months ago sharedaddy.php 3 months ago shortcodes.php 6 months ago shortlinks.php 2 weeks ago simple-payments.php 6 months ago sitemaps.php 6 months ago sso.php 6 months ago stats.php 1 week ago subscriptions.php 1 week ago theme-tools.php 6 months ago tiled-gallery.php 6 months ago vaultpress.php 6 months ago verification-tools.php 1 month ago videopress.php 6 months ago waf.php 6 months ago widget-visibility.php 6 months ago widgets.php 6 months ago woocommerce-analytics.php 6 months ago wordads.php 6 months ago wpcom-reader.php 3 months ago wpgroho.js 1 year ago
notes.php
265 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Module Name: Notifications
4 * Module Description: Receive real‑time notifications about site activity across your devices.
5 * Sort Order: 13
6 * First Introduced: 1.9
7 * Requires Connection: Yes
8 * Requires User Connection: Yes
9 * Auto Activate: Yes
10 * Module Tags: Other
11 * Feature: General
12 * Additional Search Queries: notification, notifications, toolbar, adminbar, push, comments
13 *
14 * @package automattic/jetpack
15 */
16
17 use Automattic\Jetpack\Connection\Manager as Connection_Manager;
18 use Automattic\Jetpack\Status\Host;
19
20 if ( ! defined( 'ABSPATH' ) ) {
21 exit( 0 );
22 }
23
24 if ( ! defined( 'JETPACK_NOTES__CACHE_BUSTER' ) ) {
25 define( 'JETPACK_NOTES__CACHE_BUSTER', JETPACK__VERSION . '-' . gmdate( 'oW' ) . '-lite' );
26 }
27
28 /**
29 * Notifications class.
30 */
31 class Jetpack_Notifications {
32 /**
33 * Jetpack object.
34 *
35 * @var bool|Jetpack Jetpack object.
36 */
37 public $jetpack = false;
38
39 /**
40 * Singleton
41 *
42 * @static
43 */
44 public static function init() {
45 static $instance = array();
46
47 if ( ! $instance ) {
48 $instance[0] = new Jetpack_Notifications();
49 }
50
51 return $instance[0];
52 }
53
54 /**
55 * Constructor.
56 */
57 private function __construct() {
58 $this->jetpack = Jetpack::init();
59
60 add_action( 'init', array( $this, 'action_init' ) );
61 }
62
63 /**
64 * Adds s0.wp.com to a file path.
65 *
66 * @param string $file File path.
67 *
68 * @return string
69 */
70 public function wpcom_static_url( $file ) {
71 return 'https://s0.wp.com' . $file;
72 }
73
74 /**
75 * Init the notifications admin bar.
76 *
77 * @return void
78 */
79 public function action_init() {
80 if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
81 return;
82 }
83
84 if ( ! has_filter( 'show_admin_bar', '__return_true' ) && ! is_user_logged_in() ) {
85 return;
86 }
87
88 // Do not show notifications in the Site Editor, which is always in fullscreen mode.
89 global $pagenow;
90
91 // Pre 13.7 pages that still need to be supported if < 13.7 is
92 // still installed.
93 $allowed_old_pages = array( 'admin.php', 'themes.php' );
94 $is_old_site_editor_page = in_array( $pagenow, $allowed_old_pages, true ) && isset( $_GET['page'] ) && 'gutenberg-edit-site' === $_GET['page']; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
95 // For Gutenberg > 13.7, the core `site-editor.php` route is used instead
96 $is_site_editor_page = 'site-editor.php' === $pagenow;
97
98 if ( $is_site_editor_page || $is_old_site_editor_page ) {
99 return;
100 }
101
102 add_action( 'admin_bar_menu', array( $this, 'admin_bar_menu' ), 120 );
103 add_action( 'wp_head', array( $this, 'styles_and_scripts' ), 120 );
104 add_action( 'admin_head', array( $this, 'styles_and_scripts' ) );
105 }
106
107 /**
108 * Enqueues and registers styles/scripts for notifications.
109 *
110 * @return void
111 */
112 public function styles_and_scripts() {
113 if ( self::is_block_editor() ) {
114 return;
115 }
116 $is_rtl = is_rtl();
117
118 if ( ( new Host() )->is_woa_site() ) {
119 /**
120 * Can be used to force Notifications to display in RTL style.
121 *
122 * @module notes
123 *
124 * @since 4.8.0
125 *
126 * @param bool true Should notifications be displayed in RTL style. Defaults to false.
127 */
128 $is_rtl = apply_filters( 'a8c_wpcom_masterbar_enqueue_rtl_notification_styles', false );
129 }
130
131 if ( ! $is_rtl ) {
132 wp_enqueue_style( 'wpcom-notes-admin-bar', $this->wpcom_static_url( '/wp-content/mu-plugins/notes/admin-bar-v2.css' ), array( 'admin-bar' ), JETPACK_NOTES__CACHE_BUSTER );
133 } else {
134 wp_enqueue_style( 'wpcom-notes-admin-bar', $this->wpcom_static_url( '/wp-content/mu-plugins/notes/rtl/admin-bar-v2-rtl.css' ), array( 'admin-bar' ), JETPACK_NOTES__CACHE_BUSTER );
135 }
136
137 wp_enqueue_style( 'noticons', $this->wpcom_static_url( '/i/noticons/noticons.css' ), array( 'wpcom-notes-admin-bar' ), JETPACK_NOTES__CACHE_BUSTER );
138
139 $this->print_js();
140
141 $script_handles = array();
142 wp_register_script( 'wpcom-notes-common', $this->wpcom_static_url( '/wp-content/mu-plugins/notes/notes-common-lite.min.js' ), array(), JETPACK_NOTES__CACHE_BUSTER, true );
143 $script_handles[] = 'wpcom-notes-common';
144 wp_enqueue_script( 'wpcom-notes-admin-bar', $this->wpcom_static_url( '/wp-content/mu-plugins/notes/admin-bar-v2.js' ), array( 'wpcom-notes-common' ), JETPACK_NOTES__CACHE_BUSTER, true );
145 $script_handles[] = 'wpcom-notes-admin-bar';
146
147 $wp_notes_args = 'var wpNotesArgs = ' . wp_json_encode( array( 'cacheBuster' => JETPACK_NOTES__CACHE_BUSTER ), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';';
148 wp_add_inline_script( 'wpcom-notes-admin-bar', $wp_notes_args, 'before' );
149
150 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
151 add_filter(
152 'script_loader_tag',
153 function ( $tag, $handle ) use ( $script_handles ) {
154 if ( in_array( $handle, $script_handles, true ) ) {
155 $tag = preg_replace( '/(?<=<script)(?=\s|>)/i', ' data-ampdevmode', $tag );
156 }
157 return $tag;
158 },
159 10,
160 2
161 );
162 }
163 }
164
165 /**
166 * Adds notifications bubble to the admin bar.
167 *
168 * @return void
169 */
170 public function admin_bar_menu() {
171 global $wp_admin_bar;
172
173 if ( ! is_object( $wp_admin_bar ) ) {
174 return;
175 }
176
177 if ( self::is_block_editor() ) {
178 return;
179 }
180
181 $user_locale = get_user_locale();
182
183 if ( ! class_exists( 'GP_Locales' ) ) {
184 if ( defined( 'JETPACK__GLOTPRESS_LOCALES_PATH' ) && file_exists( JETPACK__GLOTPRESS_LOCALES_PATH ) ) {
185 require JETPACK__GLOTPRESS_LOCALES_PATH;
186 }
187 }
188
189 if ( class_exists( 'GP_Locales' ) ) {
190 $jetpack_locale_object = GP_Locales::by_field( 'slug', $user_locale );
191 if ( $jetpack_locale_object instanceof GP_Locale ) {
192 $user_locale = $jetpack_locale_object->slug;
193 }
194 }
195
196 $third_party_cookie_check_iframe = '<span style="display:none;"><iframe class="jetpack-notes-cookie-check" src="https://widgets.wp.com/3rd-party-cookie-check/index.html"></iframe></span>';
197
198 $title = self::get_notes_markup();
199
200 // The default fallback is `en_US`. Remove underscore if present, noting that lang codes can be more than three chars.
201 $user_locale = strtolower( explode( '_', $user_locale, 2 )[0] );
202
203 $wp_admin_bar->add_menu(
204 array(
205 'id' => 'notes',
206 'title' => $title,
207 'meta' => array(
208 'html' => '<div id="wpnt-notes-panel2" class="intrinsic-ignore" style="display:none" lang="' . esc_attr( $user_locale ) . '" dir="' . ( is_rtl() ? 'rtl' : 'ltr' ) . '"><div class="wpnt-notes-panel-header"><span class="wpnt-notes-header">' . __( 'Notifications', 'jetpack' ) . '</span><span class="wpnt-notes-panel-link"></span></div></div>' . $third_party_cookie_check_iframe,
209 'class' => 'menupop',
210 ),
211 'parent' => 'top-secondary',
212 'href' => 'https://wordpress.com/reader/notifications',
213 )
214 );
215 }
216
217 /**
218 * Returns the HTML markup for used by notification in top bar
219 *
220 * @return string
221 */
222 private static function get_notes_markup() {
223 return '<span id="wpnt-notes-unread-count" class="wpnt-loading wpn-read"></span>
224 <span class="noticon noticon-bell ab-icon"></span>
225 <span class="screen-reader-text">' . esc_html__( 'Notifications', 'jetpack' ) . '</span>';
226 }
227
228 /**
229 * Echos the Notes JS.
230 *
231 * @return void
232 */
233 public function print_js() {
234 $link_accounts_url = is_user_logged_in() && ! ( new Connection_Manager( 'jetpack' ) )->is_user_connected() ? Jetpack::admin_url() : false;
235 $script_contents = <<<'JS'
236 var wpNotesIsJetpackClient = true;
237 var wpNotesIsJetpackClientV2 = true;
238 JS;
239 if ( $link_accounts_url ) {
240 $script_contents .= "\nvar wpNotesLinkAccountsURL = " . wp_json_encode( $link_accounts_url, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';';
241 }
242 wp_print_inline_script_tag(
243 $script_contents,
244 array(
245 'data-ampdevmode' => true,
246 )
247 );
248 }
249
250 /**
251 * Checks to see if we're in the block editor.
252 */
253 public static function is_block_editor() {
254 if ( function_exists( 'get_current_screen' ) ) {
255 $current_screen = get_current_screen();
256 if ( ! empty( $current_screen ) && $current_screen->is_block_editor() ) {
257 return true;
258 }
259 }
260 return false;
261 }
262 }
263
264 Jetpack_Notifications::init();
265