PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.1.2
Jetpack – WP Security, Backup, Speed, & Growth v15.1.2
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 11 months ago gravatar 6 years ago infinite-scroll 11 months ago likes 1 year ago markdown 1 year ago memberships 11 months ago photon-cdn 11 months ago plugin-search 1 year ago post-by-email 1 year ago related-posts 11 months ago scan 1 year ago seo-tools 1 year ago sharedaddy 11 months ago shortcodes 11 months ago simple-payments 1 year ago site-icon 11 months ago sitemaps 11 months ago stats 1 year ago subscriptions 11 months ago theme-tools 11 months ago tiled-gallery 1 year ago verification-tools 1 year ago videopress 11 months ago widget-visibility 11 months ago widgets 10 months ago woocommerce-analytics 11 months ago wordads 1 year ago wpcom-tos 1 year 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 10 months 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 11 months ago simple-payments.php 1 year ago sitemaps.php 1 year ago sso.php 1 year ago stats.php 11 months ago subscriptions.php 11 months 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
263 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 ) ) . ';';
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 ?>
236 <script data-ampdevmode type="text/javascript">
237 /* <![CDATA[ */
238 var wpNotesIsJetpackClient = true;
239 var wpNotesIsJetpackClientV2 = true;
240 <?php if ( $link_accounts_url ) : ?>
241 var wpNotesLinkAccountsURL = '<?php echo esc_url( $link_accounts_url ); ?>';
242 <?php endif; ?>
243 /* ]]> */
244 </script>
245 <?php
246 }
247
248 /**
249 * Checks to see if we're in the block editor.
250 */
251 public static function is_block_editor() {
252 if ( function_exists( 'get_current_screen' ) ) {
253 $current_screen = get_current_screen();
254 if ( ! empty( $current_screen ) && $current_screen->is_block_editor() ) {
255 return true;
256 }
257 }
258 return false;
259 }
260 }
261
262 Jetpack_Notifications::init();
263