PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 10.2.3
Jetpack – WP Security, Backup, Speed, & Growth v10.2.3
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 All 500 releases
jetpack / modules / notes.php
notes.php
232 lines 7.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
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
15 use Automattic\Jetpack\Connection\Manager as Connection_Manager;
16
17 if ( !defined( 'JETPACK_NOTES__CACHE_BUSTER' ) ) define( 'JETPACK_NOTES__CACHE_BUSTER', JETPACK__VERSION . '-' . gmdate( 'oW' ) );
18
19 class Jetpack_Notifications {
20 public $jetpack = false;
21
22 /**
23 * Singleton
24 * @static
25 */
26 public static function init() {
27 static $instance = array();
28
29 if ( !$instance ) {
30 $instance[0] = new Jetpack_Notifications;
31 }
32
33 return $instance[0];
34 }
35
36 function __construct() {
37 $this->jetpack = Jetpack::init();
38
39 add_action( 'init', array( &$this, 'action_init' ) );
40 }
41
42 function wpcom_static_url($file) {
43 $i = hexdec( substr( md5( $file ), -1 ) ) % 2;
44 return 'https://s' . $i . '.wp.com' . $file;
45 }
46
47 // return the major version of Internet Explorer the viewer is using or false if it's not IE
48 public static function get_internet_explorer_version() {
49 static $version;
50 if ( isset( $version ) ) {
51 return $version;
52 }
53
54 $user_agent = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '';
55
56 preg_match( '/MSIE (\d+)/', $user_agent, $matches );
57 $version = empty( $matches[1] ) ? null : $matches[1];
58 if ( empty( $version ) || !$version ) {
59 return false;
60 }
61 return $version;
62 }
63
64 public static function current_browser_is_supported() {
65 static $supported;
66
67 if ( isset( $supported ) ) {
68 return $supported;
69 }
70
71 $ie_version = self::get_internet_explorer_version();
72 if ( false === $ie_version ) {
73 return $supported = true;
74 }
75
76 if ( $ie_version < 8 ) {
77 return $supported = false;
78 }
79
80 return $supported = true;
81 }
82
83 function action_init() {
84 //syncing must wait until after init so
85 //post types that support comments
86 $filt_post_types = array();
87 $all_post_types = get_post_types();
88 foreach ( $all_post_types as $post_type ) {
89 if ( post_type_supports( $post_type, 'comments' ) ) {
90 $filt_post_types[] = $post_type;
91 }
92 }
93
94 if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
95 return;
96
97 if ( !has_filter( 'show_admin_bar', '__return_true' ) && !is_user_logged_in() )
98 return;
99
100 if ( !self::current_browser_is_supported() )
101 return;
102
103 // Do not show notifications in the Site Editor, which is always in fullscreen mode.
104 global $pagenow;
105 // phpcs:ignore WordPress.Security.NonceVerification
106 if ( 'admin.php' === $pagenow && isset( $_GET['page'] ) && 'gutenberg-edit-site' === $_GET['page'] ) {
107 return;
108 }
109
110 add_action( 'admin_bar_menu', array( &$this, 'admin_bar_menu'), 120 );
111 add_action( 'wp_head', array( &$this, 'styles_and_scripts'), 120 );
112 add_action( 'admin_head', array( &$this, 'styles_and_scripts') );
113 }
114
115 function styles_and_scripts() {
116 $is_rtl = is_rtl();
117
118 if ( Jetpack::is_module_active( 'masterbar' ) ) {
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 // attempt to use core or plugin libraries if registered
142 $script_handles = array();
143 if ( !wp_script_is( 'mustache', 'registered' ) ) {
144 wp_register_script( 'mustache', $this->wpcom_static_url( '/wp-content/js/mustache.js' ), null, JETPACK_NOTES__CACHE_BUSTER );
145 }
146 $script_handles[] = 'mustache';
147 if ( !wp_script_is( 'underscore', 'registered' ) ) {
148 wp_register_script( 'underscore', $this->wpcom_static_url( '/wp-includes/js/underscore.min.js' ), null, JETPACK_NOTES__CACHE_BUSTER );
149 }
150 $script_handles[] = 'underscore';
151 if ( !wp_script_is( 'backbone', 'registered' ) ) {
152 wp_register_script( 'backbone', $this->wpcom_static_url( '/wp-includes/js/backbone.min.js' ), array( 'underscore' ), JETPACK_NOTES__CACHE_BUSTER );
153 }
154 $script_handles[] = 'backbone';
155
156 wp_register_script( 'wpcom-notes-common', $this->wpcom_static_url( '/wp-content/mu-plugins/notes/notes-common-v2.js' ), array( 'jquery', 'underscore', 'backbone', 'mustache' ), JETPACK_NOTES__CACHE_BUSTER );
157 $script_handles[] = 'wpcom-notes-common';
158 $script_handles[] = 'jquery';
159 $script_handles[] = 'jquery-migrate';
160 $script_handles[] = 'jquery-core';
161 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 );
162 $script_handles[] = 'wpcom-notes-admin-bar';
163
164 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
165 add_filter(
166 'script_loader_tag',
167 function ( $tag, $handle ) use ( $script_handles ) {
168 if ( in_array( $handle, $script_handles, true ) ) {
169 $tag = preg_replace( '/(?<=<script)(?=\s|>)/i', ' data-ampdevmode', $tag );
170 }
171 return $tag;
172 },
173 10,
174 2
175 );
176 }
177 }
178
179 function admin_bar_menu() {
180 global $wp_admin_bar, $current_blog;
181
182 if ( !is_object( $wp_admin_bar ) )
183 return;
184
185 $wpcom_locale = get_locale();
186
187 if ( !class_exists( 'GP_Locales' ) ) {
188 if ( defined( 'JETPACK__GLOTPRESS_LOCALES_PATH' ) && file_exists( JETPACK__GLOTPRESS_LOCALES_PATH ) ) {
189 require JETPACK__GLOTPRESS_LOCALES_PATH;
190 }
191 }
192
193 if ( class_exists( 'GP_Locales' ) ) {
194 $wpcom_locale_object = GP_Locales::by_field( 'wp_locale', $wpcom_locale );
195 if ( $wpcom_locale_object instanceof GP_Locale ) {
196 $wpcom_locale = $wpcom_locale_object->slug;
197 }
198 }
199
200 $classes = 'wpnt-loading wpn-read';
201 $wp_admin_bar->add_menu( array(
202 'id' => 'notes',
203 'title' => '<span id="wpnt-notes-unread-count" class="' . esc_attr( $classes ) . '">
204 <span class="noticon noticon-notification"></span>
205 </span>',
206 'meta' => array(
207 '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>',
208 'class' => 'menupop',
209 ),
210 'parent' => 'top-secondary',
211 ) );
212 }
213
214 function print_js() {
215 $link_accounts_url = is_user_logged_in() && ! ( new Connection_Manager( 'jetpack' ) )->is_user_connected() ? Jetpack::admin_url() : false;
216 ?>
217 <script data-ampdevmode type="text/javascript">
218 /* <![CDATA[ */
219 var wpNotesIsJetpackClient = true;
220 var wpNotesIsJetpackClientV2 = true;
221 <?php if ( $link_accounts_url ) : ?>
222 var wpNotesLinkAccountsURL = '<?php print $link_accounts_url; ?>';
223 <?php endif; ?>
224 /* ]]> */
225 </script>
226 <?php
227 }
228
229 }
230
231 Jetpack_Notifications::init();
232