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