Completed
Push — try/move-comment-likes-to-pack... ( 10f739...a53827 )
by
unknown
08:10
created

likes.php ➔ jetpack_post_likes_update_value()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
nc 3
nop 2
dl 0
loc 15
rs 9.7666
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
use Automattic\Jetpack\Assets;
15
16
Jetpack::dns_prefetch( array(
17
	'//widgets.wp.com',
18
	'//s0.wp.com',
19
	'//0.gravatar.com',
20
	'//1.gravatar.com',
21
	'//2.gravatar.com',
22
) );
23
24
class Jetpack_Likes {
25
	public static function init() {
26
		static $instance = NULL;
27
28
		if ( ! $instance ) {
29
			$instance = new Jetpack_Likes();
30
		}
31
32
		return $instance;
33
	}
34
35
	function __construct() {
36
		$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...
37
		$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...
38
39
		// We need to run on wp hook rather than init because we check is_amp_endpoint()
40
		// when bootstrapping hooks
41
		add_action( 'wp', array( &$this, 'action_init' ), 99 );
42
43
		add_action( 'admin_init', array( $this, 'admin_init' ) );
44
45
		if ( $this->in_jetpack ) {
46
			add_action( 'jetpack_activate_module_likes',   array( $this, 'set_social_notifications_like' ) );
47
			add_action( 'jetpack_deactivate_module_likes', array( $this, 'delete_social_notifications_like' ) );
48
49
			Jetpack::enable_module_configurable( __FILE__ );
50
			add_filter( 'jetpack_module_configuration_url_likes', array( $this, 'jetpack_likes_configuration_url' ) );
51
			add_action( 'admin_print_scripts-settings_page_sharing', array( &$this, 'load_jp_css' ) );
52
			add_filter( 'sharing_show_buttons_on_row_start', array( $this, 'configuration_target_area' ) );
53
54
			$active = Jetpack::get_active_modules();
55
56 View Code Duplication
			if ( ! in_array( 'sharedaddy', $active ) && ! in_array( 'publicize', $active ) ) {
57
				// we don't have a sharing page yet
58
				add_action( 'admin_menu', array( $this->settings, 'sharing_menu' ) );
59
			}
60
61 View Code Duplication
			if ( in_array( 'publicize', $active ) && ! in_array( 'sharedaddy', $active ) ) {
62
				// we have a sharing page but not the global options area
63
				add_action( 'pre_admin_screen_sharing', array( $this->settings, 'sharing_block' ), 20 );
64
				add_action( 'pre_admin_screen_sharing', array( $this->settings, 'updated_message' ), -10 );
65
			}
66
67 View Code Duplication
			if( ! in_array( 'sharedaddy', $active ) ) {
68
				add_action( 'admin_init', array( $this->settings, 'process_update_requests_if_sharedaddy_not_loaded' ) );
69
				add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_showbuttonon_init' ), 19 );
70
				add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_showbuttonon_callback' ), 19 );
71
				add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
72
			} else {
73
				add_filter( 'sharing_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
74
				add_action( 'start_sharing_meta_box_content', array( $this->settings, 'meta_box_content' ) );
75
			}
76
		} else { // wpcom
77
			add_action( 'wpmu_new_blog', array( $this, 'enable_comment_likes' ), 10, 1 );
78
			add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
79
			add_action( 'end_likes_meta_box_content', array( $this->settings, 'sharing_meta_box_content' ) );
80
			add_filter( 'likes_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
81
		}
82
83
		add_action( 'admin_init', array( $this, 'admin_discussion_likes_settings_init' ) ); // Likes notifications
84
85
		add_action( 'admin_bar_menu', array( $this, 'admin_bar_likes' ), 60 );
86
87
		add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_register_scripts' ) );
88
89
		add_action( 'save_post', array( $this->settings, 'meta_box_save' ) );
90
		add_action( 'edit_attachment', array( $this->settings, 'meta_box_save' ) );
91
		add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_init' ), 20 );
92
		add_action( 'sharing_admin_update',   array( $this->settings, 'admin_settings_callback' ), 20 );
93
	}
94
95
	/**
96
	 * Set the social_notifications_like option to `on` when the Likes module is activated.
97
	 *
98
	 * @since 3.7.0
99
	 *
100
	 * @return null
101
	 */
102
	function set_social_notifications_like() {
103
		update_option( 'social_notifications_like', 'on' );
104
	}
105
106
	/**
107
	 * Delete the social_notifications_like option that was set to `on` on module activation.
108
	 *
109
	 * @since 3.7.0
110
	 *
111
	 * @return null
112
	 */
113
	function delete_social_notifications_like() {
114
		delete_option( 'social_notifications_like' );
115
	}
116
117
118
	/**
119
	 * Overrides default configuration url
120
	 *
121
	 * @uses admin_url
122
	 * @return string module settings URL
123
	 */
124
	function jetpack_likes_configuration_url() {
125
		return admin_url( 'options-general.php?page=sharing#likes' );
126
	}
127
128
	/**
129
	 * Loads Jetpack's CSS on the sharing page so we can use .jetpack-targetable
130
	 */
131
	function load_jp_css() {
132
		// Do we really need `admin_styles`? With the new admin UI, it's breaking some bits.
133
		// Jetpack::init()->admin_styles();
134
	}
135
136
	/**
137
	 * Load scripts and styles for front end.
138
	 * @return null
139
	 */
140
	function load_styles_register_scripts() {
141
		if ( $this->in_jetpack ) {
142
			wp_enqueue_style( 'jetpack_likes', plugins_url( '../assets/css/style.css', __FILE__ ), array(), JETPACK__VERSION );
143
			$this->register_scripts();
144
		}
145
	}
146
147
148
	/**
149
     * Stub for is_post_likeable, since some wpcom functions call this directly on the class
150
	 * Are likes enabled for this post?
151
     *
152
     * @param int $post_id
153
     * @return bool
154
	 */
155
	static function is_post_likeable( $post_id = 0 ) {
156
		_deprecated_function( __METHOD__, 'jetpack-5.4', 'Jetpack_Likes_Settings()->is_post_likeable' );
157
		$settings = new Jetpack_Likes_Settings();
158
		return $settings->is_post_likeable();
159
	}
160
161
	/**
162
	 * Stub for is_likes_visible, since some themes were calling it directly from this class
163
	 *
164
	 * @deprecated 5.4
165
	 * @return bool
166
	 */
167
	function is_likes_visible() {
168
		_deprecated_function( __METHOD__, 'jetpack-5.4', 'Jetpack_Likes_Settings()->is_likes_visible' );
169
170
		$settings = new Jetpack_Likes_Settings();
171
		return $settings->is_likes_visible();
172
	}
173
174
	/**
175
	 * Adds in the jetpack-targetable class so when we visit sharing#likes our like settings get highlighted by a yellow box
176
	 * @param  string $html row heading for the sharedaddy "which page" setting
177
	 * @return string       html with the jetpack-targetable class and likes id. tbody gets closed after the like settings
178
	 */
179
	function configuration_target_area( $html = '' ) {
180
		$html = "<tbody id='likes' class='jetpack-targetable'>" . $html;
181
		return $html;
182
	}
183
184
	/**
185
	  * Options to be added to the discussion page (see also admin_settings_init, etc below for Sharing settings page)
186
	  */
187
188
	function admin_discussion_likes_settings_init() {
189
		// Add a temporary section, until we can move the setting out of there and with the rest of the email notification settings
190
		add_settings_section( 'likes-notifications', __( 'Likes Notifications', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_section' ), 'discussion' );
191
		add_settings_field( 'social-notifications', __( 'Email me whenever', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_field' ), 'discussion', 'likes-notifications' );
192
		// Register the setting
193
		register_setting( 'discussion', 'social_notifications_like', array( $this, 'admin_discussion_likes_settings_validate' ) );
194
	}
195
196
	function admin_discussion_likes_settings_section() {
197
		// Atypical usage here.  We emit jquery to move likes notification checkbox to be with the rest of the email notification settings
198
?>
199
	<script type="text/javascript">
200
	jQuery( function( $ )  {
201
		var table = $( '#social_notifications_like' ).parents( 'table:first' ),
202
			header = table.prevAll( 'h2:first' ),
203
			newParent = $( '#moderation_notify' ).parent( 'label' ).parent();
204
205
		if ( !table.length || !header.length || !newParent.length ) {
206
			return;
207
		}
208
209
		newParent.append( '<br/>' ).append( table.end().parent( 'label' ).siblings().andSelf() );
210
		header.remove();
211
		table.remove();
212
	} );
213
	</script>
214
<?php
215
	}
216
217
	function admin_likes_get_option( $option ) {
218
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
219
			$option_setting = get_blog_option( get_current_blog_id(), $option, 'on' );
220
		} else {
221
			$option_setting = get_option( $option, 'on' );
222
		}
223
224
		return intval( 'on' == $option_setting );
225
	}
226
227
	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
	function admin_discussion_likes_settings_validate( $input ) {
235
		// If it's not set (was unchecked during form submission) or was set to off (during option update), return 'off'.
236
		if ( !$input || 'off' == $input )
237
			return 'off';
238
239
		// Otherwise, return 'on'.
240
		return 'on';
241
	}
242
243
	function admin_init() {
244
		add_filter( 'manage_posts_columns', array( $this, 'add_like_count_column' ) );
245
		add_filter( 'manage_pages_columns', array( $this, 'add_like_count_column' ) );
246
		add_action( 'manage_posts_custom_column', array( $this, 'likes_edit_column' ), 10, 2 );
247
		add_action( 'manage_pages_custom_column', array( $this, 'likes_edit_column' ), 10, 2 );
248
		add_action( 'admin_print_styles-edit.php', array( $this, 'load_admin_css' ) );
249
		add_action( "admin_print_scripts-edit.php", array( $this, 'enqueue_admin_scripts' ) );
250
	}
251
252
	function action_init() {
253
		if ( is_admin() ) {
254
			return;
255
		}
256
257
		if ( ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) ||
258
			 ( defined( 'APP_REQUEST' ) && APP_REQUEST ) ||
259
			 ( defined( 'REST_API_REQUEST' ) && REST_API_REQUEST ) ||
260
			 ( defined( 'COOKIE_AUTH_REQUEST' ) && COOKIE_AUTH_REQUEST ) ||
261
			 ( defined( 'JABBER_SERVER' ) && JABBER_SERVER ) ) {
262
			return;
263
		}
264
265
		if (
266
			class_exists( 'Jetpack_AMP_Support' )
267
			&& Jetpack_AMP_Support::is_amp_request()
268
		) {
269
			return;
270
		}
271
272
		if ( $this->in_jetpack ) {
273
			add_filter( 'the_content', array( &$this, 'post_likes' ), 30, 1 );
274
			add_filter( 'the_excerpt', array( &$this, 'post_likes' ), 30, 1 );
275
276
		} else {
277
			add_filter( 'post_flair', array( &$this, 'post_likes' ), 30, 1 );
278
			add_filter( 'post_flair_block_css', array( $this, 'post_flair_service_enabled_like' ) );
279
280
			wp_enqueue_script( 'postmessage', '/wp-content/js/postmessage.js', array( 'jquery' ), JETPACK__VERSION, false );
281
			wp_enqueue_script( 'jetpack_resize', '/wp-content/js/jquery/jquery.jetpack-resize.js', array( 'jquery' ), JETPACK__VERSION, false );
282
			wp_enqueue_script( 'jetpack_likes_queuehandler', plugins_url( 'queuehandler.js' , __FILE__ ), array( 'jquery', 'postmessage', 'jetpack_resize' ), JETPACK__VERSION, true );
283
			wp_enqueue_style( 'jetpack_likes', plugins_url( 'jetpack-likes.css', __FILE__ ), array(), JETPACK__VERSION );
284
		}
285
	}
286
287
	/**
288
	* Register scripts
289
	*/
290
	function register_scripts() {
291
		wp_register_script(
292
			'postmessage',
293
			Assets::get_file_url_for_environment( '_inc/build/postmessage.min.js', '_inc/postmessage.js' ),
294
			array( 'jquery' ),
295
			JETPACK__VERSION,
296
			false
297
		);
298
		wp_register_script(
299
			'jetpack_resize',
300
			Assets::get_file_url_for_environment(
301
				'_inc/build/jquery.jetpack-resize.min.js',
302
				'_inc/jquery.jetpack-resize.js'
303
			),
304
			array( 'jquery' ),
305
			JETPACK__VERSION,
306
			false
307
		);
308
		wp_register_script(
309
			'jetpack_likes_queuehandler',
310
			Assets::get_file_url_for_environment(
311
				'_inc/build/jetpack-module-likes/assets/js/queuehandler.min.js',
312
				'vendor/automattic/jetpack-module-likes/assets/js/queuehandler.js'
313
			),
314
			array( 'jquery', 'postmessage', 'jetpack_resize' ),
315
			JETPACK__VERSION,
316
			true
317
		);
318
	}
319
320
	/**
321
	* Load the CSS needed for the wp-admin area.
322
	*/
323
	function load_admin_css() {
324
	?>
325
		<style type="text/css">
326
			.vers img { display: none; }
327
			.metabox-prefs .vers img { display: inline; }
328
			.fixed .column-likes { width: 5.5em; padding: 8px 0; text-align: left; }
329
			.fixed .column-stats { width: 5em; }
330
			.fixed .column-likes .post-com-count {
331
				-webkit-box-sizing: border-box;
332
				-moz-box-sizing: border-box;
333
				box-sizing: border-box;
334
				display: inline-block;
335
				padding: 0 8px;
336
				height: 2em;
337
				margin-top: 5px;
338
				-webkit-border-radius: 5px;
339
				border-radius: 5px;
340
				background-color: #72777C;
341
				color: #FFF;
342
				font-size: 11px;
343
				line-height: 21px;
344
			}
345
			.fixed .column-likes .post-com-count::after { border: none !important; }
346
			.fixed .column-likes .post-com-count:hover { background-color: #0073AA; }
347
			.fixed .column-likes .vers:before {
348
				font: normal 20px/1 dashicons;
349
				content: '\f155';
350
				speak: none;
351
				-webkit-font-smoothing: antialiased;
352
				-moz-osx-font-smoothing: grayscale;
353
			}
354
			@media screen and (max-width: 782px) {
355
				.fixed .column-likes {
356
					display: none;
357
				}
358
			}
359
		</style>
360
		<?php
361
	}
362
363
	/**
364
	* Load the JS required for loading the like counts.
365
	*/
366
	function enqueue_admin_scripts() {
367
		if ( empty( $_GET['post_type'] ) || 'post' == $_GET['post_type'] || 'page' == $_GET['post_type'] ) {
368
			if ( $this->in_jetpack ) {
369
				wp_enqueue_script(
370
					'likes-post-count',
371
					Assets::get_file_url_for_environment(
372
						'_inc/build/jetpack-module-likes/assets/js/_inc/build/likes/post-count.min.js',
373
						'vendor/automattic/jetpack-module-likes/assets/js/post-count.js'
374
					),
375
					array( 'jquery' ),
376
					JETPACK__VERSION
377
				);
378
				wp_enqueue_script(
379
					'likes-post-count-jetpack',
380
					Assets::get_file_url_for_environment(
381
						'_inc/build/jetpack-module-likes/assets/js/_inc/build/likes/post-count-jetpack.min.js',
382
						'vendor/automattic/jetpack-module-likes/assets/js/post-count-jetpack.js'
383
					),
384
					array( 'likes-post-count' ),
385
					JETPACK__VERSION
386
				);
387
			} else {
388
				// TODO: fix for WPCOM
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', array( 'Jetpack_Likes_Master_Iframe', 'render' ), 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', array( 'Jetpack_Likes_Master_Iframe', 'render' ), 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 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