PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-a.5
Jetpack – WP Security, Backup, Speed, & Growth v16.1-a.5
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 4 months ago carousel 2 days ago comment-likes 8 months ago comments 2 months ago custom-post-types 1 month ago external-media 8 months ago google-fonts 1 month ago gravatar 6 years ago infinite-scroll 1 month ago likes 2 days ago markdown 2 months ago memberships 2 days ago photon-cdn 2 days ago plugin-search 2 months ago post-by-email 8 months ago related-posts 1 week ago scan 4 months ago seo-tools 1 month ago sharedaddy 1 month ago shortcodes 1 week ago shortlinks 1 month ago simple-payments 8 months ago site-icon 8 months ago sitemaps 2 months ago stats 7 months ago subscriptions 1 week ago theme-tools 1 month ago tiled-gallery 1 month ago verification-tools 2 months ago videopress 2 days ago widget-visibility 2 months ago widgets 1 month ago woocommerce-analytics 3 months ago wordads 1 month ago wpcom-tos 7 months ago account-protection.php 3 months ago blaze.php 8 months ago blocks.php 8 months ago canonical-urls.php 5 months ago carousel.php 8 months ago comment-likes.php 8 months ago comments.php 4 months ago contact-form.php 8 months ago copy-post.php 2 months ago custom-content-types.php 3 months ago google-fonts.php 3 months ago gravatar-hovercards.php 2 months ago infinite-scroll.php 8 months ago json-api.php 8 months ago latex.php 2 months ago likes.php 2 months ago markdown.php 8 months ago module-extras.php 8 months ago module-headings.php 1 week ago module-info.php 5 months ago monitor.php 1 month ago notes.php 2 days ago photon-cdn.php 8 months ago photon.php 8 months ago plugin-search.php 1 month ago podcast.php 1 week ago post-by-email.php 3 months ago post-list.php 8 months ago protect.php 3 months ago publicize.php 8 months ago related-posts.php 2 months ago search.php 8 months ago seo-tools.php 1 month ago sharedaddy.php 5 months ago shortcodes.php 8 months ago shortlinks.php 2 months ago simple-payments.php 8 months ago sitemaps.php 8 months ago sso.php 1 month ago stats.php 1 week ago subscriptions.php 1 week ago theme-tools.php 8 months ago tiled-gallery.php 8 months ago vaultpress.php 8 months ago verification-tools.php 3 months ago videopress.php 8 months ago waf.php 8 months ago widget-visibility.php 8 months ago widgets.php 8 months ago woocommerce-analytics.php 8 months ago wordads.php 8 months ago wpcom-reader.php 5 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