PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.0
Jetpack – WP Security, Backup, Speed, & Growth v16.0
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 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 All 501 releases
jetpack / modules / comment-likes.php
comment-likes.php
260 lines 8.0 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
18 if ( ! defined( 'ABSPATH' ) ) {
19 exit( 0 );
20 }
21
22 Assets::add_resource_hint( '//widgets.wp.com', 'dns-prefetch' );
23
24 require_once __DIR__ . '/likes/jetpack-likes-master-iframe.php';
25 require_once __DIR__ . '/likes/jetpack-likes-settings.php';
26
27 /**
28 * Jetpack Comment Like Class
29 */
30 class Jetpack_Comment_Likes {
31
32 /**
33 * Jetpack_Likes_Settings object
34 *
35 * @var Jetpack_Likes_Settings
36 */
37 public $settings;
38
39 /**
40 * Blog ID
41 *
42 * @var int
43 */
44 public $blog_id;
45
46 /**
47 * Site home URL domain
48 *
49 * @var string
50 */
51 public $domain;
52
53 /**
54 * Initialize comment like module
55 */
56 public static function init() {
57 static $instance = null;
58
59 if ( ! $instance ) {
60 $instance = new Jetpack_Comment_Likes();
61 }
62
63 return $instance;
64 }
65
66 /**
67 * Construct comment like module.
68 */
69 private function __construct() {
70 $this->settings = new Jetpack_Likes_Settings();
71 $this->blog_id = Jetpack_Options::get_option( 'id' );
72 $url_parts = wp_parse_url( home_url() );
73
74 // Abort if domain can't be determined.
75 if ( ! $url_parts || ! isset( $url_parts['host'] ) ) {
76 return;
77 }
78 $this->domain = $url_parts['host'];
79
80 add_action( 'template_redirect', array( $this, 'frontend_init' ) );
81 add_action( 'admin_init', array( $this, 'admin_init' ) );
82
83 if ( ! Jetpack::is_module_active( 'likes' ) ) {
84 $active = Jetpack::get_active_modules();
85
86 if ( in_array( 'publicize', $active, true ) && ! in_array( 'sharedaddy', $active, true ) ) {
87 // we have a sharing page but not the global options area.
88 add_action( 'pre_admin_screen_sharing', array( $this->settings, 'sharing_block' ), 20 );
89 add_action( 'pre_admin_screen_sharing', array( $this->settings, 'updated_message' ), -10 );
90 }
91
92 if ( ! in_array( 'sharedaddy', $active, true ) ) {
93 add_action( 'admin_init', array( $this->settings, 'process_update_requests_if_sharedaddy_not_loaded' ) );
94 add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_showbuttonon_init' ), 19 );
95 add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_showbuttonon_callback' ), 19 );
96 add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
97 } else {
98 add_filter( 'sharing_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
99 add_action( 'start_sharing_meta_box_content', array( $this->settings, 'meta_box_content' ) );
100 }
101
102 add_action( 'save_post', array( $this->settings, 'meta_box_save' ) );
103 add_action( 'edit_attachment', array( $this->settings, 'meta_box_save' ) );
104 add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_init' ), 20 );
105 add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_callback' ), 20 );
106 }
107 }
108
109 /**
110 * Initialize admin section
111 */
112 public function admin_init() {
113 add_filter( 'manage_edit-comments_columns', array( $this, 'add_like_count_column' ) );
114 add_action( 'manage_comments_custom_column', array( $this, 'comment_likes_edit_column' ), 10, 2 );
115 add_action( 'admin_print_styles-edit-comments.php', array( $this, 'enqueue_admin_styles_scripts' ) );
116 }
117
118 /**
119 * Displays number of comment likes in comment admin page.
120 *
121 * @param string $column_name name of the column.
122 * @param int $comment_id ID of the comment.
123 */
124 public function comment_likes_edit_column( $column_name, $comment_id ) {
125 if ( 'comment_likes' !== $column_name ) {
126 return;
127 }
128
129 $permalink = get_permalink( get_the_ID() );
130 ?>
131 <a
132 data-comment-id="<?php echo absint( $comment_id ); ?>"
133 data-blog-id="<?php echo absint( $this->blog_id ); ?>"
134 class="comment-like-count"
135 id="comment-like-count-<?php echo absint( $comment_id ); ?>"
136 href="<?php echo esc_url( $permalink ); ?>#comment-<?php echo absint( $comment_id ); ?>"
137 >
138 <span class="like-count">0</span>
139 </a>
140 <?php
141 }
142
143 /**
144 * Enqueue admin style scripts.
145 */
146 public function enqueue_admin_styles_scripts() {
147 wp_enqueue_style( 'comment-like-count', plugins_url( 'comment-likes/admin-style.css', __FILE__ ), array(), JETPACK__VERSION );
148 wp_enqueue_script(
149 'comment-like-count',
150 Assets::get_file_url_for_environment(
151 '_inc/build/comment-likes/comment-like-count.min.js',
152 'modules/comment-likes/comment-like-count.js'
153 ),
154 array( 'jquery' ),
155 JETPACK__VERSION,
156 false
157 );
158 }
159
160 /**
161 * Adds like count column to admin page.
162 *
163 * @param array $columns column of admin table.
164 */
165 public function add_like_count_column( $columns ) {
166 $columns['comment_likes'] = '<span class="vers"></span>';
167 return $columns;
168 }
169
170 /**
171 * Initialize front end
172 */
173 public function frontend_init() {
174 if ( class_exists( Jetpack_AMP_Support::class ) && Jetpack_AMP_Support::is_amp_request() ) {
175 return;
176 }
177
178 add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_register_scripts' ) );
179 add_filter( 'comment_text', array( $this, 'comment_likes' ), 10, 2 );
180 }
181
182 /**
183 * Load styling scripts
184 */
185 public function load_styles_register_scripts() {
186 if ( ! $this->settings->is_likes_visible() ) {
187 return;
188 }
189
190 if ( ! wp_style_is( 'open-sans', 'registered' ) ) {
191 wp_register_style( 'open-sans', 'https://fonts.googleapis.com/css?family=Open+Sans', array(), JETPACK__VERSION );
192 }
193 wp_enqueue_style( 'jetpack_likes', plugins_url( 'likes/style.css', __FILE__ ), array( 'open-sans' ), JETPACK__VERSION );
194 wp_enqueue_script( 'jetpack_likes_queuehandler', plugins_url( 'likes/queuehandler.js', __FILE__ ), array(), JETPACK__VERSION, true );
195 }
196
197 /**
198 * Display like count.
199 *
200 * @param string $content text content of the comment itself.
201 * @param object $comment comment object containing comment data.
202 */
203 public function comment_likes( $content, $comment = null ) {
204 if ( empty( $comment ) ) {
205 return $content;
206 }
207
208 if ( ! $this->settings->is_likes_visible() ) {
209 return $content;
210 }
211
212 $comment_id = get_comment_ID();
213 if ( empty( $comment_id ) && ! empty( $comment->comment_ID ) ) {
214 $comment_id = $comment->comment_ID;
215 }
216
217 if ( empty( $content ) || empty( $comment_id ) ) {
218 return $content;
219 }
220
221 if ( empty( $comment->comment_approved ) ) {
222 return $content;
223 }
224
225 // In case master iframe hasn't been loaded. This could be the case when Post Likes module is disabled,
226 // or on pages on which we have comments but post likes are disabled.
227 if ( false === has_action( 'wp_footer', 'jetpack_likes_master_iframe' ) ) {
228 add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
229 }
230
231 $uniqid = uniqid();
232
233 $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 );
234 $name = sprintf( 'like-comment-frame-%1$d-%2$d-%3$s', $this->blog_id, $comment_id, $uniqid );
235 $wrapper = sprintf( 'like-comment-wrapper-%1$d-%2$d-%3$s', $this->blog_id, $comment_id, $uniqid );
236
237 $html = '';
238 $html .= "<div class='jetpack-comment-likes-widget-wrapper jetpack-likes-widget-unloaded' id='$wrapper' data-src='$src' data-name='$name'>";
239 $html .= "<div class='likes-widget-placeholder comment-likes-widget-placeholder comment-likes'><span class='loading'>" . esc_html__( 'Loading...', 'jetpack' ) . '</span></div>';
240 $html .= "<div class='comment-likes-widget jetpack-likes-widget comment-likes'><span class='comment-like-feedback'></span>";
241 $html .= "<span class='sd-text-color'></span><a class='sd-link-color'></a>";
242 $html .= '</div></div>';
243
244 /**
245 * Filters the Comment Likes button content.
246 *
247 * @module comment-likes
248 *
249 * @since 5.1.0
250 *
251 * @param string $html Comment Likes button content.
252 */
253 $like_button = apply_filters( 'comment_like_button', $html );
254
255 return $content . $like_button;
256 }
257 }
258
259 Jetpack_Comment_Likes::init();
260