Completed
Push — renovate/mini-css-extract-plug... ( b55b5d...5664c3 )
by
unknown
12:11 queued 05:01
created

Jetpack_Likes::is_post_likeable()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
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
14
Jetpack::dns_prefetch( array(
15
	'//widgets.wp.com',
16
	'//s0.wp.com',
17
	'//0.gravatar.com',
18
	'//1.gravatar.com',
19
	'//2.gravatar.com',
20
) );
21
22
include_once dirname( __FILE__ ) . '/likes/jetpack-likes-master-iframe.php';
23
include_once dirname( __FILE__ ) . '/likes/jetpack-likes-settings.php';
24
25
class Jetpack_Likes {
26
	public static function init() {
27
		static $instance = NULL;
28
29
		if ( ! $instance ) {
30
			$instance = new Jetpack_Likes;
31
		}
32
33
		return $instance;
34
	}
35
36
	function __construct() {
37
		$this->in_jetpack = ( defined( 'IS_WPCOM' ) && IS_WPCOM ) ? false : true;
0 ignored issues
show
Bug introduced by
The property in_jetpack does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
38
		$this->settings = new Jetpack_Likes_Settings();
0 ignored issues
show
Bug introduced by
The property settings does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
39
40
		// We need to run on wp hook rather than init because we check is_amp_endpoint()
41
		// when bootstrapping hooks
42
		add_action( 'wp', array( &$this, 'action_init' ), 99 );
43
44
		add_action( 'admin_init', array( $this, 'admin_init' ) );
45
46
		if ( $this->in_jetpack ) {
47
			add_action( 'jetpack_activate_module_likes',   array( $this, 'set_social_notifications_like' ) );
48
			add_action( 'jetpack_deactivate_module_likes', array( $this, 'delete_social_notifications_like' ) );
49
50
			Jetpack::enable_module_configurable( __FILE__ );
51
			add_filter( 'jetpack_module_configuration_url_likes', array( $this, 'jetpack_likes_configuration_url' ) );
52
			add_action( 'admin_print_scripts-settings_page_sharing', array( &$this, 'load_jp_css' ) );
53
			add_filter( 'sharing_show_buttons_on_row_start', array( $this, 'configuration_target_area' ) );
54
55
			$active = Jetpack::get_active_modules();
56
57 View Code Duplication
			if ( ! in_array( 'sharedaddy', $active ) && ! in_array( 'publicize', $active ) ) {
58
				// we don't have a sharing page yet
59
				add_action( 'admin_menu', array( $this->settings, 'sharing_menu' ) );
60
			}
61
62 View Code Duplication
			if ( in_array( 'publicize', $active ) && ! in_array( 'sharedaddy', $active ) ) {
63
				// we have a sharing page but not the global options area
64
				add_action( 'pre_admin_screen_sharing', array( $this->settings, 'sharing_block' ), 20 );
65
				add_action( 'pre_admin_screen_sharing', array( $this->settings, 'updated_message' ), -10 );
66
			}
67
68 View Code Duplication
			if( ! in_array( 'sharedaddy', $active ) ) {
69
				add_action( 'admin_init', array( $this->settings, 'process_update_requests_if_sharedaddy_not_loaded' ) );
70
				add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_showbuttonon_init' ), 19 );
71
				add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_showbuttonon_callback' ), 19 );
72
				add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
73
			} else {
74
				add_filter( 'sharing_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
75
				add_action( 'start_sharing_meta_box_content', array( $this->settings, 'meta_box_content' ) );
76
			}
77
		} else { // wpcom
78
			add_action( 'wpmu_new_blog', array( $this, 'enable_comment_likes' ), 10, 1 );
79
			add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
80
			add_action( 'end_likes_meta_box_content', array( $this->settings, 'sharing_meta_box_content' ) );
81
			add_filter( 'likes_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
82
		}
83
84
		add_action( 'admin_init', array( $this, 'admin_discussion_likes_settings_init' ) ); // Likes notifications
85
86
		add_action( 'admin_bar_menu', array( $this, 'admin_bar_likes' ), 60 );
87
88
		add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_register_scripts' ) );
89
90
		add_action( 'save_post', array( $this->settings, 'meta_box_save' ) );
91
		add_action( 'edit_attachment', array( $this->settings, 'meta_box_save' ) );
92
		add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_init' ), 20 );
93
		add_action( 'sharing_admin_update',   array( $this->settings, 'admin_settings_callback' ), 20 );
94
	}
95
96
	/**
97
	 * Set the social_notifications_like option to `on` when the Likes module is activated.
98
	 *
99
	 * @since 3.7.0
100
	 *
101
	 * @return null
102
	 */
103
	function set_social_notifications_like() {
104
		update_option( 'social_notifications_like', 'on' );
105
	}
106
107
	/**
108
	 * Delete the social_notifications_like option that was set to `on` on module activation.
109
	 *
110
	 * @since 3.7.0
111
	 *
112
	 * @return null
113
	 */
114
	function delete_social_notifications_like() {
115
		delete_option( 'social_notifications_like' );
116
	}
117
118
119
	/**
120
	 * Overrides default configuration url
121
	 *
122
	 * @uses admin_url
123
	 * @return string module settings URL
124
	 */
125
	function jetpack_likes_configuration_url() {
126
		return admin_url( 'options-general.php?page=sharing#likes' );
127
	}
128
129
	/**
130
	 * Loads Jetpack's CSS on the sharing page so we can use .jetpack-targetable
131
	 */
132
	function load_jp_css() {
133
		// Do we really need `admin_styles`? With the new admin UI, it's breaking some bits.
134
		// Jetpack::init()->admin_styles();
135
	}
136
137
	/**
138
	 * Load scripts and styles for front end.
139
	 * @return null
140
	 */
141
	function load_styles_register_scripts() {
142
		if ( $this->in_jetpack ) {
143
			wp_enqueue_style( 'jetpack_likes', plugins_url( 'likes/style.css', __FILE__ ), array(), JETPACK__VERSION );
144
			$this->register_scripts();
145
		}
146
	}
147
148
149
	/**
150
     * Stub for is_post_likeable, since some wpcom functions call this directly on the class
151
	 * Are likes enabled for this post?
152
     *
153
     * @param int $post_id
154
     * @return bool
155
	 */
156
	static function is_post_likeable( $post_id = 0 ) {
157
		_deprecated_function( __METHOD__, 'jetpack-5.4', 'Jetpack_Likes_Settings()->is_post_likeable' );
158
		$settings = new Jetpack_Likes_Settings();
159
		return $settings->is_post_likeable();
160
	}
161
162
	/**
163
	 * Stub for is_likes_visible, since some themes were calling it directly from this class
164
	 *
165
	 * @deprecated 5.4
166
	 * @return bool
167
	 */
168
	function is_likes_visible() {
169
		_deprecated_function( __METHOD__, 'jetpack-5.4', 'Jetpack_Likes_Settings()->is_likes_visible' );
170
171
		$settings = new Jetpack_Likes_Settings();
172
		return $settings->is_likes_visible();
173
	}
174
175
	/**
176
	 * Adds in the jetpack-targetable class so when we visit sharing#likes our like settings get highlighted by a yellow box
177
	 * @param  string $html row heading for the sharedaddy "which page" setting
178
	 * @return string       html with the jetpack-targetable class and likes id. tbody gets closed after the like settings
179
	 */
180
	function configuration_target_area( $html = '' ) {
181
		$html = "<tbody id='likes' class='jetpack-targetable'>" . $html;
182
		return $html;
183
	}
184
185
	/**
186
	  * Options to be added to the discussion page (see also admin_settings_init, etc below for Sharing settings page)
187
	  */
188
189
	function admin_discussion_likes_settings_init() {
190
		// Add a temporary section, until we can move the setting out of there and with the rest of the email notification settings
191
		add_settings_section( 'likes-notifications', __( 'Likes Notifications', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_section' ), 'discussion' );
192
		add_settings_field( 'social-notifications', __( 'Email me whenever', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_field' ), 'discussion', 'likes-notifications' );
193
		// Register the setting
194
		register_setting( 'discussion', 'social_notifications_like', array( $this, 'admin_discussion_likes_settings_validate' ) );
195
	}
196
197
	function admin_discussion_likes_settings_section() {
198
		// Atypical usage here.  We emit jquery to move likes notification checkbox to be with the rest of the email notification settings
199
?>
200
	<script type="text/javascript">
201
	jQuery( function( $ )  {
202
		var table = $( '#social_notifications_like' ).parents( 'table:first' ),
203
			header = table.prevAll( 'h2:first' ),
204
			newParent = $( '#moderation_notify' ).parent( 'label' ).parent();
205
206
		if ( !table.length || !header.length || !newParent.length ) {
207
			return;
208
		}
209
210
		newParent.append( '<br/>' ).append( table.end().parent( 'label' ).siblings().andSelf() );
211
		header.remove();
212
		table.remove();
213
	} );
214
	</script>
215
<?php
216
	}
217
218
	function admin_likes_get_option( $option ) {
219
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
220
			$option_setting = get_blog_option( get_current_blog_id(), $option, 'on' );
221
		} else {
222
			$option_setting = get_option( $option, 'on' );
223
		}
224
225
		return intval( 'on' == $option_setting );
226
	}
227
228
	function admin_discussion_likes_settings_field() {
229
		$like = $this->admin_likes_get_option( 'social_notifications_like' );
230
?>
231
		<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>
232
<?php
233
	}
234
235
	function admin_discussion_likes_settings_validate( $input ) {
236
		// If it's not set (was unchecked during form submission) or was set to off (during option update), return 'off'.
237
		if ( !$input || 'off' == $input )
238
			return 'off';
239
240
		// Otherwise, return 'on'.
241
		return 'on';
242
	}
243
244
	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
	function action_init() {
254
		if ( is_admin() ) {
255
			return;
256
		}
257
258
		if ( ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) ||
259
			 ( defined( 'APP_REQUEST' ) && APP_REQUEST ) ||
260
			 ( defined( 'REST_API_REQUEST' ) && REST_API_REQUEST ) ||
261
			 ( defined( 'COOKIE_AUTH_REQUEST' ) && COOKIE_AUTH_REQUEST ) ||
262
			 ( defined( 'JABBER_SERVER' ) && JABBER_SERVER ) ) {
263
			return;
264
		}
265
266
		if (
267
			class_exists( 'Jetpack_AMP_Support' )
268
			&& Jetpack_AMP_Support::is_amp_request()
269
		) {
270
			return;
271
		}
272
273
		if ( $this->in_jetpack ) {
274
			add_filter( 'the_content', array( &$this, 'post_likes' ), 30, 1 );
275
			add_filter( 'the_excerpt', array( &$this, 'post_likes' ), 30, 1 );
276
277
		} else {
278
			add_filter( 'post_flair', array( &$this, 'post_likes' ), 30, 1 );
279
			add_filter( 'post_flair_block_css', array( $this, 'post_flair_service_enabled_like' ) );
280
281
			wp_enqueue_script( 'postmessage', '/wp-content/js/postmessage.js', array( 'jquery' ), JETPACK__VERSION, false );
282
			wp_enqueue_script( 'jetpack_resize', '/wp-content/js/jquery/jquery.jetpack-resize.js', array( 'jquery' ), JETPACK__VERSION, false );
283
			wp_enqueue_script( 'jetpack_likes_queuehandler', plugins_url( 'queuehandler.js' , __FILE__ ), array( 'jquery', 'postmessage', 'jetpack_resize' ), JETPACK__VERSION, true );
284
			wp_enqueue_style( 'jetpack_likes', plugins_url( 'jetpack-likes.css', __FILE__ ), array(), JETPACK__VERSION );
285
		}
286
	}
287
288
	/**
289
	* Register scripts
290
	*/
291
	function register_scripts() {
292
		wp_register_script(
293
			'postmessage',
294
			Jetpack::get_file_url_for_environment( '_inc/build/postmessage.min.js', '_inc/postmessage.js' ),
295
			array( 'jquery' ),
296
			JETPACK__VERSION,
297
			false
298
		);
299
		wp_register_script(
300
			'jetpack_resize',
301
			Jetpack::get_file_url_for_environment(
302
				'_inc/build/jquery.jetpack-resize.min.js',
303
				'_inc/jquery.jetpack-resize.js'
304
			),
305
			array( 'jquery' ),
306
			JETPACK__VERSION,
307
			false
308
		);
309
		wp_register_script(
310
			'jetpack_likes_queuehandler',
311
			Jetpack::get_file_url_for_environment(
312
				'_inc/build/likes/queuehandler.min.js',
313
				'modules/likes/queuehandler.js'
314
			),
315
			array( 'jquery', 'postmessage', 'jetpack_resize' ),
316
			JETPACK__VERSION,
317
			true
318
		);
319
	}
320
321
	/**
322
	* Load the CSS needed for the wp-admin area.
323
	*/
324
	function load_admin_css() {
325
	?>
326
		<style type="text/css">
327
			.vers img { display: none; }
328
			.metabox-prefs .vers img { display: inline; }
329
			.fixed .column-likes { width: 5.5em; padding: 8px 0; text-align: left; }
330
			.fixed .column-stats { width: 5em; }
331
			.fixed .column-likes .post-com-count {
332
				-webkit-box-sizing: border-box;
333
				-moz-box-sizing: border-box;
334
				box-sizing: border-box;
335
				display: inline-block;
336
				padding: 0 8px;
337
				height: 2em;
338
				margin-top: 5px;
339
				-webkit-border-radius: 5px;
340
				border-radius: 5px;
341
				background-color: #72777C;
342
				color: #FFF;
343
				font-size: 11px;
344
				line-height: 21px;
345
			}
346
			.fixed .column-likes .post-com-count::after { border: none !important; }
347
			.fixed .column-likes .post-com-count:hover { background-color: #0073AA; }
348
			.fixed .column-likes .vers:before {
349
				font: normal 20px/1 dashicons;
350
				content: '\f155';
351
				speak: none;
352
				-webkit-font-smoothing: antialiased;
353
				-moz-osx-font-smoothing: grayscale;
354
			}
355
			@media screen and (max-width: 782px) {
356
				.fixed .column-likes {
357
					display: none;
358
				}
359
			}
360
		</style>
361
		<?php
362
	}
363
364
	/**
365
	* Load the JS required for loading the like counts.
366
	*/
367
	function enqueue_admin_scripts() {
368
		if ( empty( $_GET['post_type'] ) || 'post' == $_GET['post_type'] || 'page' == $_GET['post_type'] ) {
369
			if ( $this->in_jetpack ) {
370
				wp_enqueue_script(
371
					'likes-post-count',
372
					Jetpack::get_file_url_for_environment(
373
						'_inc/build/likes/post-count.min.js',
374
						'modules/likes/post-count.js'
375
					),
376
					array( 'jquery' ),
377
					JETPACK__VERSION
378
				);
379
				wp_enqueue_script(
380
					'likes-post-count-jetpack',
381
					Jetpack::get_file_url_for_environment(
382
						'_inc/build/likes/post-count-jetpack.min.js',
383
						'modules/likes/post-count-jetpack.js'
384
					),
385
					array( 'likes-post-count' ),
386
					JETPACK__VERSION
387
				);
388
			} else {
389
				wp_enqueue_script( 'jquery.wpcom-proxy-request', "/wp-content/js/jquery/jquery.wpcom-proxy-request.js", array('jquery'), NULL, true );
390
				wp_enqueue_script( 'likes-post-count', plugins_url( 'likes/post-count.js', dirname( __FILE__ ) ), array( 'jquery' ), JETPACK__VERSION );
391
				wp_enqueue_script( 'likes-post-count-wpcom', plugins_url( 'likes/post-count-wpcom.js', dirname( __FILE__ ) ), array( 'likes-post-count', 'jquery.wpcom-proxy-request' ), JETPACK__VERSION );
392
			}
393
		}
394
	}
395
396
	/**
397
	* Add "Likes" column data to the post edit table in wp-admin.
398
	*
399
	* @param string $column_name
400
	* @param int $post_id
401
	*/
402
	function likes_edit_column( $column_name, $post_id ) {
403
		if ( 'likes' == $column_name ) {
404
405 View Code Duplication
			if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
406
				$blog_id = get_current_blog_id();
407
			} else {
408
				$blog_id = Jetpack_Options::get_option( 'id' );
409
			}
410
411
			$permalink = get_permalink( get_the_ID() ); ?>
412
			<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; ?>">
413
				<span class="comment-count">0</span>
414
			</a>
415
			<?php
416
		}
417
	}
418
419
	/**
420
	* Add a "Likes" column header to the post edit table in wp-admin.
421
	*
422
	* @param array $columns
423
	* @return array
424
	*/
425
	function add_like_count_column( $columns ) {
426
		$date = $columns['date'];
427
		unset( $columns['date'] );
428
429
		$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>';
430
		$columns['date'] = $date;
431
432
		return $columns;
433
	}
434
435
	function post_likes( $content ) {
436
		$post_id = get_the_ID();
437
438
		if ( ! is_numeric( $post_id ) || ! $this->settings->is_likes_visible() )
439
			return $content;
440
441 View Code Duplication
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
442
			$blog_id = get_current_blog_id();
443
			$bloginfo = get_blog_details( (int) $blog_id );
444
			$domain = $bloginfo->domain;
445
		} else {
446
			$blog_id = Jetpack_Options::get_option( 'id' );
447
			$url = home_url();
448
			$url_parts = wp_parse_url( $url );
449
			$domain = $url_parts['host'];
450
		}
451
		// make sure to include the scripts before the iframe otherwise weird things happen
452
		add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
453
454
		/**
455
		* if the same post appears more then once on a page the page goes crazy
456
		* we need a slightly more unique id / name for the widget wrapper.
457
		*/
458
		$uniqid = uniqid();
459
460
		$src = sprintf( 'https://widgets.wp.com/likes/#blog_id=%1$d&amp;post_id=%2$d&amp;origin=%3$s&amp;obj_id=%1$d-%2$d-%4$s', $blog_id, $post_id, $domain, $uniqid );
461
		$name = sprintf( 'like-post-frame-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
462
		$wrapper = sprintf( 'like-post-wrapper-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
463
		$headline = sprintf(
464
			/** This filter is already documented in modules/sharedaddy/sharing-service.php */
465
			apply_filters( 'jetpack_sharing_headline_html', '<h3 class="sd-title">%s</h3>', esc_html__( 'Like this:', 'jetpack' ), 'likes' ),
466
			esc_html__( 'Like this:', 'jetpack' )
467
		);
468
469
		$html  = "<div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='$wrapper' data-src='$src' data-name='$name'>";
470
		$html .= $headline;
471
		$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>';
472
		$html .= "<span class='sd-text-color'></span><a class='sd-link-color'></a>";
473
		$html .= '</div>';
474
475
		// Let's make sure that the script is enqueued
476
		wp_enqueue_script( 'jetpack_likes_queuehandler' );
477
478
		return $content . $html;
479
	}
480
481
	function post_flair_service_enabled_like( $classes ) {
482
		$classes[] = 'sd-like-enabled';
483
		return $classes;
484
	}
485
486
	function is_admin_bar_button_visible() {
487
		global $wp_admin_bar;
488
489
		if ( ! is_object( $wp_admin_bar ) )
490
			return false;
491
492
		if ( ( ! is_singular( 'post' ) && ! is_attachment() && ! is_page() ) )
493
			return false;
494
495
		if ( ! $this->settings->is_likes_visible() )
496
			return false;
497
498
		if ( ! $this->settings->is_post_likeable() )
499
			return false;
500
501
		/**
502
		 * Filters whether the Like button is enabled in the admin bar.
503
		 *
504
		 * @module likes
505
		 *
506
		 * @since 2.2.0
507
		 *
508
		 * @param bool true Should the Like button be visible in the Admin bar. Default to true.
509
		 */
510
		return (bool) apply_filters( 'jetpack_admin_bar_likes_enabled', true );
511
	}
512
513
	function admin_bar_likes() {
514
		global $wp_admin_bar;
515
516
		$post_id = get_the_ID();
517
518
		if ( ! is_numeric( $post_id ) || ! $this->is_admin_bar_button_visible() ) {
519
			return;
520
		}
521
522
		$protocol = 'http';
523
		if ( is_ssl() )
524
			$protocol = 'https';
525
526 View Code Duplication
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
527
			$blog_id = get_current_blog_id();
528
			$bloginfo = get_blog_details( (int) $blog_id );
529
			$domain = $bloginfo->domain;
530
		} else {
531
			$blog_id = Jetpack_Options::get_option( 'id' );
532
			$url = home_url();
533
			$url_parts = wp_parse_url( $url );
534
			$domain = $url_parts['host'];
535
		}
536
		// make sure to include the scripts before the iframe otherwise weird things happen
537
		add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
538
539
		$src = sprintf( 'https://widgets.wp.com/likes/#blog_id=%2$d&amp;post_id=%3$d&amp;origin=%1$s://%4$s', $protocol, $blog_id, $post_id, $domain );
540
541
		$html = "<iframe class='admin-bar-likes-widget jetpack-likes-widget' scrolling='no' frameBorder='0' name='admin-bar-likes-widget' src='$src'></iframe>";
542
543
		$node = array(
544
				'id'   => 'admin-bar-likes-widget',
545
				'meta' => array(
546
							'html' => $html
547
				)
548
		);
549
550
		$wp_admin_bar->add_node( $node );
551
	}
552
}
553
554
/**
555
 * Callback to get the value for the jetpack_likes_enabled field.
556
 *
557
 * Warning: this behavior is somewhat complicated!
558
 * When the switch_like_status post_meta is unset, we follow the global setting in Sharing.
559
 * When it is set to 0, we disable likes on the post, regardless of the global setting.
560
 * When it is set to 1, we enable likes on the post, regardless of the global setting.
561
 */
562
function jetpack_post_likes_get_value( array $post ) {
563
	$post_likes_switched = get_post_meta( $post['id'], 'switch_like_status', true );
564
565
	/** This filter is documented in modules/jetpack-likes-settings.php */
566
	$sitewide_likes_enabled = (bool) apply_filters( 'wpl_is_enabled_sitewide', ! get_option( 'disabled_likes' ) );
567
568
	// an empty string: post meta was not set, so go with the global setting
569
	if ( "" === $post_likes_switched ) {
570
		return $sitewide_likes_enabled;
571
	}
572
573
	// user overrode the global setting to disable likes
574
	elseif ( "0" === $post_likes_switched ) {
575
		return false;
576
	}
577
578
	// user overrode the global setting to enable likes
579
	elseif ( "1" === $post_likes_switched ) {
580
		return true;
581
	}
582
583
	// no default fallback, let's stay explicit
584
}
585
586
/**
587
 * Callback to set switch_like_status post_meta when jetpack_likes_enabled is updated.
588
 *
589
 * Warning: this behavior is somewhat complicated!
590
 * When the switch_like_status post_meta is unset, we follow the global setting in Sharing.
591
 * When it is set to 0, we disable likes on the post, regardless of the global setting.
592
 * When it is set to 1, we enable likes on the post, regardless of the global setting.
593
 */
594
function jetpack_post_likes_update_value( $enable_post_likes, $post_object ) {
595
	/** This filter is documented in modules/jetpack-likes-settings.php */
596
	$sitewide_likes_enabled = (bool) apply_filters( 'wpl_is_enabled_sitewide', ! get_option( 'disabled_likes' ) );
597
598
	$should_switch_status = $enable_post_likes !== $sitewide_likes_enabled;
599
600
	if ( $should_switch_status ) {
601
		// set the meta to 0 if the user wants to disable likes, 1 if user wants to enable
602
		$switch_like_status = ( $enable_post_likes ? 1 : 0 );
603
		return update_post_meta( $post_object->ID, 'switch_like_status', $switch_like_status );
604
	} else {
605
		// unset the meta otherwise
606
		return delete_post_meta( $post_object->ID, 'switch_like_status' );
607
	}
608
}
609
610
/**
611
 * Add Likes post_meta to the REST API Post response.
612
 *
613
 * @action rest_api_init
614
 * @uses register_rest_field
615
 * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/modifying-responses/
616
 */
617 View Code Duplication
function jetpack_post_likes_register_rest_field() {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
618
	$post_types = get_post_types( array( 'public' => true ) );
619
	foreach ( $post_types as $post_type ) {
620
		register_rest_field(
621
			$post_type,
622
			'jetpack_likes_enabled',
623
			array(
624
				'get_callback'    => 'jetpack_post_likes_get_value',
625
				'update_callback' => 'jetpack_post_likes_update_value',
626
				'schema'          => array(
627
					'description' => __( 'Are Likes enabled?', 'jetpack' ),
628
					'type'        => 'boolean',
629
				),
630
			)
631
		);
632
633
		/**
634
		 * Ensures all public internal post-types support `likes`
635
		 * This feature support flag is used by the REST API and Gutenberg.
636
		 */
637
		add_post_type_support( $post_type, 'jetpack-post-likes' );
638
	}
639
}
640
641
// Add Likes post_meta to the REST API Post response.
642
add_action( 'rest_api_init', 'jetpack_post_likes_register_rest_field' );
643
644
// Some CPTs (e.g. Jetpack portfolios and testimonials) get registered with
645
// restapi_theme_init because they depend on theme support, so let's also hook to that
646
add_action( 'restapi_theme_init', 'jetpack_post_likes_register_rest_field', 20 );
647
648
/**
649
 * Set the Likes and Sharing Gutenberg extension availability
650
 */
651
function jetpack_post_likes_set_extension_availability() {
652
	Jetpack_Gutenberg::set_extension_available( 'likes' );
653
}
654
655
add_action( 'jetpack_register_gutenberg_extensions', 'jetpack_post_likes_set_extension_availability' );
656
657
Jetpack_Likes::init();
658