Completed
Push — renovate/copy-webpack-plugin-5... ( 5b2e7f...8235b4 )
by
unknown
52:22 queued 45:34
created

likes.php ➔ jetpack_post_likes_set_extension_availability()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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