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
|
|
|
* Auto Activate: Yes |
9
|
|
|
* Module Tags: Other |
10
|
|
|
* Feature: General |
11
|
|
|
* Additional Search Queries: notification, notifications, toolbar, adminbar, push, comments |
12
|
|
|
*/ |
13
|
|
|
|
14
|
|
|
if ( !defined( 'JETPACK_NOTES__CACHE_BUSTER' ) ) define( 'JETPACK_NOTES__CACHE_BUSTER', JETPACK__VERSION . '-' . gmdate( 'oW' ) ); |
15
|
|
|
|
16
|
|
|
class Jetpack_Notifications { |
17
|
|
|
public $jetpack = false; |
18
|
|
|
|
19
|
|
|
/** |
20
|
|
|
* Singleton |
21
|
|
|
* @static |
22
|
|
|
*/ |
23
|
|
|
public static function init() { |
24
|
|
|
static $instance = array(); |
25
|
|
|
|
26
|
|
|
if ( !$instance ) { |
|
|
|
|
27
|
|
|
$instance[0] = new Jetpack_Notifications; |
28
|
|
|
} |
29
|
|
|
|
30
|
|
|
return $instance[0]; |
31
|
|
|
} |
32
|
|
|
|
33
|
|
|
function __construct() { |
34
|
|
|
$this->jetpack = Jetpack::init(); |
|
|
|
|
35
|
|
|
|
36
|
|
|
add_action( 'init', array( &$this, 'action_init' ) ); |
37
|
|
|
} |
38
|
|
|
|
39
|
|
|
function wpcom_static_url($file) { |
40
|
|
|
$i = hexdec( substr( md5( $file ), -1 ) ) % 2; |
41
|
|
|
return 'https://s' . $i . '.wp.com' . $file; |
42
|
|
|
} |
43
|
|
|
|
44
|
|
|
// return the major version of Internet Explorer the viewer is using or false if it's not IE |
45
|
|
|
public static function get_internet_explorer_version() { |
46
|
|
|
static $version; |
47
|
|
|
if ( isset( $version ) ) { |
48
|
|
|
return $version; |
49
|
|
|
} |
50
|
|
|
|
51
|
|
|
$user_agent = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : ''; |
52
|
|
|
|
53
|
|
|
preg_match( '/MSIE (\d+)/', $user_agent, $matches ); |
54
|
|
|
$version = empty( $matches[1] ) ? null : $matches[1]; |
55
|
|
|
if ( empty( $version ) || !$version ) { |
56
|
|
|
return false; |
57
|
|
|
} |
58
|
|
|
return $version; |
59
|
|
|
} |
60
|
|
|
|
61
|
|
|
public static function current_browser_is_supported() { |
62
|
|
|
static $supported; |
63
|
|
|
|
64
|
|
|
if ( isset( $supported ) ) { |
65
|
|
|
return $supported; |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
$ie_version = self::get_internet_explorer_version(); |
69
|
|
|
if ( false === $ie_version ) { |
70
|
|
|
return $supported = true; |
71
|
|
|
} |
72
|
|
|
|
73
|
|
|
if ( $ie_version < 8 ) { |
74
|
|
|
return $supported = false; |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
return $supported = true; |
78
|
|
|
} |
79
|
|
|
|
80
|
|
|
function action_init() { |
81
|
|
|
//syncing must wait until after init so |
82
|
|
|
//post types that support comments |
83
|
|
|
$filt_post_types = array(); |
84
|
|
|
$all_post_types = get_post_types(); |
85
|
|
|
foreach ( $all_post_types as $post_type ) { |
86
|
|
|
if ( post_type_supports( $post_type, 'comments' ) ) { |
87
|
|
|
$filt_post_types[] = $post_type; |
88
|
|
|
} |
89
|
|
|
} |
90
|
|
|
|
91
|
|
|
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) |
92
|
|
|
return; |
93
|
|
|
|
94
|
|
|
if ( !has_filter( 'show_admin_bar', '__return_true' ) && !is_user_logged_in() ) |
95
|
|
|
return; |
96
|
|
|
|
97
|
|
|
if ( !self::current_browser_is_supported() ) |
98
|
|
|
return; |
99
|
|
|
|
100
|
|
|
add_action( 'admin_bar_menu', array( &$this, 'admin_bar_menu'), 120 ); |
101
|
|
|
add_action( 'wp_head', array( &$this, 'styles_and_scripts'), 120 ); |
102
|
|
|
add_action( 'admin_head', array( &$this, 'styles_and_scripts') ); |
103
|
|
|
} |
104
|
|
|
|
105
|
|
|
function styles_and_scripts() { |
106
|
|
|
$is_rtl = is_rtl(); |
107
|
|
|
|
108
|
|
|
if ( Jetpack::is_module_active( 'masterbar' ) ) { |
109
|
|
|
/** |
110
|
|
|
* Can be used to force Notifications to display in RTL style. |
111
|
|
|
* |
112
|
|
|
* @module notes |
113
|
|
|
* |
114
|
|
|
* @since 4.8.0 |
115
|
|
|
* |
116
|
|
|
* @param bool true Should notifications be displayed in RTL style. Defaults to false. |
117
|
|
|
*/ |
118
|
|
|
$is_rtl = apply_filters( 'a8c_wpcom_masterbar_enqueue_rtl_notification_styles', false ); |
119
|
|
|
} |
120
|
|
|
|
121
|
|
|
if ( ! $is_rtl ) { |
122
|
|
|
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 ); |
123
|
|
|
} else { |
124
|
|
|
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 ); |
125
|
|
|
} |
126
|
|
|
|
127
|
|
|
wp_enqueue_style( 'noticons', $this->wpcom_static_url( '/i/noticons/noticons.css' ), array( 'wpcom-notes-admin-bar' ), JETPACK_NOTES__CACHE_BUSTER ); |
128
|
|
|
|
129
|
|
|
$this->print_js(); |
130
|
|
|
|
131
|
|
|
// attempt to use core or plugin libraries if registered |
132
|
|
|
$script_handles = array(); |
133
|
|
|
if ( !wp_script_is( 'mustache', 'registered' ) ) { |
134
|
|
|
wp_register_script( 'mustache', $this->wpcom_static_url( '/wp-content/js/mustache.js' ), null, JETPACK_NOTES__CACHE_BUSTER ); |
135
|
|
|
} |
136
|
|
|
$script_handles[] = 'mustache'; |
137
|
|
View Code Duplication |
if ( !wp_script_is( 'underscore', 'registered' ) ) { |
138
|
|
|
wp_register_script( 'underscore', $this->wpcom_static_url( '/wp-includes/js/underscore.min.js' ), null, JETPACK_NOTES__CACHE_BUSTER ); |
139
|
|
|
} |
140
|
|
|
$script_handles[] = 'underscore'; |
141
|
|
View Code Duplication |
if ( !wp_script_is( 'backbone', 'registered' ) ) { |
142
|
|
|
wp_register_script( 'backbone', $this->wpcom_static_url( '/wp-includes/js/backbone.min.js' ), array( 'underscore' ), JETPACK_NOTES__CACHE_BUSTER ); |
143
|
|
|
} |
144
|
|
|
$script_handles[] = 'backbone'; |
145
|
|
|
|
146
|
|
|
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 ); |
147
|
|
|
$script_handles[] = 'wpcom-notes-common'; |
148
|
|
|
$script_handles[] = 'jquery'; |
149
|
|
|
$script_handles[] = 'jquery-migrate'; |
150
|
|
|
$script_handles[] = 'jquery-core'; |
151
|
|
|
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 ); |
152
|
|
|
$script_handles[] = 'wpcom-notes-admin-bar'; |
153
|
|
|
|
154
|
|
|
if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) { |
155
|
|
|
add_filter( |
156
|
|
|
'script_loader_tag', |
157
|
|
|
function ( $tag, $handle ) use ( $script_handles ) { |
158
|
|
|
if ( in_array( $handle, $script_handles, true ) ) { |
159
|
|
|
$tag = preg_replace( '/(?<=<script)(?=\s|>)/i', ' data-ampdevmode', $tag ); |
160
|
|
|
} |
161
|
|
|
return $tag; |
162
|
|
|
}, |
163
|
|
|
10, |
164
|
|
|
2 |
165
|
|
|
); |
166
|
|
|
} |
167
|
|
|
} |
168
|
|
|
|
169
|
|
|
function admin_bar_menu() { |
170
|
|
|
global $wp_admin_bar, $current_blog; |
171
|
|
|
|
172
|
|
|
if ( !is_object( $wp_admin_bar ) ) |
173
|
|
|
return; |
174
|
|
|
|
175
|
|
|
$wpcom_locale = get_locale(); |
176
|
|
|
|
177
|
|
|
if ( !class_exists( 'GP_Locales' ) ) { |
178
|
|
|
if ( defined( 'JETPACK__GLOTPRESS_LOCALES_PATH' ) && file_exists( JETPACK__GLOTPRESS_LOCALES_PATH ) ) { |
179
|
|
|
require JETPACK__GLOTPRESS_LOCALES_PATH; |
180
|
|
|
} |
181
|
|
|
} |
182
|
|
|
|
183
|
|
View Code Duplication |
if ( class_exists( 'GP_Locales' ) ) { |
184
|
|
|
$wpcom_locale_object = GP_Locales::by_field( 'wp_locale', $wpcom_locale ); |
185
|
|
|
if ( $wpcom_locale_object instanceof GP_Locale ) { |
186
|
|
|
$wpcom_locale = $wpcom_locale_object->slug; |
187
|
|
|
} |
188
|
|
|
} |
189
|
|
|
|
190
|
|
|
$classes = 'wpnt-loading wpn-read'; |
191
|
|
|
$wp_admin_bar->add_menu( array( |
192
|
|
|
'id' => 'notes', |
193
|
|
|
'title' => '<span id="wpnt-notes-unread-count" class="' . esc_attr( $classes ) . '"> |
194
|
|
|
<span class="noticon noticon-notification"></span> |
195
|
|
|
</span>', |
196
|
|
|
'meta' => array( |
197
|
|
|
'html' => '<div id="wpnt-notes-panel2" 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>', |
198
|
|
|
'class' => 'menupop', |
199
|
|
|
), |
200
|
|
|
'parent' => 'top-secondary', |
201
|
|
|
) ); |
202
|
|
|
} |
203
|
|
|
|
204
|
|
|
function print_js() { |
205
|
|
|
$link_accounts_url = is_user_logged_in() && !Jetpack::is_user_connected() ? Jetpack::admin_url() : false; |
206
|
|
|
?> |
207
|
|
|
<script data-ampdevmode type="text/javascript"> |
208
|
|
|
/* <![CDATA[ */ |
209
|
|
|
var wpNotesIsJetpackClient = true; |
210
|
|
|
var wpNotesIsJetpackClientV2 = true; |
211
|
|
|
<?php if ( $link_accounts_url ) : ?> |
212
|
|
|
var wpNotesLinkAccountsURL = '<?php print $link_accounts_url; ?>'; |
213
|
|
|
<?php endif; ?> |
214
|
|
|
/* ]]> */ |
215
|
|
|
</script> |
216
|
|
|
<?php |
217
|
|
|
} |
218
|
|
|
|
219
|
|
|
} |
220
|
|
|
|
221
|
|
|
Jetpack_Notifications::init(); |
222
|
|
|
|
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.