PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.3.2
Jetpack – WP Security, Backup, Speed, & Growth v13.3.2
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 / likes.php
jetpack / modules Last commit date
calypsoify 2 years ago carousel 2 years ago cloudflare-analytics 4 years ago comment-likes 5 years ago comments 2 years ago contact-form 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 5 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 2 years ago site-icon 4 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 3 years ago enhanced-distribution.php 2 years ago geo-location.php 4 years ago google-analytics.php 4 years ago google-fonts.php 2 years ago gravatar-hovercards.php 2 years ago infinite-scroll.php 2 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 3 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 3 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 3 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 5 years ago
likes.php
563 lines
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Module Name: Likes
4 * Module Description: Give visitors an easy way to show they appreciate your content.
5 * First Introduced: 2.2
6 * Sort Order: 23
7 * Requires Connection: Yes
8 * Auto Activate: No
9 * Module Tags: Social
10 * Feature: Engagement
11 * Additional Search Queries: like, likes, wordpress.com
12 *
13 * @package automattic/jetpack
14 */
15 /**
16 * NOTE: While the front-end behavior currently varies, try to keep the data
17 * model here the same as on wpcom to facilitate Simple→Atomic moves and
18 * possible future work to recombine the front-ends.
19 */
20
21 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
22
23 use Automattic\Jetpack\Assets;
24
25 Assets::add_resource_hint(
26 array(
27 '//widgets.wp.com',
28 '//s0.wp.com',
29 '//0.gravatar.com',
30 '//1.gravatar.com',
31 '//2.gravatar.com',
32 ),
33 'dns-prefetch'
34 );
35
36 require_once __DIR__ . '/likes/jetpack-likes-master-iframe.php';
37 require_once __DIR__ . '/likes/jetpack-likes-settings.php';
38
39 /**
40 * Jetpack Like Class
41 */
42 class Jetpack_Likes {
43
44 /**
45 * Jetpack_Likes_Settings object
46 *
47 * @var Jetpack_Likes_Settings
48 */
49 public $settings;
50
51 /**
52 * Initialize class
53 */
54 public static function init() {
55 static $instance = null;
56
57 if ( ! $instance ) {
58 $instance = new Jetpack_Likes();
59 }
60
61 return $instance;
62 }
63
64 /**
65 * Constructs Likes class
66 */
67 public function __construct() {
68 $this->settings = new Jetpack_Likes_Settings();
69
70 // We need to run on wp hook rather than init because we check is_amp_endpoint()
71 // when bootstrapping hooks.
72 add_action( 'wp', array( $this, 'action_init' ), 99 );
73
74 add_action( 'admin_init', array( $this, 'admin_init' ) );
75
76 add_action( 'jetpack_activate_module_likes', array( $this, 'set_social_notifications_like' ) );
77 add_action( 'jetpack_deactivate_module_likes', array( $this, 'delete_social_notifications_like' ) );
78
79 Jetpack::enable_module_configurable( __FILE__ );
80 add_filter( 'jetpack_module_configuration_url_likes', array( $this, 'jetpack_likes_configuration_url' ) );
81 add_action( 'admin_print_scripts-settings_page_sharing', array( $this, 'load_jp_css' ) );
82 add_filter( 'sharing_show_buttons_on_row_start', array( $this, 'configuration_target_area' ) );
83
84 $active = Jetpack::get_active_modules();
85
86 if ( in_array( 'publicize', $active, true ) && ! in_array( 'sharedaddy', $active, true ) ) {
87 // we have a sharing page but not the global options area.
88 add_action( 'pre_admin_screen_sharing', array( $this->settings, 'sharing_block' ), 20 );
89 add_action( 'pre_admin_screen_sharing', array( $this->settings, 'updated_message' ), -10 );
90 }
91
92 if ( ! in_array( 'sharedaddy', $active, true ) ) {
93 add_action( 'admin_init', array( $this->settings, 'process_update_requests_if_sharedaddy_not_loaded' ) );
94 add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_showbuttonon_init' ), 19 );
95 add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_showbuttonon_callback' ), 19 );
96 add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
97 } else {
98 add_filter( 'sharing_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
99 add_action( 'start_sharing_meta_box_content', array( $this->settings, 'meta_box_content' ) );
100 }
101
102 add_action( 'admin_init', array( $this, 'admin_discussion_likes_settings_init' ) ); // Likes notifications.
103
104 add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_register_scripts' ) );
105
106 add_action( 'save_post', array( $this->settings, 'meta_box_save' ) );
107 add_action( 'edit_attachment', array( $this->settings, 'meta_box_save' ) );
108 add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_init' ), 20 );
109 add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_callback' ), 20 );
110 }
111
112 /**
113 * Set the social_notifications_like option to `on` when the Likes module is activated.
114 *
115 * @since 3.7.0
116 */
117 public function set_social_notifications_like() {
118 update_option( 'social_notifications_like', 'on' );
119 }
120
121 /**
122 * Delete the social_notifications_like option that was set to `on` on module activation.
123 *
124 * @since 3.7.0
125 */
126 public function delete_social_notifications_like() {
127 delete_option( 'social_notifications_like' );
128 }
129
130 /**
131 * Overrides default configuration url
132 *
133 * @uses admin_url
134 * @return string module settings URL
135 */
136 public function jetpack_likes_configuration_url() {
137 return admin_url( 'options-general.php?page=sharing#likes' );
138 }
139
140 /**
141 * Loads Jetpack's CSS on the sharing page so we can use .jetpack-targetable
142 */
143 public function load_jp_css() {
144 /**
145 * Do we really need `admin_styles`? With the new admin UI, it's breaking some bits.
146 * Jetpack::init()->admin_styles();
147 */
148 }
149
150 /**
151 * Load scripts and styles for front end.
152 */
153 public function load_styles_register_scripts() {
154 wp_enqueue_style( 'jetpack_likes', plugins_url( 'likes/style.css', __FILE__ ), array(), JETPACK__VERSION );
155 wp_register_script(
156 'jetpack_likes_queuehandler',
157 Assets::get_file_url_for_environment(
158 '_inc/build/likes/queuehandler.min.js',
159 'modules/likes/queuehandler.js'
160 ),
161 array(),
162 JETPACK__VERSION,
163 true
164 );
165 }
166
167 /**
168 * Adds in the jetpack-targetable class so when we visit sharing#likes our like settings get highlighted by a yellow box
169 *
170 * @param string $html row heading for the sharedaddy "which page" setting.
171 * @return string $html with the jetpack-targetable class and likes id. tbody gets closed after the like settings
172 */
173 public function configuration_target_area( $html = '' ) {
174 $html = "<tbody id='likes' class='jetpack-targetable'>" . $html;
175 return $html;
176 }
177
178 /**
179 * Options to be added to the discussion page (see also admin_settings_init, etc below for Sharing settings page)
180 */
181 public function admin_discussion_likes_settings_init() {
182 // Add a temporary section, until we can move the setting out of there and with the rest of the email notification settings.
183 add_settings_section( 'likes-notifications', __( 'Likes Notifications', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_section' ), 'discussion' );
184 add_settings_field( 'social-notifications', __( 'Email me whenever', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_field' ), 'discussion', 'likes-notifications' );
185 // Register the setting.
186 register_setting( 'discussion', 'social_notifications_like', array( $this, 'admin_discussion_likes_settings_validate' ) );
187 }
188
189 /** Add email notification options to WordPress discussion settings */
190 public function admin_discussion_likes_settings_section() {
191 // Atypical usage here. We emit jquery to move likes notification checkbox to be with the rest of the email notification settings.
192 ?>
193 <script type="text/javascript">
194 jQuery( function( $ ) {
195 var table = $( '#social_notifications_like' ).parents( 'table:first' ),
196 header = table.prevAll( 'h2:first' ),
197 newParent = $( '#moderation_notify' ).parent( 'label' ).parent();
198
199 if ( !table.length || !header.length || !newParent.length ) {
200 return;
201 }
202
203 newParent.append( '<br/>' ).append( table.end().parent( 'label' ).siblings().andSelf() );
204 header.remove();
205 table.remove();
206 } );
207 </script>
208 <?php
209 }
210
211 /** Check if email notifications for likes is on or off.
212 *
213 * @param string $option - which option we're checking (social_notifications_like).
214 */
215 public function admin_likes_get_option( $option ) {
216 $option_setting = get_option( $option, 'on' );
217
218 return (int) ( 'on' === $option_setting );
219 }
220
221 /** Display email notification for likes setting in WordPress' discussion settings. */
222 public function admin_discussion_likes_settings_field() {
223 $like = $this->admin_likes_get_option( 'social_notifications_like' );
224 ?>
225 <label><input type="checkbox" id="social_notifications_like" name="social_notifications_like" value="1" <?php checked( $like ); ?> /> <?php esc_html_e( 'Someone likes one of my posts', 'jetpack' ); ?></label>
226 <?php
227 }
228
229 /**
230 * Validate email notification settings.
231 *
232 * @param string $input - determines if checbox is on or off.
233 */
234 public function admin_discussion_likes_settings_validate( $input ) {
235 // If it's not set (was unchecked during form submission) or was set to off (during option update), return 'off'.
236 if ( ! $input || 'off' === $input ) {
237 return 'off';
238 }
239 // Otherwise return 'on'.
240 return 'on';
241 }
242
243 /** Initialize admin settings */
244 public function admin_init() {
245 add_filter( 'manage_posts_columns', array( $this, 'add_like_count_column' ) );
246 add_filter( 'manage_pages_columns', array( $this, 'add_like_count_column' ) );
247 add_action( 'manage_posts_custom_column', array( $this, 'likes_edit_column' ), 10, 2 );
248 add_action( 'manage_pages_custom_column', array( $this, 'likes_edit_column' ), 10, 2 );
249 add_action( 'admin_print_styles-edit.php', array( $this, 'load_admin_css' ) );
250 add_action( 'admin_print_scripts-edit.php', array( $this, 'enqueue_admin_scripts' ) );
251 }
252
253 /** Initialize action */
254 public function action_init() {
255 /*
256 * Only check if the module is enabled here because
257 * we are not currently in The Loop and do not yet have access to check
258 * the switch_like_status post meta flag for the post to be loaded.
259 */
260 if ( is_admin() || ! $this->settings->is_likes_module_enabled() ) {
261 return;
262 }
263
264 if ( ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) ||
265 ( defined( 'APP_REQUEST' ) && APP_REQUEST ) ||
266 ( defined( 'REST_API_REQUEST' ) && REST_API_REQUEST ) ||
267 ( defined( 'COOKIE_AUTH_REQUEST' ) && COOKIE_AUTH_REQUEST ) ||
268 ( defined( 'JABBER_SERVER' ) && JABBER_SERVER ) ) {
269 return;
270 }
271
272 if (
273 class_exists( 'Jetpack_AMP_Support' )
274 && Jetpack_AMP_Support::is_amp_request()
275 ) {
276 return;
277 }
278
279 add_filter( 'the_content', array( $this, 'post_likes' ), 30, 1 );
280 add_filter( 'the_excerpt', array( $this, 'post_likes' ), 30, 1 );
281 }
282
283 /**
284 * Load the CSS needed for the wp-admin area.
285 */
286 public function load_admin_css() {
287 ?>
288 <style type="text/css">
289 .vers img { display: none; }
290 .metabox-prefs .vers img { display: inline; }
291 .fixed .column-likes { width: 5.5em; padding: 8px 0; text-align: left; }
292 .fixed .column-stats { width: 5em; }
293 .fixed .column-likes .post-com-count {
294 -webkit-box-sizing: border-box;
295 -moz-box-sizing: border-box;
296 box-sizing: border-box;
297 display: inline-block;
298 padding: 0 8px;
299 height: 2em;
300 margin-top: 5px;
301 -webkit-border-radius: 5px;
302 border-radius: 5px;
303 background-color: #787c82;
304 color: #FFF;
305 font-size: 11px;
306 line-height: 21px;
307 }
308 .fixed .column-likes .post-com-count::after { border: none !important; }
309 .fixed .column-likes .post-com-count:hover { background-color: #2271b1; }
310 .fixed .column-likes .vers:before {
311 font: normal 20px/1 dashicons;
312 content: '\f155';
313 speak: none;
314 -webkit-font-smoothing: antialiased;
315 -moz-osx-font-smoothing: grayscale;
316 }
317 @media screen and (max-width: 782px) {
318 .fixed .column-likes {
319 display: none;
320 }
321 }
322 </style>
323 <?php
324 }
325
326 /**
327 * Load the JS required for loading the like counts.
328 */
329 public function enqueue_admin_scripts() {
330 if ( empty( $_GET['post_type'] ) || 'post' === $_GET['post_type'] || 'page' === $_GET['post_type'] ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
331 wp_enqueue_script(
332 'likes-post-count',
333 Assets::get_file_url_for_environment(
334 '_inc/build/likes/post-count.min.js',
335 'modules/likes/post-count.js'
336 ),
337 array( 'jquery' ),
338 JETPACK__VERSION,
339 $in_footer = false
340 );
341 wp_enqueue_script(
342 'likes-post-count-jetpack',
343 Assets::get_file_url_for_environment(
344 '_inc/build/likes/post-count-jetpack.min.js',
345 'modules/likes/post-count-jetpack.js'
346 ),
347 array( 'jquery', 'likes-post-count' ),
348 JETPACK__VERSION,
349 $in_footer = false
350 );
351 }
352 }
353
354 /**
355 * Add "Likes" column data to the post edit table in wp-admin.
356 *
357 * @param string $column_name - name of the column.
358 * @param int $post_id - the post id.
359 */
360 public function likes_edit_column( $column_name, $post_id ) {
361 if ( 'likes' === $column_name ) {
362
363 $blog_id = Jetpack_Options::get_option( 'id' );
364
365 $permalink = get_permalink( get_the_ID() );
366 ?>
367 <a title="" data-post-id="<?php echo (int) $post_id; ?>" class="post-com-count post-like-count" id="post-like-count-<?php echo (int) $post_id; ?>" data-blog-id="<?php echo (int) $blog_id; ?>" href="<?php echo esc_url( $permalink ); ?>#like-<?php echo (int) $post_id; ?>">
368 <span class="comment-count">0</span>
369 </a>
370 <?php
371 }
372 }
373
374 /**
375 * Add a "Likes" column header to the post edit table in wp-admin.
376 *
377 * @param array $columns - array of columns in wp-admin.
378 */
379 public function add_like_count_column( $columns ) {
380 $date = $columns['date'];
381 unset( $columns['date'] );
382
383 $columns['likes'] = '<span class="vers"><img title="' . esc_attr__( 'Likes', 'jetpack' ) . '" alt="' . esc_attr__( 'Likes', 'jetpack' ) . '" src="//s0.wordpress.com/i/like-grey-icon.png" /><span class="screen-reader-text">' . __( 'Likes', 'jetpack' ) . '</span></span>';
384 $columns['date'] = $date;
385
386 return $columns;
387 }
388
389 /**
390 * Append like button to content.
391 *
392 * @param string $content - content of the page.
393 */
394 public function post_likes( $content ) {
395 global $wp_current_filter;
396 $post_id = get_the_ID();
397
398 if ( ! is_numeric( $post_id ) || ! $this->settings->is_likes_visible() ) {
399 return $content;
400 }
401
402 // Do not output Likes on requests for ActivityPub requests.
403 if (
404 function_exists( '\Activitypub\is_activitypub_request' )
405 && \Activitypub\is_activitypub_request()
406 ) {
407 return $content;
408 }
409
410 // Ensure we don't display like button on post excerpts that are hooked inside the post content
411 if ( in_array( 'the_excerpt', (array) $wp_current_filter, true ) &&
412 in_array( 'the_content', (array) $wp_current_filter, true ) ) {
413 return $content;
414 }
415
416 $blog_id = Jetpack_Options::get_option( 'id' );
417 $url = home_url();
418 $url_parts = wp_parse_url( $url );
419 $domain = $url_parts['host'];
420
421 // Make sure to include the scripts before the iframe otherwise weird things happen.
422 add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
423
424 /**
425 * If the same post appears more then once on a page the page goes crazy
426 * we need a slightly more unique id / name for the widget wrapper.
427 */
428 $uniqid = uniqid();
429 /**
430 * Enable an alternate Likes layout.
431 *
432 * @since 12.9
433 *
434 * @module likes
435 *
436 * @param bool $new_layout Enable the new Likes layout. False by default.
437 */
438 $new_layout = apply_filters( 'likes_new_layout', true ) ? '&amp;n=1' : '';
439
440 $src = sprintf( 'https://widgets.wp.com/likes/?ver=%1$s#blog_id=%2$d&amp;post_id=%3$d&amp;origin=%4$s&amp;obj_id=%2$d-%3$d-%5$s%6$s', rawurlencode( JETPACK__VERSION ), $blog_id, $post_id, $domain, $uniqid, $new_layout );
441 $name = sprintf( 'like-post-frame-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
442 $wrapper = sprintf( 'like-post-wrapper-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
443 $headline = sprintf(
444 /** This filter is already documented in modules/sharedaddy/sharing-service.php */
445 apply_filters( 'jetpack_sharing_headline_html', '<h3 class="sd-title">%s</h3>', esc_html__( 'Like this:', 'jetpack' ), 'likes' ),
446 esc_html__( 'Like this:', 'jetpack' )
447 );
448
449 $title = esc_html__( 'Like or Reblog', 'jetpack' );
450
451 $html = "<div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='$wrapper' data-src='$src' data-name='$name' data-title='$title'>";
452 $html .= $headline;
453 $html .= "<div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>" . esc_html__( 'Like', 'jetpack' ) . '</span></span> <span class="loading">' . esc_html__( 'Loading...', 'jetpack' ) . '</span></div>';
454 $html .= "<span class='sd-text-color'></span><a class='sd-link-color'></a>";
455 $html .= '</div>';
456
457 // Let's make sure that the script is enqueued.
458 wp_enqueue_script( 'jetpack_likes_queuehandler' );
459
460 return $content . $html;
461 }
462 }
463
464 /**
465 * Callback to get the value for the jetpack_likes_enabled field.
466 *
467 * Warning: this behavior is somewhat complicated!
468 * When the switch_like_status post_meta is unset, we follow the global setting in Sharing.
469 * When it is set to 0, we disable likes on the post, regardless of the global setting.
470 * When it is set to 1, we enable likes on the post, regardless of the global setting.
471 *
472 * @param array $post - post data we're checking.
473 *
474 * @return bool
475 */
476 function jetpack_post_likes_get_value( array $post ) {
477 if ( ! isset( $post['id'] ) ) {
478 return false;
479 }
480
481 $post_likes_switched = get_post_meta( $post['id'], 'switch_like_status', true );
482
483 /** This filter is documented in modules/jetpack-likes-settings.php */
484 $sitewide_likes_enabled = (bool) apply_filters( 'wpl_is_enabled_sitewide', ! get_option( 'disabled_likes' ) );
485
486 // An empty string: post meta was not set, so go with the global setting.
487 if ( '' === $post_likes_switched ) {
488 return $sitewide_likes_enabled;
489 } elseif ( '0' === $post_likes_switched ) { // User overrode the global setting to disable likes.
490 return false;
491 } elseif ( '1' === $post_likes_switched ) { // User overrode the global setting to enable likes.
492 return true;
493 }
494 // No default fallback, let's stay explicit.
495 }
496
497 /**
498 * Callback to set switch_like_status post_meta when jetpack_likes_enabled is updated.
499 *
500 * Warning: this behavior is somewhat complicated!
501 * When the switch_like_status post_meta is unset, we follow the global setting in Sharing.
502 * When it is set to 0, we disable likes on the post, regardless of the global setting.
503 * When it is set to 1, we enable likes on the post, regardless of the global setting.
504 *
505 * @param bool $enable_post_likes - checks if post likes are enabled.
506 * @param object $post_object - object containing post data.
507 */
508 function jetpack_post_likes_update_value( $enable_post_likes, $post_object ) {
509 /** This filter is documented in modules/jetpack-likes-settings.php */
510 $sitewide_likes_enabled = (bool) apply_filters( 'wpl_is_enabled_sitewide', ! get_option( 'disabled_likes' ) );
511
512 $should_switch_status = $enable_post_likes !== $sitewide_likes_enabled;
513
514 if ( $should_switch_status ) {
515 // Set the meta to 0 if the user wants to disable likes, 1 if user wants to enable.
516 $switch_like_status = ( $enable_post_likes ? 1 : 0 );
517 return update_post_meta( $post_object->ID, 'switch_like_status', $switch_like_status );
518 } else {
519 // Unset the meta otherwise.
520 return delete_post_meta( $post_object->ID, 'switch_like_status' );
521 }
522 }
523
524 /**
525 * Add Likes post_meta to the REST API Post response.
526 *
527 * @action rest_api_init
528 * @uses register_rest_field
529 * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/modifying-responses/
530 */
531 function jetpack_post_likes_register_rest_field() {
532 $post_types = get_post_types( array( 'public' => true ) );
533 foreach ( $post_types as $post_type ) {
534 register_rest_field(
535 $post_type,
536 'jetpack_likes_enabled',
537 array(
538 'get_callback' => 'jetpack_post_likes_get_value',
539 'update_callback' => 'jetpack_post_likes_update_value',
540 'schema' => array(
541 'description' => __( 'Are Likes enabled?', 'jetpack' ),
542 'type' => 'boolean',
543 ),
544 )
545 );
546
547 /**
548 * Ensures all public internal post-types support `likes`
549 * This feature support flag is used by the REST API and Gutenberg.
550 */
551 add_post_type_support( $post_type, 'jetpack-post-likes' );
552 }
553 }
554
555 // Add Likes post_meta to the REST API Post response.
556 add_action( 'rest_api_init', 'jetpack_post_likes_register_rest_field' );
557
558 // Some CPTs (e.g. Jetpack portfolios and testimonials) get registered with
559 // restapi_theme_init because they depend on theme support, so let's also hook to that.
560 add_action( 'restapi_theme_init', 'jetpack_post_likes_register_rest_field', 20 );
561
562 Jetpack_Likes::init();
563