PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 7.3.4
Jetpack – WP Security, Backup, Speed, & Growth v7.3.4
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 All 500 releases
jetpack / sync / class.jetpack-sync-module-comments.php
class.jetpack-sync-module-comments.php
197 lines 6.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class Jetpack_Sync_Module_Comments extends Jetpack_Sync_Module {
4
5 public function name() {
6 return 'comments';
7 }
8
9 public function get_object_by_id( $object_type, $id ) {
10 $comment_id = intval( $id );
11 if ( $object_type === 'comment' && $comment = get_comment( $comment_id ) ) {
12 return $this->filter_comment( $comment );
13 }
14
15 return false;
16 }
17
18 public function init_listeners( $callable ) {
19 add_action( 'wp_insert_comment', $callable, 10, 2 );
20 add_action( 'deleted_comment', $callable );
21 add_action( 'trashed_comment', $callable );
22 add_action( 'spammed_comment', $callable );
23 add_action( 'trashed_post_comments', $callable, 10, 2 );
24 add_action( 'untrash_post_comments', $callable );
25 add_action( 'comment_approved_to_unapproved', $callable );
26 add_action( 'comment_unapproved_to_approved', $callable );
27 add_action( 'jetpack_modified_comment_contents', $callable, 10, 2 );
28 add_action( 'untrashed_comment', $callable, 10, 2 );
29 add_action( 'unspammed_comment', $callable, 10, 2 );
30 add_filter( 'wp_update_comment_data', array( $this, 'handle_comment_contents_modification' ), 10, 3 );
31
32 // even though it's messy, we implement these hooks because
33 // the edit_comment hook doesn't include the data
34 // so this saves us a DB read for every comment event
35 foreach ( array( '', 'trackback', 'pingback' ) as $comment_type ) {
36 foreach ( array( 'unapproved', 'approved' ) as $comment_status ) {
37 $comment_action_name = "comment_{$comment_status}_{$comment_type}";
38 add_action( $comment_action_name, $callable, 10, 2 );
39 }
40 }
41
42 // listen for meta changes
43 $this->init_listeners_for_meta_type( 'comment', $callable );
44 $this->init_meta_whitelist_handler( 'comment', array( $this, 'filter_meta' ) );
45 }
46
47 public function handle_comment_contents_modification( $new_comment, $old_comment, $new_comment_with_slashes ) {
48 $content_fields = array(
49 'comment_author',
50 'comment_author_email',
51 'comment_author_url',
52 'comment_content',
53 );
54 $changes = array();
55 foreach ( $content_fields as $field ) {
56 if ( $new_comment_with_slashes[ $field ] != $old_comment[ $field ] ) {
57 $changes[ $field ] = array( $new_comment[ $field ], $old_comment[ $field ] );
58 }
59 }
60
61 if ( ! empty( $changes ) ) {
62 /**
63 * Signals to the sync listener that this comment's contents were modified and a sync action
64 * reflecting the change(s) to the content should be sent
65 *
66 * @since 4.9.0
67 *
68 * @param int $new_comment['comment_ID'] ID of comment whose content was modified
69 * @param mixed $changes Array of changed comment fields with before and after values
70 */
71 do_action( 'jetpack_modified_comment_contents', $new_comment['comment_ID'], $changes );
72 }
73 return $new_comment;
74 }
75
76 public function init_full_sync_listeners( $callable ) {
77 add_action( 'jetpack_full_sync_comments', $callable ); // also send comments meta
78 }
79
80 public function init_before_send() {
81 add_filter( 'jetpack_sync_before_send_wp_insert_comment', array( $this, 'expand_wp_insert_comment' ) );
82
83 foreach ( array( '', 'trackback', 'pingback' ) as $comment_type ) {
84 foreach ( array( 'unapproved', 'approved' ) as $comment_status ) {
85 $comment_action_name = "comment_{$comment_status}_{$comment_type}";
86 add_filter(
87 'jetpack_sync_before_send_' . $comment_action_name,
88 array(
89 $this,
90 'expand_wp_insert_comment',
91 )
92 );
93 }
94 }
95
96 // full sync
97 add_filter( 'jetpack_sync_before_send_jetpack_full_sync_comments', array( $this, 'expand_comment_ids' ) );
98 }
99
100 public function enqueue_full_sync_actions( $config, $max_items_to_enqueue, $state ) {
101 global $wpdb;
102 return $this->enqueue_all_ids_as_action( 'jetpack_full_sync_comments', $wpdb->comments, 'comment_ID', $this->get_where_sql( $config ), $max_items_to_enqueue, $state );
103 }
104
105 public function estimate_full_sync_actions( $config ) {
106 global $wpdb;
107
108 $query = "SELECT count(*) FROM $wpdb->comments";
109
110 if ( $where_sql = $this->get_where_sql( $config ) ) {
111 $query .= ' WHERE ' . $where_sql;
112 }
113
114 $count = $wpdb->get_var( $query );
115
116 return (int) ceil( $count / self::ARRAY_CHUNK_SIZE );
117 }
118
119 private function get_where_sql( $config ) {
120 if ( is_array( $config ) ) {
121 return 'comment_ID IN (' . implode( ',', array_map( 'intval', $config ) ) . ')';
122 }
123
124 return null;
125 }
126
127 public function get_full_sync_actions() {
128 return array( 'jetpack_full_sync_comments' );
129 }
130
131 public function count_full_sync_actions( $action_names ) {
132 return $this->count_actions( $action_names, array( 'jetpack_full_sync_comments' ) );
133 }
134
135 function expand_wp_comment_status_change( $args ) {
136 return array( $args[0], $this->filter_comment( $args[1] ) );
137 }
138
139 function expand_wp_insert_comment( $args ) {
140 return array( $args[0], $this->filter_comment( $args[1] ) );
141 }
142
143 function filter_comment( $comment ) {
144 /**
145 * Filters whether to prevent sending comment data to .com
146 *
147 * Passing true to the filter will prevent the comment data from being sent
148 * to the WordPress.com.
149 * Instead we pass data that will still enable us to do a checksum against the
150 * Jetpacks data but will prevent us from displaying the data on in the API as well as
151 * other services.
152 *
153 * @since 4.2.0
154 *
155 * @param boolean false prevent post data from bing synced to WordPress.com
156 * @param mixed $comment WP_COMMENT object
157 */
158 if ( apply_filters( 'jetpack_sync_prevent_sending_comment_data', false, $comment ) ) {
159 $blocked_comment = new stdClass();
160 $blocked_comment->comment_ID = $comment->comment_ID;
161 $blocked_comment->comment_date = $comment->comment_date;
162 $blocked_comment->comment_date_gmt = $comment->comment_date_gmt;
163 $blocked_comment->comment_approved = 'jetpack_sync_blocked';
164 return $blocked_comment;
165 }
166
167 return $comment;
168 }
169
170 // Comment Meta
171 function is_whitelisted_comment_meta( $meta_key ) {
172 return in_array( $meta_key, Jetpack_Sync_Settings::get_setting( 'comment_meta_whitelist' ) );
173 }
174
175 function filter_meta( $args ) {
176 return ( $this->is_whitelisted_comment_meta( $args[2] ) ? $args : false );
177 }
178
179 public function expand_comment_ids( $args ) {
180 list( $comment_ids, $previous_interval_end ) = $args;
181 $comments = get_comments(
182 array(
183 'include_unapproved' => true,
184 'comment__in' => $comment_ids,
185 'orderby' => 'comment_ID',
186 'order' => 'DESC',
187 )
188 );
189
190 return array(
191 $comments,
192 $this->get_metadata( $comment_ids, 'comment', Jetpack_Sync_Settings::get_setting( 'comment_meta_whitelist' ) ),
193 $previous_interval_end,
194 );
195 }
196 }
197