Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
30.21% covered (danger)
30.21%
29 / 96
0.00% covered (danger)
0.00%
0 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
Jetpack_Comment_Likes
32.22% covered (danger)
32.22%
29 / 90
0.00% covered (danger)
0.00%
0 / 9
310.22
0.00% covered (danger)
0.00%
0 / 1
 init
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 __construct
77.78% covered (warning)
77.78%
21 / 27
0.00% covered (danger)
0.00%
0 / 1
8.70
 admin_init
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 comment_likes_edit_column
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
6
 enqueue_admin_styles_scripts
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 add_like_count_column
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 frontend_init
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 load_styles_register_scripts
83.33% covered (warning)
83.33%
5 / 6
0.00% covered (danger)
0.00%
0 / 1
3.04
 comment_likes
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
90
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
16use Automattic\Jetpack\Assets;
17
18if ( ! defined( 'ABSPATH' ) ) {
19    exit( 0 );
20}
21
22Assets::add_resource_hint( '//widgets.wp.com', 'dns-prefetch' );
23
24require_once __DIR__ . '/likes/jetpack-likes-master-iframe.php';
25require_once __DIR__ . '/likes/jetpack-likes-settings.php';
26
27/**
28 * Jetpack Comment Like Class
29 */
30class 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            $sharedaddy_active = in_array( 'sharedaddy', $active, true );
86
87            if ( $this->settings->needs_own_sharing_menu( $sharedaddy_active ) ) {
88                /*
89                 * Sharedaddy is what registers Settings > Sharing, and it is off, so we
90                 * register that screen ourselves; the Likes settings that gate comment
91                 * likes are displayed on it.
92                 */
93                add_action( 'admin_menu', array( $this->settings, 'sharing_menu' ) );
94            } elseif ( in_array( 'publicize', $active, true ) && ! $sharedaddy_active ) {
95                // we have a sharing page but not the global options area.
96                add_action( 'pre_admin_screen_sharing', array( $this->settings, 'sharing_block' ), 20 );
97                add_action( 'pre_admin_screen_sharing', array( $this->settings, 'updated_message' ), -10 );
98            }
99
100            if ( ! $sharedaddy_active ) {
101                add_action( 'admin_init', array( $this->settings, 'process_update_requests_if_sharedaddy_not_loaded' ) );
102                add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_showbuttonon_init' ), 19 );
103                add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_showbuttonon_callback' ), 19 );
104                add_action( 'admin_init', array( $this->settings, 'add_meta_box' ) );
105            } else {
106                add_filter( 'sharing_meta_box_title', array( $this->settings, 'add_likes_to_sharing_meta_box_title' ) );
107                add_action( 'start_sharing_meta_box_content', array( $this->settings, 'meta_box_content' ) );
108            }
109
110            add_action( 'save_post', array( $this->settings, 'meta_box_save' ) );
111            add_action( 'edit_attachment', array( $this->settings, 'meta_box_save' ) );
112            add_action( 'sharing_global_options', array( $this->settings, 'admin_settings_init' ), 20 );
113            add_action( 'sharing_admin_update', array( $this->settings, 'admin_settings_callback' ), 20 );
114        }
115    }
116
117    /**
118     * Initialize admin section
119     */
120    public function admin_init() {
121        add_filter( 'manage_edit-comments_columns', array( $this, 'add_like_count_column' ) );
122        add_action( 'manage_comments_custom_column', array( $this, 'comment_likes_edit_column' ), 10, 2 );
123        add_action( 'admin_print_styles-edit-comments.php', array( $this, 'enqueue_admin_styles_scripts' ) );
124    }
125
126    /**
127     * Displays number of comment likes in comment admin page.
128     *
129     * @param string $column_name name of the column.
130     * @param int    $comment_id ID of the comment.
131     */
132    public function comment_likes_edit_column( $column_name, $comment_id ) {
133        if ( 'comment_likes' !== $column_name ) {
134            return;
135        }
136
137        $permalink = get_permalink( get_the_ID() );
138        ?>
139        <a
140        data-comment-id="<?php echo absint( $comment_id ); ?>"
141        data-blog-id="<?php echo absint( $this->blog_id ); ?>"
142        class="comment-like-count"
143        id="comment-like-count-<?php echo absint( $comment_id ); ?>"
144        href="<?php echo esc_url( $permalink ); ?>#comment-<?php echo absint( $comment_id ); ?>"
145        >
146            <span class="like-count">0</span>
147        </a>
148        <?php
149    }
150
151    /**
152     * Enqueue admin style scripts.
153     */
154    public function enqueue_admin_styles_scripts() {
155        wp_enqueue_style( 'comment-like-count', plugins_url( 'comment-likes/admin-style.css', __FILE__ ), array(), JETPACK__VERSION );
156        wp_enqueue_script(
157            'comment-like-count',
158            Assets::get_file_url_for_environment(
159                '_inc/build/comment-likes/comment-like-count.min.js',
160                'modules/comment-likes/comment-like-count.js'
161            ),
162            array( 'jquery' ),
163            JETPACK__VERSION,
164            false
165        );
166    }
167
168    /**
169     * Adds like count column to admin page.
170     *
171     * @param array $columns column of admin table.
172     */
173    public function add_like_count_column( $columns ) {
174        $columns['comment_likes'] = '<span class="vers"></span>';
175        return $columns;
176    }
177
178    /**
179     * Initialize front end
180     */
181    public function frontend_init() {
182        if ( class_exists( Jetpack_AMP_Support::class ) && Jetpack_AMP_Support::is_amp_request() ) {
183            return;
184        }
185
186        add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_register_scripts' ) );
187        add_filter( 'comment_text', array( $this, 'comment_likes' ), 10, 2 );
188    }
189
190    /**
191     * Load styling scripts
192     */
193    public function load_styles_register_scripts() {
194        if ( ! $this->settings->is_likes_visible() ) {
195            return;
196        }
197
198        if ( ! wp_style_is( 'open-sans', 'registered' ) ) {
199            wp_register_style( 'open-sans', 'https://fonts.googleapis.com/css?family=Open+Sans', array(), JETPACK__VERSION );
200        }
201        wp_enqueue_style( 'jetpack_likes', plugins_url( 'likes/style.css', __FILE__ ), array( 'open-sans' ), JETPACK__VERSION );
202        wp_enqueue_script( 'jetpack_likes_queuehandler', plugins_url( 'likes/queuehandler.js', __FILE__ ), array(), JETPACK__VERSION, true );
203    }
204
205    /**
206     * Display like count.
207     *
208     * @param string $content text content of the comment itself.
209     * @param object $comment comment object containing comment data.
210     */
211    public function comment_likes( $content, $comment = null ) {
212        if ( empty( $comment ) ) {
213            return $content;
214        }
215
216        if ( ! $this->settings->is_likes_visible() ) {
217            return $content;
218        }
219
220        $comment_id = get_comment_ID();
221        if ( empty( $comment_id ) && ! empty( $comment->comment_ID ) ) {
222            $comment_id = $comment->comment_ID;
223        }
224
225        if ( empty( $content ) || empty( $comment_id ) ) {
226            return $content;
227        }
228
229        if ( empty( $comment->comment_approved ) ) {
230            return $content;
231        }
232
233        // In case master iframe hasn't been loaded. This could be the case when Post Likes module is disabled,
234        // or on pages on which we have comments but post likes are disabled.
235        if ( false === has_action( 'wp_footer', 'jetpack_likes_master_iframe' ) ) {
236            add_action( 'wp_footer', 'jetpack_likes_master_iframe', 21 );
237        }
238
239        $uniqid = uniqid();
240
241        $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 );
242        $name    = sprintf( 'like-comment-frame-%1$d-%2$d-%3$s', $this->blog_id, $comment_id, $uniqid );
243        $wrapper = sprintf( 'like-comment-wrapper-%1$d-%2$d-%3$s', $this->blog_id, $comment_id, $uniqid );
244
245        $html  = '';
246        $html .= "<div class='jetpack-comment-likes-widget-wrapper jetpack-likes-widget-unloaded' id='$wrapper' data-src='$src' data-name='$name'>";
247        $html .= "<div class='likes-widget-placeholder comment-likes-widget-placeholder comment-likes'><span class='loading'>" . esc_html__( 'Loading...', 'jetpack' ) . '</span></div>';
248        $html .= "<div class='comment-likes-widget jetpack-likes-widget comment-likes'><span class='comment-like-feedback'></span>";
249        $html .= "<span class='sd-text-color'></span><a class='sd-link-color'></a>";
250        $html .= '</div></div>';
251
252        /**
253         * Filters the Comment Likes button content.
254         *
255         * @module comment-likes
256         *
257         * @since 5.1.0
258         *
259         * @param string $html Comment Likes button content.
260         */
261        $like_button = apply_filters( 'comment_like_button', $html );
262
263        return $content . $like_button;
264    }
265}
266
267Jetpack_Comment_Likes::init();