Completed
Push — add/jetpack-start-reconnect-us... ( 7f1fbb )
by
unknown
10:36
created

Jetpack_Likes::meta_box_content()   B

Complexity

Conditions 6
Paths 4

Size

Total Lines 39
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 15
nc 4
nop 1
dl 0
loc 39
rs 8.439
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
C Jetpack_Likes::action_init() 0 27 13
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
		add_action( 'init', array( &$this, 'action_init' ) );
41
		add_action( 'admin_init', array( $this, 'admin_init' ) );
42
43
		if ( $this->in_jetpack ) {
44
			add_action( 'jetpack_activate_module_likes',   array( $this, 'set_social_notifications_like' ) );
45
			add_action( 'jetpack_deactivate_module_likes', array( $this, 'delete_social_notifications_like' ) );
46
47
			Jetpack::enable_module_configurable( __FILE__ );
48
			Jetpack::module_configuration_load( __FILE__, array( $this, 'configuration_redirect' ) );
49
50
			add_action( 'admin_print_scripts-settings_page_sharing', array( &$this, 'load_jp_css' ) );
51
			add_filter( 'sharing_show_buttons_on_row_start', array( $this, 'configuration_target_area' ) );
52
53
			$active = Jetpack::get_active_modules();
54
55 View Code Duplication
			if ( ! in_array( 'sharedaddy', $active ) && ! in_array( 'publicize', $active ) ) {
56
				// we don't have a sharing page yet
57
				add_action( 'admin_menu', array( $this->settings, 'sharing_menu' ) );
58
			}
59
60 View Code Duplication
			if ( in_array( 'publicize', $active ) && ! in_array( 'sharedaddy', $active ) ) {
61
				// we have a sharing page but not the global options area
62
				add_action( 'pre_admin_screen_sharing', array( $this->settings, 'sharing_block' ), 20 );
63
				add_action( 'pre_admin_screen_sharing', array( $this->settings, 'updated_message' ), -10 );
64
			}
65
66 View Code Duplication
			if( ! in_array( 'sharedaddy', $active ) ) {
67
				add_action( 'admin_init', array( $this->settings, 'process_update_requests_if_sharedaddy_not_loaded' ) );
68
				add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_showbuttonon_init' ), 19 );
69
				add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_showbuttonon_callback' ), 19 );
70
				add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
71
			} else {
72
				add_filter( 'sharing_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
73
				add_action( 'start_sharing_meta_box_content', array( $this->settings, 'meta_box_content' ) );
74
			}
75
		} else { // wpcom
76
			add_action( 'wpmu_new_blog', array( $this, 'enable_comment_likes' ), 10, 1 );
77
			add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
78
			add_action( 'end_likes_meta_box_content', array( $this->settings, 'sharing_meta_box_content' ) );
79
			add_filter( 'likes_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
80
		}
81
82
		add_action( 'admin_init', array( $this, 'admin_discussion_likes_settings_init' ) ); // Likes notifications
83
84
		add_action( 'admin_bar_menu', array( $this, 'admin_bar_likes' ), 60 );
85
86
		add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_register_scripts' ) );
87
88
		add_action( 'save_post', array( $this->settings, 'meta_box_save' ) );
89
		add_action( 'edit_attachment', array( $this->settings, 'meta_box_save' ) );
90
		add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_init' ), 20 );
91
		add_action( 'sharing_admin_update',   array( $this->settings, 'admin_settings_callback' ), 20 );
92
	}
93
94
	/**
95
	 * Set the social_notifications_like option to `on` when the Likes module is activated.
96
	 *
97
	 * @since 3.7.0
98
	 *
99
	 * @return null
100
	 */
101
	function set_social_notifications_like() {
102
		update_option( 'social_notifications_like', 'on' );
103
	}
104
105
	/**
106
	 * Delete the social_notifications_like option that was set to `on` on module activation.
107
	 *
108
	 * @since 3.7.0
109
	 *
110
	 * @return null
111
	 */
112
	function delete_social_notifications_like() {
113
		delete_option( 'social_notifications_like' );
114
	}
115
116
	/**
117
	 * Redirects to the likes section of the sharing page.
118
	 */
119
	function configuration_redirect() {
120
		wp_safe_redirect( admin_url( 'options-general.php?page=sharing#likes' ) );
121
		die();
0 ignored issues
show
Coding Style Compatibility introduced by
The method configuration_redirect() contains an exit expression.

An exit expression should only be used in rare cases. For example, if you write a short command line script.

In most cases however, using an exit expression makes the code untestable and often causes incompatibilities with other libraries. Thus, unless you are absolutely sure it is required here, we recommend to refactor your code to avoid its usage.

Loading history...
122
	}
123
124
	/**
125
	 * Loads Jetpack's CSS on the sharing page so we can use .jetpack-targetable
126
	 */
127
	function load_jp_css() {
128
		// Do we really need `admin_styles`? With the new admin UI, it's breaking some bits.
129
		// Jetpack::init()->admin_styles();
130
	}
131
132
	/**
133
	 * Load scripts and styles for front end.
134
	 * @return null
135
	 */
136
	function load_styles_register_scripts() {
137
		if ( $this->in_jetpack ) {
138
			wp_enqueue_style( 'jetpack_likes', plugins_url( 'likes/style.css', __FILE__ ), array(), JETPACK__VERSION );
139
			$this->register_scripts();
140
		}
141
	}
142
143
	/**
144
	 * Adds in the jetpack-targetable class so when we visit sharing#likes our like settings get highlighted by a yellow box
145
	 * @param  string $html row heading for the sharedaddy "which page" setting
146
	 * @return string       html with the jetpack-targetable class and likes id. tbody gets closed after the like settings
147
	 */
148
	function configuration_target_area( $html = '' ) {
149
		$html = "<tbody id='likes' class='jetpack-targetable'>" . $html;
150
		return $html;
151
	}
152
153
	/**
154
	 * WordPress.com: Metabox option for sharing (sharedaddy will handle this on the JP blog)
155
	 */
156
	function sharing_meta_box_content( $post ) {
157
		$post_id = ! empty( $post->ID ) ? (int) $post->ID : get_the_ID();
158
		$disabled = get_post_meta( $post_id, 'sharing_disabled', true ); ?>
159
		<p>
160
			<label for="wpl_enable_post_sharing">
161
				<input type="checkbox" name="wpl_enable_post_sharing" id="wpl_enable_post_sharing" value="1" <?php checked( !$disabled ); ?>>
162
				<?php _e( 'Show sharing buttons.', 'jetpack' ); ?>
163
			</label>
164
			<input type="hidden" name="wpl_sharing_status_hidden" value="1" />
165
		</p> <?php
166
	}
167
168
	/**
169
	  * Options to be added to the discussion page (see also admin_settings_init, etc below for Sharing settings page)
170
	  */
171
172 View Code Duplication
	function admin_discussion_likes_settings_init() {
173
		// Add a temporary section, until we can move the setting out of there and with the rest of the email notification settings
174
		add_settings_section( 'likes-notifications', __( 'Likes Notifications', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_section' ), 'discussion' );
175
		add_settings_field( 'social-notifications', __( 'Email me whenever', 'jetpack' ), array( $this, 'admin_discussion_likes_settings_field' ), 'discussion', 'likes-notifications' );
176
		// Register the setting
177
		register_setting( 'discussion', 'social_notifications_like', array( $this, 'admin_discussion_likes_settings_validate' ) );
178
	}
179
180
	function admin_discussion_likes_settings_section() {
181
		// Atypical usage here.  We emit jquery to move likes notification checkbox to be with the rest of the email notification settings
182
?>
183
	<script type="text/javascript">
184
	jQuery( function( $ )  {
185
		var table = $( '#social_notifications_like' ).parents( 'table:first' ),
186
			header = table.prevAll( 'h2:first' ),
187
			newParent = $( '#moderation_notify' ).parent( 'label' ).parent();
188
189
		if ( !table.length || !header.length || !newParent.length ) {
190
			return;
191
		}
192
193
		newParent.append( '<br/>' ).append( table.end().parent( 'label' ).siblings().andSelf() );
194
		header.remove();
195
		table.remove();
196
	} );
197
	</script>
198
<?php
199
	}
200
201
	function admin_likes_get_option( $option ) {
202
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
203
			$option_setting = get_blog_option( get_current_blog_id(), $option, 'on' );
204
		} else {
205
			$option_setting = get_option( $option, 'on' );
206
		}
207
208
		return intval( 'on' == $option_setting );
209
	}
210
211
	function admin_discussion_likes_settings_field() {
212
		$like = $this->admin_likes_get_option( 'social_notifications_like' );
213
?>
214
		<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>
215
<?php
216
	}
217
218
	function admin_discussion_likes_settings_validate( $input ) {
219
		// If it's not set (was unchecked during form submission) or was set to off (during option update), return 'off'.
220
		if ( !$input || 'off' == $input )
221
			return 'off';
222
223
		// Otherwise, return 'on'.
224
		return 'on';
225
	}
226
227
	function admin_init() {
228
		add_filter( 'manage_posts_columns', array( $this, 'add_like_count_column' ) );
229
		add_filter( 'manage_pages_columns', array( $this, 'add_like_count_column' ) );
230
		add_action( 'manage_posts_custom_column', array( $this, 'likes_edit_column' ), 10, 2 );
231
		add_action( 'manage_pages_custom_column', array( $this, 'likes_edit_column' ), 10, 2 );
232
		add_action( 'admin_print_styles-edit.php', array( $this, 'load_admin_css' ) );
233
		add_action( "admin_print_scripts-edit.php", array( $this, 'enqueue_admin_scripts' ) );
234
	}
235
236
	function action_init() {
237
		if ( is_admin() ) {
238
			return;
239
		}
240
241
		if ( ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) ||
242
			 ( defined( 'APP_REQUEST' ) && APP_REQUEST ) ||
243
			 ( defined( 'REST_API_REQUEST' ) && REST_API_REQUEST ) ||
244
			 ( defined( 'COOKIE_AUTH_REQUEST' ) && COOKIE_AUTH_REQUEST ) ||
245
			 ( defined( 'JABBER_SERVER' ) && JABBER_SERVER ) ) {
246
			return;
247
		}
248
249
		if ( $this->in_jetpack ) {
250
			add_filter( 'the_content', array( &$this, 'post_likes' ), 30, 1 );
251
			add_filter( 'the_excerpt', array( &$this, 'post_likes' ), 30, 1 );
252
253
		} else {
254
			add_filter( 'post_flair', array( &$this, 'post_likes' ), 30, 1 );
255
			add_filter( 'post_flair_block_css', array( $this, 'post_flair_service_enabled_like' ) );
256
257
			wp_enqueue_script( 'postmessage', '/wp-content/js/postmessage.js', array( 'jquery' ), JETPACK__VERSION, false );
258
			wp_enqueue_script( 'jetpack_resize', '/wp-content/js/jquery/jquery.jetpack-resize.js', array( 'jquery' ), JETPACK__VERSION, false );
259
			wp_enqueue_script( 'jetpack_likes_queuehandler', plugins_url( 'queuehandler.js' , __FILE__ ), array( 'jquery', 'postmessage', 'jetpack_resize' ), JETPACK__VERSION, true );
260
			wp_enqueue_style( 'jetpack_likes', plugins_url( 'jetpack-likes.css', __FILE__ ), array(), JETPACK__VERSION );
261
		}
262
	}
263
264
	/**
265
	* Register scripts
266
	*/
267
	function register_scripts() {
268
		wp_register_script( 'postmessage', plugins_url( '_inc/postmessage.js', dirname(__FILE__) ), array( 'jquery' ), JETPACK__VERSION, false );
269
		wp_register_script( 'jetpack_resize', plugins_url( '_inc/jquery.jetpack-resize.js' , dirname(__FILE__) ), array( 'jquery' ), JETPACK__VERSION, false );
270
		wp_register_script( 'jetpack_likes_queuehandler', plugins_url( 'likes/queuehandler.js' , __FILE__ ), array( 'jquery', 'postmessage', 'jetpack_resize' ), JETPACK__VERSION, true );
271
	}
272
273
	/**
274
	* Load the CSS needed for the wp-admin area.
275
	*/
276
	function load_admin_css() {
277
	?>
278
		<style type="text/css">
279
			.vers img { display: none; }
280
			.metabox-prefs .vers img { display: inline; }
281
			.fixed .column-likes { width: 5.5em; padding: 8px 0; text-align: left; }
282
			.fixed .column-stats { width: 5em; }
283
			.fixed .column-likes .post-com-count {
284
				-webkit-box-sizing: border-box;
285
				-moz-box-sizing: border-box;
286
				box-sizing: border-box;
287
				display: inline-block;
288
				padding: 0 8px;
289
				height: 2em;
290
				margin-top: 5px;
291
				-webkit-border-radius: 5px;
292
				border-radius: 5px;
293
				background-color: #72777C;
294
				color: #FFF;
295
				font-size: 11px;
296
				line-height: 21px;
297
			}
298
			.fixed .column-likes .post-com-count::after { border: none !important; }
299
			.fixed .column-likes .post-com-count:hover { background-color: #0073AA; }
300
			.fixed .column-likes .vers:before {
301
				font: normal 20px/1 dashicons;
302
				content: '\f155';
303
				speak: none;
304
				-webkit-font-smoothing: antialiased;
305
				-moz-osx-font-smoothing: grayscale;
306
			}
307
			@media screen and (max-width: 782px) {
308
				.fixed .column-likes {
309
					display: none;
310
				}
311
			}
312
		</style>
313
		<?php
314
	}
315
316
	/**
317
	* Load the JS required for loading the like counts.
318
	*/
319
	function enqueue_admin_scripts() {
320
		if ( empty( $_GET['post_type'] ) || 'post' == $_GET['post_type'] || 'page' == $_GET['post_type'] ) {
321
			if ( $this->in_jetpack ) {
322
				wp_enqueue_script( 'likes-post-count', plugins_url( 'modules/likes/post-count.js', dirname( __FILE__ ) ), array( 'jquery' ), JETPACK__VERSION );
323
				wp_enqueue_script( 'likes-post-count-jetpack', plugins_url( 'modules/likes/post-count-jetpack.js', dirname( __FILE__ ) ), array( 'likes-post-count' ), JETPACK__VERSION );
324
			} else {
325
				wp_enqueue_script( 'jquery.wpcom-proxy-request', "/wp-content/js/jquery/jquery.wpcom-proxy-request.js", array('jquery'), NULL, true );
326
				wp_enqueue_script( 'likes-post-count', plugins_url( 'likes/post-count.js', dirname( __FILE__ ) ), array( 'jquery' ), JETPACK__VERSION );
327
				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 );
328
			}
329
		}
330
	}
331
332
	/**
333
	* Add "Likes" column data to the post edit table in wp-admin.
334
	*
335
	* @param string $column_name
336
	* @param int $post_id
337
	*/
338
	function likes_edit_column( $column_name, $post_id ) {
339
		if ( 'likes' == $column_name ) {
340
341
			if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
342
				$blog_id = get_current_blog_id();
343
			} else {
344
				$blog_id = Jetpack_Options::get_option( 'id' );
345
			}
346
347
			$permalink = get_permalink( get_the_ID() ); ?>
348
			<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; ?>">
349
				<span class="comment-count">0</span>
350
			</a>
351
			<?php
352
		}
353
	}
