PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.3-beta
16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 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 All 507 releases
jetpack / modules / comment-likes.php

comment-likes.php in Jetpack – WP Security, Backup, Speed, & Growth 16.3-beta, at modules/comment-likes.php

255 lines 7.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Module Name: Comment Likes
4 * Module Description: Enable visitors to like individual comments and boost engagement.
5 * Sort Order: 39
6 * Recommendation Order: 17
7 * First Introduced: 5.1
8 * Requires Connection: Yes
9 * Auto Activate: No
10 * Module Tags: Social
11 * Additional Search Queries: like widget, like button, like, likes
12 *
13 * @package automattic/jetpack
14 */
15
16 use Automattic\Jetpack\Assets;
17 use Automattic\Jetpack\Sharing_Likes\Post_Likes_Switch;
18
19 if ( ! defined( 'ABSPATH' ) ) {
20 exit( 0 );
21 }
22
23 Assets::add_resource_hint( '//widgets.wp.com', 'dns-prefetch' );
24
25 require_once __DIR__ . '/likes/jetpack-likes-master-iframe.php';
26 require_once __DIR__ . '/likes/jetpack-likes-settings.php';
27
28 /**
29 * Jetpack Comment Like Class
30 */
31 class Jetpack_Comment_Likes {
32
33 /**
34 * Jetpack_Likes_Settings object
35 *
36 * @var Jetpack_Likes_Settings
37 */
38 public $settings;
39
40 /**
41 * Blog ID
42 *
43 * @var int
44 */
45 public $blog_id;
46
47 /**
48 * Site home URL domain
49 *
50 * @var string
51 */
52 public $domain;
53
54 /**
55 * Initialize comment like module
56 */
57 public static function init() {
58 static $instance = null;
59
60 if ( ! $instance ) {
61 $instance = new Jetpack_Comment_Likes();
62 }
63
64 return $instance;
65 }
66
67 /**
68 * Construct comment like module.
69 */
70 private function __construct() {
71 $this->settings = new Jetpack_Likes_Settings();
72 $this->blog_id = Jetpack_Options::get_option( 'id' );
73 $url_parts = wp_parse_url( home_url() );
74
75 // Abort if domain can't be determined.
76 if ( ! $url_parts || ! isset( $url_parts['host'] ) ) {
77 return;
78 }
79 $this->domain = $url_parts['host'];
80
81 add_action( 'template_redirect', array( $this, 'frontend_init' ) );
82 add_action( 'admin_init', array( $this, 'admin_init' ) );
83
84 /*
85 * Comment likes are gated on the Likes settings, so when the Likes module is
86 * off this module still needs the per-post metabox that carries them.
87 */
88 if ( ! Jetpack::is_module_active( 'likes' ) ) {
89 if ( Jetpack::is_module_active( 'sharedaddy' ) ) {
90 add_filter( 'sharing_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
91 add_action( 'start_sharing_meta_box_content', array( $this->settings, 'meta_box_content' ) );
92 } else {
93 add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
94 }
95
96 add_action( 'save_post', array( $this->settings, 'meta_box_save' ) );
97 add_action( 'edit_attachment', array( $this->settings, 'meta_box_save' ) );
98 }
99 }
100
101 /**
102 * Initialize admin section
103 */
104 public function admin_init() {
105 add_filter( 'manage_edit-comments_columns', array( $this, 'add_like_count_column' ) );
106 add_action( 'manage_comments_custom_column', array( $this, 'comment_likes_edit_column' ), 10, 2 );
107 add_action( 'admin_print_styles-edit-comments.php', array( $this, 'enqueue_admin_styles_scripts' ) );
108 }
109
110 /**
111 * Displays number of comment likes in comment admin page.
112 *
113 * @param string $column_name name of the column.
114 * @param int $comment_id ID of the comment.
115 */
116 public function comment_likes_edit_column( $column_name, $comment_id ) {
117 if ( 'comment_likes' !== $column_name ) {
118 return;
119 }
120
121 $permalink = get_permalink( get_the_ID() );
122 ?>
123 <a
124 data-comment-id="<?php echo absint( $comment_id ); ?>"
125 data-blog-id="<?php echo absint( $this->blog_id ); ?>"
126 class="comment-like-count"
127 id="comment-like-count-<?php echo absint( $comment_id ); ?>"
128 href="<?php echo esc_url( $permalink ); ?>#comment-<?php echo absint( $comment_id ); ?>"
129 >
130 <span class="like-count">0</span>
131 </a>
132 <?php
133 }
134
135 /**
136 * Enqueue admin style scripts.
137 */
138 public function enqueue_admin_styles_scripts() {
139 wp_enqueue_style( 'comment-like-count', plugins_url( 'comment-likes/admin-style.css', __FILE__ ), array(), JETPACK__VERSION );
140 wp_enqueue_script(
141 'comment-like-count',
142 Assets::get_file_url_for_environment(
143 '_inc/build/comment-likes/comment-like-count.min.js',
144 'modules/comment-likes/comment-like-count.js'
145 ),
146 array( 'jquery' ),
147 JETPACK__VERSION,
148 false
149 );
150 }
151
152 /**
153 * Adds like count column to admin page.
154 *
155 * @param array $columns column of admin table.
156 */
157 public function add_like_count_column( $columns ) {
158 $columns['comment_likes'] = '<span class="vers"></span>';
159 return $columns;
160 }
161
162 /**
163 * Initialize front end
164 */
165 public function frontend_init() {
166 if ( class_exists( Jetpack_AMP_Support::class ) && Jetpack_AMP_Support::is_amp_request() ) {
167 return;
168 }
169
170 add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_register_scripts' ) );
171 add_filter( 'comment_text', array( $this, 'comment_likes' ), 10, 2 );
172 }
173
174 /**
175 * Load styling scripts
176 */
177 public function load_styles_register_scripts() {
178 if ( ! $this->settings->is_likes_visible() ) {
179 return;
180 }
181
182 if ( ! wp_style_is( 'open-sans', 'registered' ) ) {
183 wp_register_style( 'open-sans', 'https://fonts.googleapis.com/css?family=Open+Sans', array(), JETPACK__VERSION );
184 }
185 wp_enqueue_style( 'jetpack_likes', plugins_url( 'likes/style.css', __FILE__ ), array( 'open-sans' ), JETPACK__VERSION );
186 wp_enqueue_script( 'jetpack_likes_queuehandler', plugins_url( 'likes/queuehandler.js', __FILE__ ), array(), JETPACK__VERSION, true );
187 }
188
189 /**
190 * Display like count.
191 *
192 * @param string $content text content of the comment itself.
193 * @param object $comment comment object containing comment data.
194 */
195 public function comment_likes( $content, $comment = null ) {
196 if ( empty( $comment ) ) {
197 return $content;
198 }
199
200 if ( ! $this->settings->is_likes_visible() ) {
201 return $content;
202 }
203
204 $comment_id = get_comment_ID();
205 if ( empty( $comment_id ) && ! empty( $comment->comment_ID ) ) {
206 $comment_id = $comment->comment_ID;
207 }
208
209 if ( empty( $content ) || empty( $comment_id ) ) {
210 return $content;
211 }
212
213 if ( empty( $comment->comment_approved ) ) {
214 return $content;
215 }
216
217 // In case master iframe hasn't been loaded. This could be the case when Post Likes module is disabled,
218 // or on pages on which we have comments but post likes are disabled.
219 if ( false === has_action( 'wp_footer', 'jetpack_likes_master_iframe' ) ) {
220 add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
221 }
222
223 $uniqid = uniqid();
224
225 $src = sprintf( 'https://widgets.wp.com/likes/#blog_id=%1$d&amp;comment_id=%2$d&amp;origin=%3$s&amp;obj_id=%1$d-%2$d-%4$s', $this->blog_id, $comment_id, $this->domain, $uniqid );
226 $name = sprintf( 'like-comment-frame-%1$d-%2$d-%3$s', $this->blog_id, $comment_id, $uniqid );
227 $wrapper = sprintf( 'like-comment-wrapper-%1$d-%2$d-%3$s', $this->blog_id, $comment_id, $uniqid );
228
229 $html = '';
230 $html .= "<div class='jetpack-comment-likes-widget-wrapper jetpack-likes-widget-unloaded' id='$wrapper' data-src='$src' data-name='$name'>";
231 $html .= "<div class='likes-widget-placeholder comment-likes-widget-placeholder comment-likes'><span class='loading'>" . esc_html__( 'Loading...', 'jetpack' ) . '</span></div>';
232 $html .= "<div class='comment-likes-widget jetpack-likes-widget comment-likes'><span class='comment-like-feedback'></span>";
233 $html .= "<span class='sd-text-color'></span><a class='sd-link-color'></a>";
234 $html .= '</div></div>';
235
236 /**
237 * Filters the Comment Likes button content.
238 *
239 * @module comment-likes
240 *
241 * @since 5.1.0
242 *
243 * @param string $html Comment Likes button content.
244 */
245 $like_button = apply_filters( 'comment_like_button', $html );
246
247 return $content . $like_button;
248 }
249 }
250
251 // Comment likes follow the per-post Likes switch, so the block editor needs it without the Likes module.
252 Post_Likes_Switch::init();
253
254 Jetpack_Comment_Likes::init();
255