PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / trunk
Jetpack – WP Security, Backup, Speed, & Growth vtrunk
16.2-a.3 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 / modules / notes.php
jetpack / modules Last commit date
canonical-urls 5 months ago carousel 3 weeks ago comment-likes 9 months ago comments 4 days ago custom-post-types 2 months ago external-media 9 months ago google-fonts 2 months ago gravatar 6 years ago infinite-scroll 2 months ago likes 1 week ago markdown 3 months ago memberships 2 weeks ago photon-cdn 1 month ago plugin-search 3 months ago post-by-email 9 months ago related-posts 1 month ago scan 5 months ago seo-tools 1 week ago sharedaddy 1 week ago shortcodes 1 month ago shortlinks 2 months ago simple-payments 9 months ago site-icon 9 months ago sitemaps 1 week ago stats 8 months ago subscriptions 1 month ago theme-tools 3 weeks ago tiled-gallery 2 months ago verification-tools 3 months ago videopress 1 month ago widget-visibility 3 months ago widgets 2 weeks ago woocommerce-analytics 4 months ago wordads 2 months ago wpcom-tos 8 months ago account-protection.php 4 months ago ai.php 4 days ago blaze.php 9 months ago blocks.php 9 months ago canonical-urls.php 6 months ago carousel.php 9 months ago comment-likes.php 1 week ago comments.php 4 days ago contact-form.php 9 months ago copy-post.php 3 months ago custom-content-types.php 4 months ago google-fonts.php 4 months ago gravatar-hovercards.php 3 months ago infinite-scroll.php 9 months ago json-api.php 9 months ago latex.php 3 months ago likes.php 1 week ago markdown.php 9 months ago module-extras.php 3 weeks ago module-headings.php 4 days ago module-info.php 6 months ago monitor.php 2 months ago notes.php 1 month ago photon-cdn.php 9 months ago photon.php 9 months ago plugin-search.php 3 weeks ago podcast.php 1 month ago post-by-email.php 4 months ago post-list.php 9 months ago protect.php 4 months ago publicize.php 9 months ago related-posts.php 3 months ago search.php 9 months ago seo-tools.php 2 months ago sharedaddy.php 6 months ago shortcodes.php 9 months ago shortlinks.php 3 months ago simple-payments.php 9 months ago sitemaps.php 9 months ago sso.php 2 months ago stats.php 1 month ago subscriptions.php 1 month ago theme-tools.php 9 months ago tiled-gallery.php 9 months ago vaultpress.php 9 months ago verification-tools.php 4 months ago videopress.php 9 months ago waf.php 9 months ago widget-visibility.php 9 months ago widgets.php 9 months ago woocommerce-analytics.php 9 months ago wordads.php 9 months ago wpcom-reader.php 6 months ago wpgroho.js 1 year ago
notes.php
248 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 add_action( 'admin_bar_menu', array( $this, 'admin_bar_menu' ), 120 );
89 add_action( 'wp_head', array( $this, 'styles_and_scripts' ), 120 );
90 add_action( 'admin_head', array( $this, 'styles_and_scripts' ) );
91 }
92
93 /**
94 * Enqueues and registers styles/scripts for notifications.
95 *
96 * @return void
97 */
98 public function styles_and_scripts() {
99 $is_rtl = is_rtl();
100
101 if ( ( new Host() )->is_woa_site() ) {
102 /**
103 * Can be used to force Notifications to display in RTL style.
104 *
105 * @module notes
106 *
107 * @since 4.8.0
108 *
109 * @param bool true Should notifications be displayed in RTL style. Defaults to false.
110 */
111 $is_rtl = apply_filters( 'a8c_wpcom_masterbar_enqueue_rtl_notification_styles', false );
112 }
113
114 if ( ! $is_rtl ) {
115 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 );
116 } else {
117 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 );
118 }
119
120 wp_enqueue_style( 'noticons', $this->wpcom_static_url( '/i/noticons/noticons.css' ), array( 'wpcom-notes-admin-bar' ), JETPACK_NOTES__CACHE_BUSTER );
121
122 $this->print_js();
123
124 $script_handles = array();
125 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 );
126 $script_handles[] = 'wpcom-notes-common';
127 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 );
128 $script_handles[] = 'wpcom-notes-admin-bar';
129
130 $wp_notes_args = 'var wpNotesArgs = ' . wp_json_encode( array( 'cacheBuster' => JETPACK_NOTES__CACHE_BUSTER ), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';';
131 wp_add_inline_script( 'wpcom-notes-admin-bar', $wp_notes_args, 'before' );
132
133 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
134 add_filter(
135 'script_loader_tag',
136 function ( $tag, $handle ) use ( $script_handles ) {
137 if ( in_array( $handle, $script_handles, true ) ) {
138 $tag = preg_replace( '/(?<=<script)(?=\s|>)/i', ' data-ampdevmode', $tag );
139 }
140 return $tag;
141 },
142 10,
143 2
144 );
145 }
146 }
147
148 /**
149 * Adds notifications bubble to the admin bar.
150 *
151 * @return void
152 */
153 public function admin_bar_menu() {
154 global $wp_admin_bar;
155
156 if ( ! is_object( $wp_admin_bar ) ) {
157 return;
158 }
159
160 $user_locale = get_user_locale();
161
162 if ( ! class_exists( 'GP_Locales' ) ) {
163 if ( defined( 'JETPACK__GLOTPRESS_LOCALES_PATH' ) && file_exists( JETPACK__GLOTPRESS_LOCALES_PATH ) ) {
164 require JETPACK__GLOTPRESS_LOCALES_PATH;
165 }
166 }
167
168 if ( class_exists( 'GP_Locales' ) ) {
169 $jetpack_locale_object = GP_Locales::by_field( 'slug', $user_locale );
170 if ( $jetpack_locale_object instanceof GP_Locale ) {
171 $user_locale = $jetpack_locale_object->slug;
172 }
173 }
174
175 $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>';
176
177 // Opt into the v3 notifications panel/iframe via the `notifications=v3` query parameter.
178 $notifications_version = sanitize_key( wp_unslash( $_GET['notifications'] ?? '' ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
179 $panel_id = 'v3' === $notifications_version ? 'wpnt-notes-panel3' : 'wpnt-notes-panel2';
180
181 $title = self::get_notes_markup();
182
183 // The default fallback is `en_US`. Remove underscore if present, noting that lang codes can be more than three chars.
184 $user_locale = strtolower( explode( '_', $user_locale, 2 )[0] );
185
186 $wp_admin_bar->add_menu(
187 array(
188 'id' => 'notes',
189 'title' => $title,
190 'meta' => array(
191 'html' => '<div id="' . esc_attr( $panel_id ) . '" 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,
192 'class' => 'menupop',
193 ),
194 'parent' => 'top-secondary',
195 'href' => 'https://wordpress.com/reader/notifications',
196 )
197 );
198 }
199
200 /**
201 * Returns the HTML markup for used by notification in top bar
202 *
203 * @return string
204 */
205 private static function get_notes_markup() {
206 return '<span id="wpnt-notes-unread-count" class="wpnt-loading wpn-read"></span>
207 <span class="noticon noticon-bell ab-icon"></span>
208 <span class="screen-reader-text">' . esc_html__( 'Notifications', 'jetpack' ) . '</span>';
209 }
210
211 /**
212 * Echos the Notes JS.
213 *
214 * @return void
215 */
216 public function print_js() {
217 $link_accounts_url = is_user_logged_in() && ! ( new Connection_Manager( 'jetpack' ) )->is_user_connected() ? Jetpack::admin_url() : false;
218 $script_contents = <<<'JS'
219 var wpNotesIsJetpackClient = true;
220 var wpNotesIsJetpackClientV2 = true;
221 JS;
222 if ( $link_accounts_url ) {
223 $script_contents .= "\nvar wpNotesLinkAccountsURL = " . wp_json_encode( $link_accounts_url, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';';
224 }
225 wp_print_inline_script_tag(
226 $script_contents,
227 array(
228 'data-ampdevmode' => true,
229 )
230 );
231 }
232
233 /**
234 * Checks to see if we're in the block editor.
235 */
236 public static function is_block_editor() {
237 if ( function_exists( 'get_current_screen' ) ) {
238 $current_screen = get_current_screen();
239 if ( ! empty( $current_screen ) && $current_screen->is_block_editor() ) {
240 return true;
241 }
242 }
243 return false;
244 }
245 }
246
247 Jetpack_Notifications::init();
248