354
355
	/**
356
	* Add a "Likes" column header to the post edit table in wp-admin.
357
	*
358
	* @param array $columns
359
	* @return array
360
	*/
361
	function add_like_count_column( $columns ) {
362
		$date = $columns['date'];
363
		unset( $columns['date'] );
364
365
		$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>';
366
		$columns['date'] = $date;
367
368
		return $columns;
369
	}
370
371
	function post_likes( $content ) {
372
		$post_id = get_the_ID();
373
374
		if ( ! is_numeric( $post_id ) || ! $this->settings->is_likes_visible() )
375
			return $content;
376
377 View Code Duplication
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
378
			$blog_id = get_current_blog_id();
379
			$bloginfo = get_blog_details( (int) $blog_id );
380
			$domain = $bloginfo->domain;
381
		} else {
382
			$blog_id = Jetpack_Options::get_option( 'id' );
383
			$url = home_url();
384
			$url_parts = parse_url( $url );
385
			$domain = $url_parts['host'];
386
		}
387
		// make sure to include the scripts before the iframe otherwise weird things happen
388
		add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
389
390
		/**
391
		* if the same post appears more then once on a page the page goes crazy
392
		* we need a slightly more unique id / name for the widget wrapper.
393
		*/
394
		$uniqid = uniqid();
