PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.3-beta
16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 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 All 507 releases
← All changes | modules/likes.php +108 -201 13.2.4 → 16.3-beta View file →
@@ -1,8 +1,8 @@
1 1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 2 /**
3 3 * Module Name: Likes
4 - * Module Description: Give visitors an easy way to show they appreciate your content.
4 + * Module Description: Let readers like your posts to show appreciation and encourage interaction.
5 5 * First Introduced: 2.2
6 6 * Sort Order: 23
7 7 * Requires Connection: Yes
8 8 * Auto Activate: No
@@ -20,18 +20,40 @@
20 20
21 21 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
22 22
23 23 use Automattic\Jetpack\Assets;
24 +use Automattic\Jetpack\Sharing_Likes\Post_Likes_Switch;
25 +use Automattic\Jetpack\Status\Host;
24 26
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'
27 +if ( ! defined( 'ABSPATH' ) ) {
28 + exit( 0 );
29 +}
30 +
31 +add_filter(
32 + 'wp_resource_hints',
33 + function ( $hints, $relation_type ) {
34 + if ( 'dns-prefetch' !== $relation_type ) {
35 + return $hints;
36 + }
37 +
38 + // Only hint on pages where Likes can render.
39 + if ( ! is_singular() && ! is_home() && ! is_front_page() && ! is_archive() && ! is_search() ) {
40 + return $hints;
41 + }
42 +
43 + return array_merge(
44 + $hints,
45 + array(
46 + '//widgets.wp.com',
47 + '//s0.wp.com',
48 + '//0.gravatar.com',
49 + '//1.gravatar.com',
50 + '//2.gravatar.com',
51 + )
52 + );
53 + },
54 + 10,
55 + 2
34 56 );
35 57
36 58 require_once __DIR__ . '/likes/jetpack-likes-master-iframe.php';
37 59 require_once __DIR__ . '/likes/jetpack-likes-settings.php';
@@ -39,9 +61,8 @@
39 61 /**
40 62 * Jetpack Like Class
41 63 */
42 64 class Jetpack_Likes {
43 -
44 65 /**
45 66 * Jetpack_Likes_Settings object
46 67 *
47 68 * @var Jetpack_Likes_Settings
@@ -75,25 +96,18 @@
75 96
76 97 add_action( 'jetpack_activate_module_likes', array( $this, 'set_social_notifications_like' ) );
77 98 add_action( 'jetpack_deactivate_module_likes', array( $this, 'delete_social_notifications_like' ) );
78 99
79 - Jetpack::enable_module_configurable( __FILE__ );
100 + // The `enable_module_configurable` method doesn't exist in the WP.com loader implementation.
101 + if ( ! ( new Host() )->is_wpcom_simple() ) {
102 + Jetpack::enable_module_configurable( __FILE__ );
103 + }
104 +
80 105 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 106
84 - $active = Jetpack::get_active_modules();
107 + $sharedaddy_active = Jetpack::is_module_active( 'sharedaddy' );
85 108
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 );
109 + if ( ! $sharedaddy_active ) {
96 110 add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
97 111 } else {
98 112 add_filter( 'sharing_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
99 113 add_action( 'start_sharing_meta_box_content', array( $this->settings, 'meta_box_content' ) );
@@ -100,16 +114,12 @@
100 114 }
101 115
102 116 add_action( 'admin_init', array( $this, 'admin_discussion_likes_settings_init' ) ); // Likes notifications.
103 117
104 - add_action( 'admin_bar_menu', array( $this, 'admin_bar_likes' ), 60 );
105 -
106 118 add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_register_scripts' ) );
107 119
108 120 add_action( 'save_post', array( $this->settings, 'meta_box_save' ) );
109 121 add_action( 'edit_attachment', array( $this->settings, 'meta_box_save' ) );
110 - add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_init' ), 20 );
111 - add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_callback' ), 20 );
112 122 }
113 123
114 124 /**
115 125 * Set the social_notifications_like option to `on` when the Likes module is activated.
@@ -140,21 +150,51 @@
140 150 }
141 151
142 152 /**
143 153 * Loads Jetpack's CSS on the sharing page so we can use .jetpack-targetable
154 + *
155 + * @deprecated 16.3 Settings > Sharing is a plain WordPress settings screen now.
156 + *
157 + * @return void
144 158 */
145 159 public function load_jp_css() {
146 - /**
147 - * Do we really need `admin_styles`? With the new admin UI, it's breaking some bits.
148 - * Jetpack::init()->admin_styles();
149 - */
160 + _deprecated_function( __METHOD__, 'jetpack-16.3' );
150 161 }
151 162
152 163 /**
164 + * Adds in the jetpack-targetable class so when we visit sharing#likes our like settings get highlighted by a yellow box
165 + *
166 + * @deprecated 16.3 The Likes settings have a section of their own on Settings > Sharing.
167 + *
168 + * @param string $html row heading for the sharedaddy "which page" setting.
169 + * @return string The unchanged $html.
170 + */
171 + public function configuration_target_area( $html = '' ) {
172 + _deprecated_function( __METHOD__, 'jetpack-16.3' );
173 + return $html;
174 + }
175 +
176 + /**
153 177 * Load scripts and styles for front end.
154 178 */
155 179 public function load_styles_register_scripts() {
156 - wp_enqueue_style( 'jetpack_likes', plugins_url( 'likes/style.css', __FILE__ ), array(), JETPACK__VERSION );
180 + // Likes are only rendered on pages that display post content.
181 + if ( ! is_singular() && ! is_home() && ! is_front_page() && ! is_archive() && ! is_search() ) {
182 + return;
183 + }
184 +
185 + $style_url = Assets::get_file_url_for_environment(
186 + '_inc/build/likes/style.min.css',
187 + 'modules/likes/style.css'
188 + );
189 + wp_enqueue_style( 'jetpack_likes', $style_url, array(), JETPACK__VERSION );
190 + $style_path = plugin_dir_path( JETPACK__PLUGIN_FILE ) . (
191 + /** This filter is documented in projects/plugins/jetpack/load-jetpack.php */
192 + apply_filters( 'jetpack_should_use_minified_assets', true )
193 + ? '_inc/build/likes/style.min.css'
194 + : 'modules/likes/style.css'
195 + );
196 + wp_style_add_data( 'jetpack_likes', 'path', $style_path );
157 197 wp_register_script(
158 198 'jetpack_likes_queuehandler',
159 199 Assets::get_file_url_for_environment(
160 200 '_inc/build/likes/queuehandler.min.js',
@@ -166,21 +206,10 @@
166 206 );
167 207 }
168 208
169 209 /**
170 - * Adds in the jetpack-targetable class so when we visit sharing#likes our like settings get highlighted by a yellow box
171 - *
172 - * @param string $html row heading for the sharedaddy "which page" setting.
173 - * @return string $html with the jetpack-targetable class and likes id. tbody gets closed after the like settings
210 + * Options to be added to the discussion page. The Sharing settings live in Sharing_Likes\Settings\Likes_Section.
174 211 */
175 - public function configuration_target_area( $html = '' ) {
176 - $html = "<tbody id='likes' class='jetpack-targetable'>" . $html;
177 - return $html;
178 - }
179 -
180 - /**
181 - * Options to be added to the discussion page (see also admin_settings_init, etc below for Sharing settings page)
182 - */
183 212 public function admin_discussion_likes_settings_init() {
184 213 // Add a temporary section, until we can move the setting out of there and with the rest of the email notification settings.
185 214 add_settings_section( 'likes-notifications', __( 'Likes Notifications', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_section' ), 'discussion' );
186 215 add_settings_field( 'social-notifications', __( 'Email me whenever', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_field' ), 'discussion', 'likes-notifications' );
@@ -289,16 +318,18 @@
289 318 ?>
290 319 <style type="text/css">
291 320 .vers img { display: none; }
292 321 .metabox-prefs .vers img { display: inline; }
293 - .fixed .column-likes { width: 5.5em; padding: 8px 0; text-align: left; }
294 - .fixed .column-stats { width: 5em; }
322 + .fixed .column-likes { width: 2.5em; padding: 4px 0; text-align: left; }
323 + .fixed .column-stats { width: 5em; white-space: nowrap; }
295 324 .fixed .column-likes .post-com-count {
296 325 -webkit-box-sizing: border-box;
297 326 -moz-box-sizing: border-box;
298 327 box-sizing: border-box;
299 328 display: inline-block;
300 - padding: 0 8px;
329 + padding: 0 4px;
330 + min-width: 2em;
331 + text-align: center;
301 332 height: 2em;
302 333 margin-top: 5px;
303 334 -webkit-border-radius: 5px;
304 335 border-radius: 5px;
@@ -308,9 +339,9 @@
308 339 line-height: 21px;
309 340 }
310 341 .fixed .column-likes .post-com-count::after { border: none !important; }
311 342 .fixed .column-likes .post-com-count:hover { background-color: #2271b1; }
312 - .fixed .column-likes .vers:before {
343 + .fixed .column-likes .vers::before {
313 344 font: normal 20px/1 dashicons;
314 345 content: '\f155';
315 346 speak: none;
316 347 -webkit-font-smoothing: antialiased;
@@ -337,9 +368,9 @@
337 368 'modules/likes/post-count.js'
338 369 ),
339 370 array( 'jquery' ),
340 371 JETPACK__VERSION,
341 - $in_footer = false
372 + false
342 373 );
343 374 wp_enqueue_script(
344 375 'likes-post-count-jetpack',
345 376 Assets::get_file_url_for_environment(
@@ -347,9 +378,9 @@
347 378 'modules/likes/post-count-jetpack.js'
348 379 ),
349 380 array( 'jquery', 'likes-post-count' ),
350 381 JETPACK__VERSION,
351 - $in_footer = false
382 + false
352 383 );
353 384 }
354 385 }
355 386
@@ -419,28 +450,19 @@
419 450 $url = home_url();
420 451 $url_parts = wp_parse_url( $url );
421 452 $domain = $url_parts['host'];
422 453
423 - // Make sure to include the scripts before the iframe otherwise weird things happen.
424 - add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
454 + // Make sure to include the `queuehandler` scripts before the iframe otherwise the script won't find the iframe.
455 + if ( ! has_action( 'wp_footer', 'jetpack_likes_master_iframe' ) ) {
456 + add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
457 + }
425 458
426 459 /**
427 460 * If the same post appears more then once on a page the page goes crazy
428 461 * we need a slightly more unique id / name for the widget wrapper.
429 462 */
430 - $uniqid = uniqid();
431 - /**
432 - * Enable an alternate Likes layout.
433 - *
434 - * @since 12.9
435 - *
436 - * @module likes
437 - *
438 - * @param bool $new_layout Enable the new Likes layout. False by default.
439 - */
440 - $new_layout = apply_filters( 'likes_new_layout', true ) ? '&amp;n=1' : '';
441 -
442 - $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 );
463 + $uniqid = uniqid();
464 + $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', rawurlencode( JETPACK__VERSION ), $blog_id, $post_id, $domain, $uniqid );
443 465 $name = sprintf( 'like-post-frame-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
444 466 $wrapper = sprintf( 'like-post-wrapper-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
445 467 $headline = sprintf(
446 468 /** This filter is already documented in modules/sharedaddy/sharing-service.php */
@@ -449,11 +471,15 @@
449 471 );
450 472
451 473 $title = esc_html__( 'Like or Reblog', 'jetpack' );
452 474
475 + /** This filter is documented in modules/likes/jetpack-likes-master-iframe.php */
476 + $src = apply_filters( 'jetpack_likes_iframe_src', $src );
477 +
453 478 $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'>";
454 479 $html .= $headline;
455 - $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>';
480 + require_once JETPACK__PLUGIN_DIR . '_inc/lib/class-jetpack-spinner.php';
481 + $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">' . Jetpack_Spinner::render( 18 ) . '<span class="screen-reader-text">' . esc_html__( 'Loading…', 'jetpack' ) . '</span></span></div>';
456 482 $html .= "<span class='sd-text-color'></span><a class='sd-link-color'></a>";
457 483 $html .= '</div>';
458 484
459 485 // Let's make sure that the script is enqueued.
@@ -460,167 +486,48 @@
460 486 wp_enqueue_script( 'jetpack_likes_queuehandler' );
461 487
462 488 return $content . $html;
463 489 }
464 -
465 - /** Checks if admin bar is visible.*/
466 - public function is_admin_bar_button_visible() {
467 - global $wp_admin_bar;
468 -
469 - if ( ! is_object( $wp_admin_bar ) ) {
470 - return false;
471 - }
472 -
473 - if ( ( ! is_singular( 'post' ) && ! is_attachment() && ! is_page() ) ) {
474 - return false;
475 - }
476 -
477 - if ( ! $this->settings->is_likes_visible() ) {
478 - return false;
479 - }
480 -
481 - if ( ! $this->settings->is_post_likeable() ) {
482 - return false;
483 - }
484 -
485 - /**
486 - * Filters whether the Like button is enabled in the admin bar.
487 - *
488 - * @module likes
489 - *
490 - * @since 2.2.0
491 - *
492 - * @param bool true Should the Like button be visible in the Admin bar. Default to true.
493 - */
494 - return (bool) apply_filters( 'jetpack_admin_bar_likes_enabled', true );
495 - }
496 -
497 - /** Adds like section in admin bar. */
498 - public function admin_bar_likes() {
499 - global $wp_admin_bar;
500 -
501 - $post_id = get_the_ID();
502 -
503 - if ( ! is_numeric( $post_id ) || ! $this->is_admin_bar_button_visible() ) {
504 - return;
505 - }
506 -
507 - $protocol = 'http';
508 - if ( is_ssl() ) {
509 - $protocol = 'https';
510 - }
511 - $blog_id = Jetpack_Options::get_option( 'id' );
512 - $url = home_url();
513 - $url_parts = wp_parse_url( $url );
514 - $domain = $url_parts['host'];
515 -
516 - // Make sure to include the scripts before the iframe otherwise weird things happen.
517 - add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
518 -
519 - $src = sprintf( 'https://widgets.wp.com/likes/?ver=%1$s#blog_id=%3$d&amp;post_id=%4$d&amp;origin=%2$s://%5$s', rawurlencode( JETPACK__VERSION ), $protocol, $blog_id, $post_id, $domain );
520 -
521 - $html = "<iframe class='admin-bar-likes-widget jetpack-likes-widget' scrolling='no' frameBorder='0' name='admin-bar-likes-widget' src='$src'></iframe>";
522 -
523 - $node = array(
524 - 'id' => 'admin-bar-likes-widget',
525 - 'meta' => array(
526 - 'html' => $html,
527 - ),
528 - );
529 -
530 - $wp_admin_bar->add_node( $node );
531 - }
532 490 }
533 491
534 492 /**
535 493 * Callback to get the value for the jetpack_likes_enabled field.
536 494 *
537 - * Warning: this behavior is somewhat complicated!
538 - * When the switch_like_status post_meta is unset, we follow the global setting in Sharing.
539 - * When it is set to 0, we disable likes on the post, regardless of the global setting.
540 - * When it is set to 1, we enable likes on the post, regardless of the global setting.
495 + * @deprecated 16.3 Use Automattic\Jetpack\Sharing_Likes\Post_Likes_Switch::get_value() instead.
541 496 *
542 497 * @param array $post - post data we're checking.
498 + *
499 + * @return bool|null
543 500 */
544 501 function jetpack_post_likes_get_value( array $post ) {
545 - $post_likes_switched = get_post_meta( $post['id'], 'switch_like_status', true );
546 -
547 - /** This filter is documented in modules/jetpack-likes-settings.php */
548 - $sitewide_likes_enabled = (bool) apply_filters( 'wpl_is_enabled_sitewide', ! get_option( 'disabled_likes' ) );
549 -
550 - // An empty string: post meta was not set, so go with the global setting.
551 - if ( '' === $post_likes_switched ) {
552 - return $sitewide_likes_enabled;
553 - } elseif ( '0' === $post_likes_switched ) { // User overrode the global setting to disable likes.
554 - return false;
555 - } elseif ( '1' === $post_likes_switched ) { // User overrode the global setting to enable likes.
556 - return true;
557 - }
558 - // No default fallback, let's stay explicit.
502 + _deprecated_function( __FUNCTION__, 'jetpack-16.3', 'Automattic\Jetpack\Sharing_Likes\Post_Likes_Switch::get_value' );
503 + return Post_Likes_Switch::get_value( $post );
559 504 }
560 505
561 506 /**
562 507 * Callback to set switch_like_status post_meta when jetpack_likes_enabled is updated.
563 508 *
564 - * Warning: this behavior is somewhat complicated!
565 - * When the switch_like_status post_meta is unset, we follow the global setting in Sharing.
566 - * When it is set to 0, we disable likes on the post, regardless of the global setting.
567 - * When it is set to 1, we enable likes on the post, regardless of the global setting.
509 + * @deprecated 16.3 Use Automattic\Jetpack\Sharing_Likes\Post_Likes_Switch::update_value() instead.
568 510 *
569 511 * @param bool $enable_post_likes - checks if post likes are enabled.
570 512 * @param object $post_object - object containing post data.
513 + *
514 + * @return int|bool
571 515 */
572 516 function jetpack_post_likes_update_value( $enable_post_likes, $post_object ) {
573 - /** This filter is documented in modules/jetpack-likes-settings.php */
574 - $sitewide_likes_enabled = (bool) apply_filters( 'wpl_is_enabled_sitewide', ! get_option( 'disabled_likes' ) );
575 -
576 - $should_switch_status = $enable_post_likes !== $sitewide_likes_enabled;
577 -
578 - if ( $should_switch_status ) {
579 - // Set the meta to 0 if the user wants to disable likes, 1 if user wants to enable.
580 - $switch_like_status = ( $enable_post_likes ? 1 : 0 );
581 - return update_post_meta( $post_object->ID, 'switch_like_status', $switch_like_status );
582 - } else {
583 - // Unset the meta otherwise.
584 - return delete_post_meta( $post_object->ID, 'switch_like_status' );
585 - }
517 + _deprecated_function( __FUNCTION__, 'jetpack-16.3', 'Automattic\Jetpack\Sharing_Likes\Post_Likes_Switch::update_value' );
518 + return Post_Likes_Switch::update_value( $enable_post_likes, $post_object );
586 519 }
587 520
588 521 /**
589 522 * Add Likes post_meta to the REST API Post response.
590 523 *
591 - * @action rest_api_init
592 - * @uses register_rest_field
593 - * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/modifying-responses/
524 + * @deprecated 16.3 Use Automattic\Jetpack\Sharing_Likes\Post_Likes_Switch::register_rest_field() instead.
594 525 */
595 526 function jetpack_post_likes_register_rest_field() {
596 - $post_types = get_post_types( array( 'public' => true ) );
597 - foreach ( $post_types as $post_type ) {
598 - register_rest_field(
599 - $post_type,
600 - 'jetpack_likes_enabled',
601 - array(
602 - 'get_callback' => 'jetpack_post_likes_get_value',
603 - 'update_callback' => 'jetpack_post_likes_update_value',
604 - 'schema' => array(
605 - 'description' => __( 'Are Likes enabled?', 'jetpack' ),
606 - 'type' => 'boolean',
607 - ),
608 - )
609 - );
610 -
611 - /**
612 - * Ensures all public internal post-types support `likes`
613 - * This feature support flag is used by the REST API and Gutenberg.
614 - */
615 - add_post_type_support( $post_type, 'jetpack-post-likes' );
616 - }
527 + _deprecated_function( __FUNCTION__, 'jetpack-16.3', 'Automattic\Jetpack\Sharing_Likes\Post_Likes_Switch::register_rest_field' );
528 + Post_Likes_Switch::register_rest_field();
617 529 }
618 530
619 -// Add Likes post_meta to the REST API Post response.
620 -add_action( 'rest_api_init', 'jetpack_post_likes_register_rest_field' );
621 -
622 -// Some CPTs (e.g. Jetpack portfolios and testimonials) get registered with
623 -// restapi_theme_init because they depend on theme support, so let's also hook to that.
624 -add_action( 'restapi_theme_init', 'jetpack_post_likes_register_rest_field', 20 );
531 +Post_Likes_Switch::init();
625 532
626 533 Jetpack_Likes::init();