PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.0.3
Jetpack – WP Security, Backup, Speed, & Growth v12.0.3
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / likes.php
jetpack / modules Last commit date
calypsoify 3 years ago carousel 3 years ago cloudflare-analytics 4 years ago comment-likes 5 years ago comments 3 years ago contact-form 1 year ago custom-css 3 years ago custom-post-types 3 years ago geo-location 4 years ago google-analytics 3 years ago gravatar 6 years ago infinite-scroll 3 years ago likes 3 years ago markdown 3 years ago masterbar 3 years ago memberships 3 years ago photon 6 years ago photon-cdn 3 years ago plugin-search 4 years ago post-by-email 3 years ago related-posts 3 years ago scan 3 years ago seo-tools 3 years ago sharedaddy 3 years ago shortcodes 3 years ago simple-payments 3 years ago site-icon 4 years ago sitemaps 3 years ago sso 3 years ago stats 3 years ago subscriptions 3 years ago theme-tools 3 years ago tiled-gallery 3 years ago verification-tools 4 years ago videopress 3 years ago widget-visibility 3 years ago widgets 3 years ago woocommerce-analytics 4 years ago wordads 3 years ago wpcom-block-editor 4 years ago wpcom-tos 5 years ago action-bar.php 3 years ago carousel.php 4 years ago comment-likes.php 3 years ago comments.php 4 years ago contact-form.php 3 years ago copy-post.php 3 years ago custom-content-types.php 4 years ago custom-css.php 3 years ago enhanced-distribution.php 4 years ago geo-location.php 4 years ago google-analytics.php 4 years ago google-fonts.php 3 years ago gravatar-hovercards.php 3 years ago infinite-scroll.php 3 years ago json-api.php 5 years ago latex.php 4 years ago lazy-images.php 4 years ago likes.php 3 years ago markdown.php 4 years ago masterbar.php 4 years ago module-extras.php 4 years ago module-headings.php 3 years ago module-info.php 3 years ago monitor.php 4 years ago notes.php 3 years ago photon-cdn.php 3 years ago photon.php 4 years ago plugin-search.php 3 years ago post-by-email.php 5 years ago post-list.php 4 years ago protect.php 3 years ago publicize.php 3 years ago related-posts.php 4 years ago search.php 4 years ago seo-tools.php 4 years ago sharedaddy.php 4 years ago shortcodes.php 3 years ago shortlinks.php 4 years ago sitemaps.php 4 years ago sso.php 3 years ago stats.php 3 years ago subscriptions.php 3 years ago theme-tools.php 3 years ago tiled-gallery.php 4 years ago vaultpress.php 4 years ago verification-tools.php 5 years ago videopress.php 4 years ago waf.php 3 years ago widget-visibility.php 4 years ago widgets.php 3 years ago woocommerce-analytics.php 5 years ago wordads.php 5 years ago wpgroho.js 6 years ago
likes.php
623 lines
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Module Name: Likes
4 * Module Description: Give visitors an easy way to show they appreciate your content.
5 * First Introduced: 2.2
6 * Sort Order: 23
7 * Requires Connection: Yes
8 * Auto Activate: No
9 * Module Tags: Social
10 * Feature: Engagement
11 * Additional Search Queries: like, likes, wordpress.com
12 *
13 * @package automattic/jetpack
14 */
15 /**
16 * NOTE: While the front-end behavior currently varies, try to keep the data
17 * model here the same as on wpcom to facilitate Simple→Atomic moves and
18 * possible future work to recombine the front-ends.
19 */
20
21 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
22
23 use Automattic\Jetpack\Assets;
24
25 Assets::add_resource_hint(
26 array(
27 '//widgets.wp.com',
28 '//s0.wp.com',
29 '//0.gravatar.com',
30 '//1.gravatar.com',
31 '//2.gravatar.com',
32 ),
33 'dns-prefetch'
34 );
35
36 require_once __DIR__ . '/likes/jetpack-likes-master-iframe.php';
37 require_once __DIR__ . '/likes/jetpack-likes-settings.php';
38
39 /**
40 * Jetpack Like Class
41 */
42 class Jetpack_Likes {
43
44 /**
45 * Jetpack_Likes_Settings object
46 *
47 * @var Jetpack_Likes_Settings
48 */
49 public $settings;
50
51 /**
52 * Initialize class
53 */
54 public static function init() {
55 static $instance = null;
56
57 if ( ! $instance ) {
58 $instance = new Jetpack_Likes();
59 }
60
61 return $instance;
62 }
63
64 /**
65 * Constructs Likes class
66 */
67 public function __construct() {
68 $this->settings = new Jetpack_Likes_Settings();
69
70 // We need to run on wp hook rather than init because we check is_amp_endpoint()
71 // when bootstrapping hooks.
72 add_action( 'wp', array( $this, 'action_init' ), 99 );
73
74 add_action( 'admin_init', array( $this, 'admin_init' ) );
75
76 add_action( 'jetpack_activate_module_likes', array( $this, 'set_social_notifications_like' ) );
77 add_action( 'jetpack_deactivate_module_likes', array( $this, 'delete_social_notifications_like' ) );
78
79 Jetpack::enable_module_configurable( __FILE__ );
80 add_filter( 'jetpack_module_configuration_url_likes', array( $this, 'jetpack_likes_configuration_url' ) );
81 add_action( 'admin_print_scripts-settings_page_sharing', array( $this, 'load_jp_css' ) );
82 add_filter( 'sharing_show_buttons_on_row_start', array( $this, 'configuration_target_area' ) );
83
84 $active = Jetpack::get_active_modules();
85
86 if ( ! in_array( 'sharedaddy', $active, true ) && ! in_array( 'publicize', $active, true ) ) {
87 // we don't have a sharing page yet.
88 add_action( 'admin_menu', array( $this->settings, 'sharing_menu' ) );
89 }
90
91 if ( in_array( 'publicize', $active, true ) && ! in_array( 'sharedaddy', $active, true ) ) {
92 // we have a sharing page but not the global options area.
93 add_action( 'pre_admin_screen_sharing', array( $this->settings, 'sharing_block' ), 20 );
94 add_action( 'pre_admin_screen_sharing', array( $this->settings, 'updated_message' ), -10 );
95 }
96
97 if ( ! in_array( 'sharedaddy', $active, true ) ) {
98 add_action( 'admin_init', array( $this->settings, 'process_update_requests_if_sharedaddy_not_loaded' ) );
99 add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_showbuttonon_init' ), 19 );
100 add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_showbuttonon_callback' ), 19 );
101 add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
102 } else {
103 add_filter( 'sharing_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
104 add_action( 'start_sharing_meta_box_content', array( $this->settings, 'meta_box_content' ) );
105 }
106
107 add_action( 'admin_init', array( $this, 'admin_discussion_likes_settings_init' ) ); // Likes notifications.
108
109 add_action( 'admin_bar_menu', array( $this, 'admin_bar_likes' ), 60 );
110
111 add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_register_scripts' ) );
112
113 add_action( 'save_post', array( $this->settings, 'meta_box_save' ) );
114 add_action( 'edit_attachment', array( $this->settings, 'meta_box_save' ) );
115 add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_init' ), 20 );
116 add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_callback' ), 20 );
117 }
118
119 /**
120 * Set the social_notifications_like option to `on` when the Likes module is activated.
121 *
122 * @since 3.7.0
123 */
124 public function set_social_notifications_like() {
125 update_option( 'social_notifications_like', 'on' );
126 }
127
128 /**
129 * Delete the social_notifications_like option that was set to `on` on module activation.
130 *
131 * @since 3.7.0
132 */
133 public function delete_social_notifications_like() {
134 delete_option( 'social_notifications_like' );
135 }
136
137 /**
138 * Overrides default configuration url
139 *
140 * @uses admin_url
141 * @return string module settings URL
142 */
143 public function jetpack_likes_configuration_url() {
144 return admin_url( 'options-general.php?page=sharing#likes' );
145 }
146
147 /**
148 * Loads Jetpack's CSS on the sharing page so we can use .jetpack-targetable
149 */
150 public function load_jp_css() {
151 /**
152 * Do we really need `admin_styles`? With the new admin UI, it's breaking some bits.
153 * Jetpack::init()->admin_styles();
154 */
155 }
156
157 /**
158 * Load scripts and styles for front end.
159 */
160 public function load_styles_register_scripts() {
161 wp_enqueue_style( 'jetpack_likes', plugins_url( 'likes/style.css', __FILE__ ), array(), JETPACK__VERSION );
162 wp_register_script(
163 'jetpack_likes_queuehandler',
164 Assets::get_file_url_for_environment(
165 '_inc/build/likes/queuehandler.min.js',
166 'modules/likes/queuehandler.js'
167 ),
168 array(),
169 JETPACK__VERSION,
170 true
171 );
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 *
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 public 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 public 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 /** Add email notification options to WordPress discussion settings */
197 public 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 /** Check if email notifications for likes is on or off.
219 *
220 * @param string $option - which option we're checking (social_notifications_like).
221 */
222 public function admin_likes_get_option( $option ) {
223 $option_setting = get_option( $option, 'on' );
224
225 return (int) ( 'on' === $option_setting );
226 }
227
228 /** Display email notification for likes setting in WordPress' discussion settings. */
229 public function admin_discussion_likes_settings_field() {
230 $like = $this->admin_likes_get_option( 'social_notifications_like' );
231 ?>
232 <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>
233 <?php
234 }
235
236 /**
237 * Validate email notification settings.
238 *
239 * @param string $input - determines if checbox is on or off.
240 */
241 public function admin_discussion_likes_settings_validate( $input ) {
242 // If it's not set (was unchecked during form submission) or was set to off (during option update), return 'off'.
243 if ( ! $input || 'off' === $input ) {
244 return 'off';
245 }
246 // Otherwise return 'on'.
247 return 'on';
248 }
249
250 /** Initialize admin settings */
251 public function admin_init() {
252 add_filter( 'manage_posts_columns', array( $this, 'add_like_count_column' ) );
253 add_filter( 'manage_pages_columns', array( $this, 'add_like_count_column' ) );
254 add_action( 'manage_posts_custom_column', array( $this, 'likes_edit_column' ), 10, 2 );
255 add_action( 'manage_pages_custom_column', array( $this, 'likes_edit_column' ), 10, 2 );
256 add_action( 'admin_print_styles-edit.php', array( $this, 'load_admin_css' ) );
257 add_action( 'admin_print_scripts-edit.php', array( $this, 'enqueue_admin_scripts' ) );
258 }
259
260 /** Initialize action */
261 public function action_init() {
262 /*
263 * Only check if the module is enabled here because
264 * we are not currently in The Loop and do not yet have access to check
265 * the switch_like_status post meta flag for the post to be loaded.
266 */
267 if ( is_admin() || ! $this->settings->is_likes_module_enabled() ) {
268 return;
269 }
270
271 if ( ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) ||
272 ( defined( 'APP_REQUEST' ) && APP_REQUEST ) ||
273 ( defined( 'REST_API_REQUEST' ) && REST_API_REQUEST ) ||
274 ( defined( 'COOKIE_AUTH_REQUEST' ) && COOKIE_AUTH_REQUEST ) ||
275 ( defined( 'JABBER_SERVER' ) && JABBER_SERVER ) ) {
276 return;
277 }
278
279 if (
280 class_exists( 'Jetpack_AMP_Support' )
281 && Jetpack_AMP_Support::is_amp_request()
282 ) {
283 return;
284 }
285
286 add_filter( 'the_content', array( $this, 'post_likes' ), 30, 1 );
287 add_filter( 'the_excerpt', array( $this, 'post_likes' ), 30, 1 );
288 }
289
290 /**
291 * Load the CSS needed for the wp-admin area.
292 */
293 public function load_admin_css() {
294 ?>
295 <style type="text/css">
296 .vers img { display: none; }
297 .metabox-prefs .vers img { display: inline; }
298 .fixed .column-likes { width: 5.5em; padding: 8px 0; text-align: left; }
299 .fixed .column-stats { width: 5em; }
300 .fixed .column-likes .post-com-count {
301 -webkit-box-sizing: border-box;
302 -moz-box-sizing: border-box;
303 box-sizing: border-box;
304 display: inline-block;
305 padding: 0 8px;
306 height: 2em;
307 margin-top: 5px;
308 -webkit-border-radius: 5px;
309 border-radius: 5px;
310 background-color: #787c82;
311 color: #FFF;
312 font-size: 11px;
313 line-height: 21px;
314 }
315 .fixed .column-likes .post-com-count::after { border: none !important; }
316 .fixed .column-likes .post-com-count:hover { background-color: #2271b1; }
317 .fixed .column-likes .vers:before {
318 font: normal 20px/1 dashicons;
319 content: '\f155';
320 speak: none;
321 -webkit-font-smoothing: antialiased;
322 -moz-osx-font-smoothing: grayscale;
323 }
324 @media screen and (max-width: 782px) {
325 .fixed .column-likes {
326 display: none;
327 }
328 }
329 </style>
330 <?php
331 }
332
333 /**
334 * Load the JS required for loading the like counts.
335 */
336 public function enqueue_admin_scripts() {
337 if ( empty( $_GET['post_type'] ) || 'post' === $_GET['post_type'] || 'page' === $_GET['post_type'] ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
338 wp_enqueue_script(
339 'likes-post-count',
340 Assets::get_file_url_for_environment(
341 '_inc/build/likes/post-count.min.js',
342 'modules/likes/post-count.js'
343 ),
344 array( 'jquery' ),
345 JETPACK__VERSION,
346 $in_footer = false
347 );
348 wp_enqueue_script(
349 'likes-post-count-jetpack',
350 Assets::get_file_url_for_environment(
351 '_inc/build/likes/post-count-jetpack.min.js',
352 'modules/likes/post-count-jetpack.js'
353 ),
354 array( 'jquery', 'likes-post-count' ),
355 JETPACK__VERSION,
356 $in_footer = false
357 );
358 }
359 }
360
361 /**
362 * Add "Likes" column data to the post edit table in wp-admin.
363 *
364 * @param string $column_name - name of the column.
365 * @param int $post_id - the post id.
366 */
367 public function likes_edit_column( $column_name, $post_id ) {
368 if ( 'likes' === $column_name ) {
369
370 $blog_id = Jetpack_Options::get_option( 'id' );
371
372 $permalink = get_permalink( get_the_ID() );
373 ?>
374 <a title="" data-post-id="<?php echo (int) $post_id; ?>" class="post-com-count post-like-count" id="post-like-count-<?php echo (int) $post_id; ?>" data-blog-id="<?php echo (int) $blog_id; ?>" href="<?php echo esc_url( $permalink ); ?>#like-<?php echo (int) $post_id; ?>">
375 <span class="comment-count">0</span>
376 </a>
377 <?php
378 }
379 }
380
381 /**
382 * Add a "Likes" column header to the post edit table in wp-admin.
383 *
384 * @param array $columns - array of columns in wp-admin.
385 */
386 public function add_like_count_column( $columns ) {
387 $date = $columns['date'];
388 unset( $columns['date'] );
389
390 $columns['likes'] = '<span class="vers"><img title="' . esc_attr__( 'Likes', 'jetpack' ) . '" alt="' . esc_attr__( 'Likes', 'jetpack' ) . '" src="//s0.wordpress.com/i/like-grey-icon.png" /><span class="screen-reader-text">' . __( 'Likes', 'jetpack' ) . '</span></span>';
391 $columns['date'] = $date;
392
393 return $columns;
394 }
395
396 /**
397 * Append like button to content.
398 *
399 * @param string $content - content of the page.
400 */
401 public function post_likes( $content ) {
402 global $wp_current_filter;
403 $post_id = get_the_ID();
404
405 if ( ! is_numeric( $post_id ) || ! $this->settings->is_likes_visible() ) {
406 return $content;
407 }
408
409 // Ensure we don't display like button on post excerpts that are hooked inside the post content
410 if ( in_array( 'the_excerpt', (array) $wp_current_filter, true ) &&
411 in_array( 'the_content', (array) $wp_current_filter, true ) ) {
412 return $content;
413 }
414
415 $blog_id = Jetpack_Options::get_option( 'id' );
416 $url = home_url();
417 $url_parts = wp_parse_url( $url );
418 $domain = $url_parts['host'];
419
420 // Make sure to include the scripts before the iframe otherwise weird things happen.
421 add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
422
423 /**
424 * If the same post appears more then once on a page the page goes crazy
425 * we need a slightly more unique id / name for the widget wrapper.
426 */
427 $uniqid = uniqid();
428
429 $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 );
430 $name = sprintf( 'like-post-frame-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
431 $wrapper = sprintf( 'like-post-wrapper-%1$d-%2$d-%3$s', $blog_id, $post_id, $uniqid );
432 $headline = sprintf(
433 /** This filter is already documented in modules/sharedaddy/sharing-service.php */
434 apply_filters( 'jetpack_sharing_headline_html', '<h3 class="sd-title">%s</h3>', esc_html__( 'Like this:', 'jetpack' ), 'likes' ),
435 esc_html__( 'Like this:', 'jetpack' )
436 );
437
438 $title = esc_html__( 'Like or Reblog', 'jetpack' );
439
440 $html = "<div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='$wrapper' data-src='$src' data-name='$name' data-title='$title'>";
441 $html .= $headline;
442 $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>';
443 $html .= "<span class='sd-text-color'></span><a class='sd-link-color'></a>";
444 $html .= '</div>';
445
446 // Let's make sure that the script is enqueued.
447 wp_enqueue_script( 'jetpack_likes_queuehandler' );
448
449 return $content . $html;
450 }
451
452 /** Checks if admin bar is visible.*/
453 public function is_admin_bar_button_visible() {
454 global $wp_admin_bar;
455
456 if ( ! is_object( $wp_admin_bar ) ) {
457 return false;
458 }
459
460 if ( ( ! is_singular( 'post' ) && ! is_attachment() && ! is_page() ) ) {
461 return false;
462 }
463
464 if ( ! $this->settings->is_likes_visible() ) {
465 return false;
466 }
467
468 if ( ! $this->settings->is_post_likeable() ) {
469 return false;
470 }
471
472 /**
473 * Filters whether the Like button is enabled in the admin bar.
474 *
475 * @module likes
476 *
477 * @since 2.2.0
478 *
479 * @param bool true Should the Like button be visible in the Admin bar. Default to true.
480 */
481 return (bool) apply_filters( 'jetpack_admin_bar_likes_enabled', true );
482 }
483
484 /** Adds like section in admin bar. */
485 public function admin_bar_likes() {
486 global $wp_admin_bar;
487
488 $post_id = get_the_ID();
489
490 if ( ! is_numeric( $post_id ) || ! $this->is_admin_bar_button_visible() ) {
491 return;
492 }
493
494 $protocol = 'http';
495 if ( is_ssl() ) {
496 $protocol = 'https';
497 }
498 $blog_id = Jetpack_Options::get_option( 'id' );
499 $url = home_url();
500 $url_parts = wp_parse_url( $url );
501 $domain = $url_parts['host'];
502
503 // Make sure to include the scripts before the iframe otherwise weird things happen.
504 add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
505
506 $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 );
507
508 $html = "<iframe class='admin-bar-likes-widget jetpack-likes-widget' scrolling='no' frameBorder='0' name='admin-bar-likes-widget' src='$src'></iframe>";
509
510 $node = array(
511 'id' => 'admin-bar-likes-widget',
512 'meta' => array(
513 'html' => $html,
514 ),
515 );
516
517 $wp_admin_bar->add_node( $node );
518 }
519 }
520
521 /**
522 * Callback to get the value for the jetpack_likes_enabled field.
523 *
524 * Warning: this behavior is somewhat complicated!
525 * When the switch_like_status post_meta is unset, we follow the global setting in Sharing.
526 * When it is set to 0, we disable likes on the post, regardless of the global setting.
527 * When it is set to 1, we enable likes on the post, regardless of the global setting.
528 *
529 * @param array $post - post data we're checking.
530 */
531 function jetpack_post_likes_get_value( array $post ) {
532 $post_likes_switched = get_post_meta( $post['id'], 'switch_like_status', true );
533
534 /** This filter is documented in modules/jetpack-likes-settings.php */
535 $sitewide_likes_enabled = (bool) apply_filters( 'wpl_is_enabled_sitewide', ! get_option( 'disabled_likes' ) );
536
537 // An empty string: post meta was not set, so go with the global setting.
538 if ( '' === $post_likes_switched ) {
539 return $sitewide_likes_enabled;
540 } elseif ( '0' === $post_likes_switched ) { // User overrode the global setting to disable likes.
541 return false;
542 } elseif ( '1' === $post_likes_switched ) { // User overrode the global setting to enable likes.
543 return true;
544 }
545 // No default fallback, let's stay explicit.
546 }
547
548 /**
549 * Callback to set switch_like_status post_meta when jetpack_likes_enabled is updated.
550 *
551 * Warning: this behavior is somewhat complicated!
552 * When the switch_like_status post_meta is unset, we follow the global setting in Sharing.
553 * When it is set to 0, we disable likes on the post, regardless of the global setting.
554 * When it is set to 1, we enable likes on the post, regardless of the global setting.
555 *
556 * @param bool $enable_post_likes - checks if post likes are enabled.
557 * @param object $post_object - object containing post data.
558 */
559 function jetpack_post_likes_update_value( $enable_post_likes, $post_object ) {
560 /** This filter is documented in modules/jetpack-likes-settings.php */
561 $sitewide_likes_enabled = (bool) apply_filters( 'wpl_is_enabled_sitewide', ! get_option( 'disabled_likes' ) );
562
563 $should_switch_status = $enable_post_likes !== $sitewide_likes_enabled;
564
565 if ( $should_switch_status ) {
566 // Set the meta to 0 if the user wants to disable likes, 1 if user wants to enable.
567 $switch_like_status = ( $enable_post_likes ? 1 : 0 );
568 return update_post_meta( $post_object->ID, 'switch_like_status', $switch_like_status );
569 } else {
570 // Unset the meta otherwise.
571 return delete_post_meta( $post_object->ID, 'switch_like_status' );
572 }
573 }
574
575 /**
576 * Add Likes post_meta to the REST API Post response.
577 *
578 * @action rest_api_init
579 * @uses register_rest_field
580 * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/modifying-responses/
581 */
582 function jetpack_post_likes_register_rest_field() {
583 $post_types = get_post_types( array( 'public' => true ) );
584 foreach ( $post_types as $post_type ) {
585 register_rest_field(
586 $post_type,
587 'jetpack_likes_enabled',
588 array(
589 'get_callback' => 'jetpack_post_likes_get_value',
590 'update_callback' => 'jetpack_post_likes_update_value',
591 'schema' => array(
592 'description' => __( 'Are Likes enabled?', 'jetpack' ),
593 'type' => 'boolean',
594 ),
595 )
596 );
597
598 /**
599 * Ensures all public internal post-types support `likes`
600 * This feature support flag is used by the REST API and Gutenberg.
601 */
602 add_post_type_support( $post_type, 'jetpack-post-likes' );
603 }
604 }
605
606 // Add Likes post_meta to the REST API Post response.
607 add_action( 'rest_api_init', 'jetpack_post_likes_register_rest_field' );
608
609 // Some CPTs (e.g. Jetpack portfolios and testimonials) get registered with
610 // restapi_theme_init because they depend on theme support, so let's also hook to that.
611 add_action( 'restapi_theme_init', 'jetpack_post_likes_register_rest_field', 20 );
612
613 /**
614 * Set the Likes and Sharing Gutenberg extension availability.
615 */
616 function jetpack_post_likes_set_extension_availability() {
617 Jetpack_Gutenberg::set_extension_available( 'likes' );
618 }
619
620 add_action( 'jetpack_register_gutenberg_extensions', 'jetpack_post_likes_set_extension_availability' );
621
622 Jetpack_Likes::init();
623