395
396
		$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 );
397
		$name = sprintf( 'like-post-frame-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
398
		$wrapper = sprintf( 'like-post-wrapper-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
399
		$headline = sprintf(
400
			/** This filter is already documented in modules/sharedaddy/sharing-service.php */
401
			apply_filters( 'jetpack_sharing_headline_html', '<h3 class="sd-title">%s</h3>', esc_html__( 'Like this:', 'jetpack' ), 'likes' ),
402
			esc_html__( 'Like this:', 'jetpack' )
403
		);
404
405
		$html  = "<div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='$wrapper' data-src='$src' data-name='$name'>";
406
		$html .= $headline;
407
		$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>';
408
		$html .= "<span class='sd-text-color'></span><a class='sd-link-color'></a>";
409
		$html .= '</div>';
410
411
		// Let's make sure that the script is enqueued
412
		wp_enqueue_script( 'jetpack_likes_queuehandler' );
413
414
		return $content . $html;
415
	}
416
417
	function post_flair_service_enabled_like( $classes ) {
418
		$classes[] = 'sd-like-enabled';
419
		return $classes;
420
	}
421
422
	function is_admin_bar_button_visible() {
423
		global $wp_admin_bar;
424
425
		if ( ! is_object( $wp_admin_bar ) )
426
			return false;
427
428
		if ( ( ! is_singular( 'post' ) && ! is_attachment() && ! is_page() ) )
429
			return false;
430
431
		if ( ! $this->settings->is_likes_visible() )
432
			return false;
433
434
		if ( ! $this->settings->is_post_likeable() )
435
			return false;
436
437
		/**
438
		 * Filters whether the Like button is enabled in the admin bar.
439
		 *
440
		 * @module likes
441
		 *
442
		 * @since 2.2.0
443
		 *
444
		 * @param bool true Should the Like button be visible in the Admin bar. Default to true.
445
		 */
446
		return (bool) apply_filters( 'jetpack_admin_bar_likes_enabled', true );
447
	}
448
449
	function admin_bar_likes() {
450
		global $wp_admin_bar;
451
452
		$post_id = get_the_ID();
453
454
		if ( ! is_numeric( $post_id ) || ! $this->is_admin_bar_button_visible() ) {
455
			return;
456
		}
457
458
		$protocol = 'http';
459
		if ( is_ssl() )
460
			$protocol = 'https';
461
462 View Code Duplication
		if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
463
			$blog_id = get_current_blog_id();
464
			$bloginfo = get_blog_details( (int) $blog_id );
465
			$domain = $bloginfo->domain;
466
		} else {
467
			$blog_id = Jetpack_Options::get_option( 'id' );
468
			$url = home_url();
469
			$url_parts = parse_url( $url );
470
			$domain = $url_parts['host'];
471
		}
472
		// make sure to include the scripts before the iframe otherwise weird things happen
473
		add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
474
475
		$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 );
476
477
		$html = "<iframe class='admin-bar-likes-widget jetpack-likes-widget' scrolling='no' frameBorder='0' name='admin-bar-likes-widget' src='$src'></iframe>";
478
479
		$node = array(
480
				'id'   => 'admin-bar-likes-widget',
481
				'meta' => array(
482
							'html' => $html
483
				)
484
		);
485
486
		$wp_admin_bar->add_node( $node );
487
	}
488
}
489
490
Jetpack_Likes::init();
491