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