PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.8.1
Jetpack – WP Security, Backup, Speed, & Growth v14.8.1
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 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
carousel 1 year ago comment-likes 1 year ago comments 1 year ago custom-post-types 1 year ago external-media 1 year ago google-fonts 1 year ago gravatar 6 years ago infinite-scroll 1 year ago likes 1 year ago markdown 1 year ago memberships 1 year ago photon-cdn 1 year ago plugin-search 1 year ago post-by-email 1 year ago related-posts 1 year ago scan 1 year ago seo-tools 1 year ago sharedaddy 1 year ago shortcodes 1 year ago simple-payments 1 year ago site-icon 2 years ago sitemaps 1 year ago stats 1 year ago subscriptions 1 year ago theme-tools 1 year ago tiled-gallery 1 year ago verification-tools 4 years ago videopress 1 year ago widget-visibility 1 year ago widgets 1 year ago woocommerce-analytics 1 year ago wordads 1 year ago wpcom-tos 5 years ago account-protection.php 1 year ago blaze.php 1 year ago blocks.php 1 year ago carousel.php 1 year ago comment-likes.php 1 year ago comments.php 1 year ago contact-form.php 1 year ago copy-post.php 1 year ago custom-content-types.php 1 year ago google-fonts.php 1 year ago gravatar-hovercards.php 1 year ago infinite-scroll.php 1 year ago json-api.php 1 year ago latex.php 1 year ago likes.php 1 year ago markdown.php 1 year ago module-extras.php 1 year ago module-headings.php 1 year ago module-info.php 1 year ago monitor.php 1 year ago notes.php 1 year ago photon-cdn.php 1 year ago photon.php 1 year ago plugin-search.php 1 year ago post-by-email.php 1 year ago post-list.php 1 year ago protect.php 1 year ago publicize.php 1 year ago related-posts.php 1 year ago search.php 1 year ago seo-tools.php 1 year ago sharedaddy.php 1 year ago shortcodes.php 1 year ago shortlinks.php 1 year ago sitemaps.php 1 year ago sso.php 1 year ago stats.php 1 year ago subscriptions.php 1 year ago theme-tools.php 1 year ago tiled-gallery.php 1 year ago vaultpress.php 1 year ago verification-tools.php 1 year ago videopress.php 1 year ago waf.php 1 year ago widget-visibility.php 1 year ago widgets.php 1 year ago woocommerce-analytics.php 1 year ago wordads.php 1 year ago wpgroho.js 1 year ago
notes.php
259 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( 'JETPACK_NOTES__CACHE_BUSTER' ) ) {
21 define( 'JETPACK_NOTES__CACHE_BUSTER', JETPACK__VERSION . '-' . gmdate( 'oW' ) . '-lite' );
22 }
23
24 /**
25 * Notifications class.
26 */
27 class Jetpack_Notifications {
28 /**
29 * Jetpack object.
30 *
31 * @var bool|Jetpack Jetpack object.
32 */
33 public $jetpack = false;
34
35 /**
36 * Singleton
37 *
38 * @static
39 */
40 public static function init() {
41 static $instance = array();
42
43 if ( ! $instance ) {
44 $instance[0] = new Jetpack_Notifications();
45 }
46
47 return $instance[0];
48 }
49
50 /**
51 * Constructor.
52 */
53 private function __construct() {
54 $this->jetpack = Jetpack::init();
55
56 add_action( 'init', array( $this, 'action_init' ) );
57 }
58
59 /**
60 * Adds s0.wp.com to a file path.
61 *
62 * @param string $file File path.
63 *
64 * @return string
65 */
66 public function wpcom_static_url( $file ) {
67 return 'https://s0.wp.com' . $file;
68 }
69
70 /**
71 * Init the notifications admin bar.
72 *
73 * @return void
74 */
75 public function action_init() {
76 if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
77 return;
78 }
79
80 if ( ! has_filter( 'show_admin_bar', '__return_true' ) && ! is_user_logged_in() ) {
81 return;
82 }
83
84 // Do not show notifications in the Site Editor, which is always in fullscreen mode.
85 global $pagenow;
86
87 // Pre 13.7 pages that still need to be supported if < 13.7 is
88 // still installed.
89 $allowed_old_pages = array( 'admin.php', 'themes.php' );
90 $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
91 // For Gutenberg > 13.7, the core `site-editor.php` route is used instead
92 $is_site_editor_page = 'site-editor.php' === $pagenow;
93
94 if ( $is_site_editor_page || $is_old_site_editor_page ) {
95 return;
96 }
97
98 add_action( 'admin_bar_menu', array( $this, 'admin_bar_menu' ), 120 );
99 add_action( 'wp_head', array( $this, 'styles_and_scripts' ), 120 );
100 add_action( 'admin_head', array( $this, 'styles_and_scripts' ) );
101 }
102
103 /**
104 * Enqueues and registers styles/scripts for notifications.
105 *
106 * @return void
107 */
108 public function styles_and_scripts() {
109 if ( self::is_block_editor() ) {
110 return;
111 }
112 $is_rtl = is_rtl();
113
114 if ( ( new Host() )->is_woa_site() ) {
115 /**
116 * Can be used to force Notifications to display in RTL style.
117 *
118 * @module notes
119 *
120 * @since 4.8.0
121 *
122 * @param bool true Should notifications be displayed in RTL style. Defaults to false.
123 */
124 $is_rtl = apply_filters( 'a8c_wpcom_masterbar_enqueue_rtl_notification_styles', false );
125 }
126
127 if ( ! $is_rtl ) {
128 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 );
129 } else {
130 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 );
131 }
132
133 wp_enqueue_style( 'noticons', $this->wpcom_static_url( '/i/noticons/noticons.css' ), array( 'wpcom-notes-admin-bar' ), JETPACK_NOTES__CACHE_BUSTER );
134
135 $this->print_js();
136
137 $script_handles = array();
138 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 );
139 $script_handles[] = 'wpcom-notes-common';
140 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 );
141 $script_handles[] = 'wpcom-notes-admin-bar';
142
143 $wp_notes_args = 'var wpNotesArgs = ' . wp_json_encode( array( 'cacheBuster' => JETPACK_NOTES__CACHE_BUSTER ) ) . ';';
144 wp_add_inline_script( 'wpcom-notes-admin-bar', $wp_notes_args, 'before' );
145
146 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
147 add_filter(
148 'script_loader_tag',
149 function ( $tag, $handle ) use ( $script_handles ) {
150 if ( in_array( $handle, $script_handles, true ) ) {
151 $tag = preg_replace( '/(?<=<script)(?=\s|>)/i', ' data-ampdevmode', $tag );
152 }
153 return $tag;
154 },
155 10,
156 2
157 );
158 }
159 }
160
161 /**
162 * Adds notifications bubble to the admin bar.
163 *
164 * @return void
165 */
166 public function admin_bar_menu() {
167 global $wp_admin_bar;
168
169 if ( ! is_object( $wp_admin_bar ) ) {
170 return;
171 }
172
173 if ( self::is_block_editor() ) {
174 return;
175 }
176
177 $user_locale = get_user_locale();
178
179 if ( ! class_exists( 'GP_Locales' ) ) {
180 if ( defined( 'JETPACK__GLOTPRESS_LOCALES_PATH' ) && file_exists( JETPACK__GLOTPRESS_LOCALES_PATH ) ) {
181 require JETPACK__GLOTPRESS_LOCALES_PATH;
182 }
183 }
184
185 if ( class_exists( 'GP_Locales' ) ) {
186 $jetpack_locale_object = GP_Locales::by_field( 'slug', $user_locale );
187 if ( $jetpack_locale_object instanceof GP_Locale ) {
188 $user_locale = $jetpack_locale_object->slug;
189 }
190 }
191
192 $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>';
193
194 $title = self::get_notes_markup();
195
196 // The default fallback is `en_US`. Remove underscore if present, noting that lang codes can be more than three chars.
197 $user_locale = strtolower( explode( '_', $user_locale, 2 )[0] );
198
199 $wp_admin_bar->add_menu(
200 array(
201 'id' => 'notes',
202 'title' => $title,
203 'meta' => array(
204 '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,
205 'class' => 'menupop',
206 ),
207 'parent' => 'top-secondary',
208 'href' => 'https://wordpress.com/reader/notifications',
209 )
210 );
211 }
212
213 /**
214 * Returns the HTML markup for used by notification in top bar
215 *
216 * @return string
217 */
218 private static function get_notes_markup() {
219 return '<span id="wpnt-notes-unread-count" class="wpnt-loading wpn-read"></span>
220 <span class="noticon noticon-bell ab-icon"></span>
221 <span class="screen-reader-text">' . esc_html__( 'Notifications', 'jetpack' ) . '</span>';
222 }
223
224 /**
225 * Echos the Notes JS.
226 *
227 * @return void
228 */
229 public function print_js() {
230 $link_accounts_url = is_user_logged_in() && ! ( new Connection_Manager( 'jetpack' ) )->is_user_connected() ? Jetpack::admin_url() : false;
231 ?>
232 <script data-ampdevmode type="text/javascript">
233 /* <![CDATA[ */
234 var wpNotesIsJetpackClient = true;
235 var wpNotesIsJetpackClientV2 = true;
236 <?php if ( $link_accounts_url ) : ?>
237 var wpNotesLinkAccountsURL = '<?php echo esc_url( $link_accounts_url ); ?>';
238 <?php endif; ?>
239 /* ]]> */
240 </script>
241 <?php
242 }
243
244 /**
245 * Checks to see if we're in the block editor.
246 */
247 public static function is_block_editor() {
248 if ( function_exists( 'get_current_screen' ) ) {
249 $current_screen = get_current_screen();
250 if ( ! empty( $current_screen ) && $current_screen->is_block_editor() ) {
251 return true;
252 }
253 }
254 return false;
255 }
256 }
257
258 Jetpack_Notifications::init();
259