PluginProbe
wpForo Forum / 3.1.2
wpForo Forum v3.1.2
3.1.5 3.1.4 3.1.2 3.1.1 3.1.0 3.0.9 3.0.8 3.0.7 trunk 1.0.0 1.0.1 1.0.2 1.1.0 1.1.1 1.1.2 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.10 1.4.11 1.4.12 1.4.13 1.4.2 All 137 releases
wpforo / modules / subscriptions / classes / Actions.php

Actions.php in wpForo Forum 3.1.2, at modules/subscriptions/classes/Actions.php

434 lines 19.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace wpforo\modules\subscriptions\classes;
4
5 class Actions {
6 private $is_approval_context = false;
7
8 public function __construct() {
9 $this->init_hooks();
10 }
11
12 public function init_hooks( ) {
13 add_action( 'wpforo_action_subscriptions_settings_save', [ $this, 'settings_save' ] );
14
15 add_action( 'wpforo_core_inited', [ $this, 'confirmation' ] );
16 add_action( 'wpforo_action_unsbscrb', [ $this, 'delete' ] );
17 add_action( 'wpforo_action_subscribe_manager', [ $this, 'manager' ] );
18
19 add_action( 'wpforo_after_add_topic', [ $this, 'topic_auto_subscribe' ] );
20 add_action( 'wpforo_after_add_post', [ $this, 'topic_auto_subscribe' ] );
21 add_action( 'wpforo_post_approve', [ $this, 'after_post_approve' ] );
22 add_action( 'wpforo_after_delete_topic', [ $this, 'after_delete_topic' ] );
23 add_action( 'wpforo_after_delete_user', [ $this, 'after_delete_user' ] );
24
25 add_action( 'wpforo_after_add_topic', [ $this, 'after_add_topic' ], 10, 2 );
26 add_action( 'wpforo_after_add_post', [ $this, 'after_add_post' ], 10, 2 );
27
28 ### AJAX ACTIONS ###
29 add_action( 'wp_ajax_wpforo_subscribe_ajax', [ $this, 'subscribe' ] );
30 add_action( 'wp_ajax_nopriv_wpforo_subscribe_ajax', [ $this, 'subscribe' ] );
31 add_action( 'wp_ajax_wpforo_unsubscribe', [ $this, 'unsubscribe' ] );
32 }
33
34 /**
35 * subscriptions_settings_save after submit action
36 *
37 * @return void
38 */
39 public function settings_save() {
40 check_admin_referer( 'wpforo_settings_save_subscriptions' );
41
42 if( wpfkey( $_POST, 'reset' ) ) {
43 wpforo_delete_option( 'subscriptions' );
44 } else {
45 $subscriptions = wpforo_array_args_cast_and_merge( wp_unslash( $_POST['subscriptions'] ), WPF()->settings->_subscriptions );
46 $subscriptions['confirmation_email_subject'] = sanitize_text_field( $subscriptions['confirmation_email_subject'] );
47 $subscriptions['confirmation_email_message'] = wpforo_kses( $subscriptions['confirmation_email_message'], 'email' );
48 $subscriptions['new_topic_notification_email_subject'] = sanitize_text_field( $subscriptions['new_topic_notification_email_subject'] );
49 $subscriptions['new_topic_notification_email_message'] = wpforo_kses( $subscriptions['new_topic_notification_email_message'], 'email' );
50 $subscriptions['new_post_notification_email_subject'] = sanitize_text_field( $subscriptions['new_post_notification_email_subject'] );
51 $subscriptions['new_post_notification_email_message'] = wpforo_kses( $subscriptions['new_post_notification_email_message'], 'email' );
52 $subscriptions['user_mention_email_subject'] = sanitize_text_field( $subscriptions['user_mention_email_subject'] );
53 $subscriptions['user_mention_email_message'] = wpforo_kses( $subscriptions['user_mention_email_message'], 'email' );
54 $subscriptions['user_following_email_subject'] = sanitize_text_field( $subscriptions['user_following_email_subject'] );
55 $subscriptions['user_following_email_message'] = wpforo_kses( $subscriptions['user_following_email_message'], 'email' );
56 foreach( WPF()->action->generate_option_names( 'subscriptions' ) as $option_name ) {
57 wpforo_update_option( $option_name, $subscriptions );
58 }
59 }
60
61 WPF()->notice->add( 'Successfully Done', 'success' );
62 wp_safe_redirect( wp_get_raw_referer() );
63 exit();
64 }
65
66 /**
67 * subscription_confirmation form submit action
68 */
69 public function confirmation(): void {
70 if( wpfval( WPF()->GET, 'wpfaction' ) === 'sbscrbconfirm' && ($sbs_key = wpfval( WPF()->GET, 'key' )) ) {
71 $sbs_key = sanitize_text_field( $sbs_key );
72 WPF()->sbscrb->edit( $sbs_key );
73 wp_safe_redirect( wpforo_setting( 'authorization', 'redirect_url_after_confirm_sbscrb' ) ?: wpforo_home_url( preg_replace( '#\?.*$#is', '', (string) WPF()->current_url ) ) );
74 exit();
75 }
76 }
77
78 /**
79 * subscription_delete form submit action
80 */
81 public function delete() {
82 if( $sbs_key = wpfval( WPF()->GET, 'key' ) ) {
83 $sbs_key = sanitize_text_field( $sbs_key );
84 WPF()->sbscrb->delete( $sbs_key );
85 wp_safe_redirect( wpforo_setting( 'authorization', 'redirect_url_after_confirm_sbscrb' ) ?: wpforo_home_url( preg_replace( '#\?.*$#is', '', (string) WPF()->current_url ) ) );
86 exit();
87 }
88 }
89
90 /**
91 * subscribe_manager form submit action
92 */
93 public function manager() {
94 $userid = (int) wpfval( $_POST, 'wpforo', 'userid' );
95 wpforo_verify_form( 'wpforo_verify_form_' . $userid );
96
97 WPF()->change_board( (int) wpfval( $_POST, 'wpforo', 'boardid' ) );
98
99 $data = ( ! empty( $_POST['wpforo']['forums'] ) ? array_map( 'sanitize_title', $_POST['wpforo']['forums'] ) : [] );
100 $all = ( ! empty( $_POST['wpforo']['check_all'] ) ? sanitize_title( $_POST['wpforo']['check_all'] ) : '' );
101
102 WPF()->sbscrb->reset( $data, $all, $userid );
103 wp_safe_redirect( wpforo_get_request_uri() );
104 exit();
105 }
106
107 function topic_auto_subscribe( $item ) {
108 if( ! isset( $_POST['wpforo_topic_subs'] ) || ! $_POST['wpforo_topic_subs'] ) return false;
109
110 if( isset( $item['forumid'] ) && $item['forumid'] ) {
111 if( isset( $item['private'] ) && $item['private'] && ! wpforo_is_owner( $item['userid'] ) ) {
112 if( ! WPF()->perm->forum_can( 'vp', $item['forumid'] ) ) {
113 WPF()->notice->add( 'You are not permitted to subscribe here', 'error' );
114 return false;
115 }
116 }
117 } else {
118 WPF()->notice->add( 'Forum ID is not detected', 'error' );
119 return false;
120 }
121
122 $args = [
123 'itemid' => wpforo_bigintval( $item['topicid'] ),
124 'type' => 'topic',
125 'userid' => WPF()->current_userid,
126 'user_name' => '',
127 'user_email' => '',
128 ];
129
130 if( ! WPF()->current_userid ) {
131 if( WPF()->current_user_email ) $args['user_email'] = WPF()->current_user_email;
132 if( WPF()->current_user_display_name ) $args['user_name'] = WPF()->current_user_display_name;
133 }
134 if( ! $args['userid'] && ! $args['user_email'] ) return false;
135
136 $args['confirmkey'] = WPF()->sbscrb->get_confirm_key();
137
138 if( wpforo_setting( 'subscriptions', 'subscribe_confirmation' ) ) {
139 ############### Sending Email ##################
140 $confirmlink = WPF()->sbscrb->get_confirm_link( $args );
141 $member_name = ( WPF()->current_userid ? wpforo_user_dname( WPF()->current_user ) : ( $args['user_name'] ?: $args['user_email'] ) );
142 $subject = wpforo_setting( 'subscriptions', 'confirmation_email_subject' );
143 $message = wpforo_setting( 'subscriptions', 'confirmation_email_message' );
144 $topic = WPF()->topic->get_topic( $item['topicid'], false );
145 $from_tags = [ "[user_display_name]", "[entry_title]", "[confirm_link]" ];
146 $to_words = [
147 sanitize_text_field( $member_name ),
148 '<strong>' . sanitize_text_field( $topic['title'] ) . '</strong>',
149 '<br><br><a target="_blank" href="' . esc_url( (string) $confirmlink ) . '"> ' . wpforo_phrase( 'Confirm my subscription', false ) . ' </a>',
150 ];
151 $subject = stripslashes( str_replace( $from_tags, $to_words, (string) $subject ) );
152 $message = stripslashes( str_replace( $from_tags, $to_words, (string) $message ) );
153 $message = wpforo_kses( $message, 'email' );
154
155 add_filter( 'wp_mail_content_type', 'wpforo_set_html_content_type', 999 );
156 $headers = wpforo_mail_headers();
157
158 if( wp_mail( WPF()->current_user_email, sanitize_text_field( $subject ), $message, $headers ) ) {
159 if( $response = WPF()->sbscrb->add( $args ) ) return $response;
160 } else {
161 WPF()->notice->add( 'Can\'t send confirmation email', 'error' );
162 return false;
163 }
164 remove_filter( 'wp_mail_content_type', 'wpforo_set_html_content_type' );
165 ############### Sending Email end ##############
166 } else {
167 $args['active'] = 1;
168 if( $response = WPF()->sbscrb->add( $args ) ) return $response;
169 }
170
171 return false;
172 }
173
174 public function after_post_approve( $post ) {
175 $this->is_approval_context = true;
176 if( (int) wpfval($post, 'is_first_post') ){
177 if( ($topicid = wpforo_bigintval(wpfval($post, 'topicid')))
178 && ($topic = WPF()->topic->get_topic( $topicid ))
179 && ($forumid = (int) wpfval($post, 'forumid'))
180 && ($forum = WPF()->forum->get_forum( $forumid ))
181 ) {
182 $topic['body'] = $post['body'];
183 WPF()->sbscrb->Mentioning->Actions->send_mail_to_mentioned_users( $topic, $forum );
184 $this->after_add_topic( $topic, $forum );
185 }
186 }else{
187 if( ($topicid = wpforo_bigintval(wpfval($post, 'topicid')))
188 && ($topic = WPF()->topic->get_topic( $topicid ))
189 ) {
190 WPF()->sbscrb->Mentioning->Actions->send_mail_to_mentioned_users( $post, $topic );
191 $this->after_add_post( $post, $topic );
192 }
193 }
194 $this->is_approval_context = false;
195 }
196
197 public function after_delete_topic( $topic ) {
198 if( wpfval( $topic, 'topicid' ) ) WPF()->sbscrb->delete( [ 'type' => 'topic', 'itemid' => $topic['topicid'] ] );
199 }
200
201 public function after_delete_user( $userid ) {
202 WPF()->sbscrb->delete_for_all_active_boards( [ 'userid' => $userid ] );
203 }
204
205 public function after_add_topic( $topic, $forum ) {
206 if( ! wpfval( $topic, 'url' ) ) $topic['url'] = wpforo_topic( $topic['topicid'], 'url' );
207 if( ! wpfkey( $topic, 'body' ) ) $topic['body'] = wpforo_post( $topic['first_postid'], 'body' );
208
209 $topic = apply_filters( 'wpforo_sbscrb_after_add_topic__topic_filter', $topic );
210 $forum = apply_filters( 'wpforo_sbscrb_after_add_topic__forum_filter', $forum );
211
212 $owner = wpforo_member( $topic );
213
214 $forums_sbs = WPF()->sbscrb->get_subscribes( [ 'itemid' => 0, 'type' => [ 'forums', 'forums-topics' ] ] );
215 $forum_sbs = WPF()->sbscrb->get_subscribes( [ 'itemid' => $topic['forumid'], 'type' => [ 'forum' , 'forum-topic' ] ] );
216 $subscribers = array_merge( $forums_sbs, $forum_sbs );
217 if( wpforo_setting( 'email', 'new_topic_notify' ) ) {
218 foreach( wpforo_setting( 'email', 'admin_emails' ) as $admin_email ) $subscribers[] = $admin_email;
219 }
220 $subscribers = apply_filters( 'wpforo_forum_subscribers', $subscribers, $topic, $forum );
221
222 foreach( $subscribers as $subscriber ) {
223 if( is_array( $subscriber ) ) {
224 if( $subscriber['userid'] ) {
225 $user = WPF()->member->get_member( $subscriber['userid'] );
226 } elseif( $subscriber['user_email'] ) {
227 $user = [ 'groupid' => 4, 'groupids' => [4], 'display_name' => ( $subscriber['user_name'] ?: $subscriber['user_email'] ), 'user_email' => $subscriber['user_email'] ];
228 } else {
229 continue;
230 }
231
232 if( ! WPF()->topic->view_access( $topic, $user ) ) continue;
233
234 if( $this->is_approval_context && WPF()->perm->forum_can( 'au', $topic['forumid'], wpfval( $user, 'groupids' ) ?: [] ) ) continue;
235
236 $unsubscribe_link = WPF()->sbscrb->get_unsubscribe_link( $subscriber['confirmkey'] );
237 } else {
238 if( $this->is_approval_context ) continue;
239 $user = [ 'display_name' => $subscriber, 'user_email' => $subscriber ];
240 $unsubscribe_link = '';
241 }
242
243 if( ! wpfval( $user, 'user_email' ) ) continue;
244
245 if( wpfval($user, 'user_email') ){
246 $key = 'topicid_' . $topic['topicid'] . '_user_email_' . $user['user_email'];
247 if( ! WPF()->ram_cache->exists( $key ) ){
248
249 if( apply_filters( 'break_wpforo_subscriber_send_email_after_add_topic', false, $user, $owner, $topic, $forum ) ) continue;
250
251 if( in_array( wpfval($user, 'status'), ['banned', 'inactive'], true ) ) continue;
252 if( wpforo_is_users_same( $owner, $user ) ) continue;
253 if( wpforo_is_users_same( $user ) ) continue;
254
255 $sbj_msg = WPF()->sbscrb->get_sbj_msg( 'new_topic', $forum, $topic, $owner, $user, $unsubscribe_link );
256 wpforo_send_email( $user['user_email'], $sbj_msg['sbj'], $sbj_msg['msg'], '', 'subscription', (int) $topic['topicid'] );
257
258 WPF()->ram_cache->set( $key, true );
259 }
260 }
261 }
262 }
263
264 public function after_add_post( $post, $topic ) {
265 $post = apply_filters( 'wpforo_sbscrb_after_add_post__post_filter', $post );
266 $topic = apply_filters( 'wpforo_sbscrb_after_add_post__topic_filter', $topic );
267
268 $owner = wpforo_member( $post );
269 $forums_sbs = WPF()->sbscrb->get_subscribes( [ 'itemid' => 0, 'type' => 'forums-topics' ] );
270 $forum_sbs = WPF()->sbscrb->get_subscribes( [ 'itemid' => $post['forumid'], 'type' => 'forum-topic' ] );
271 $topic_sbs = WPF()->sbscrb->get_subscribes( [ 'itemid' => $post['topicid'], 'type' => 'topic' ] );
272 $subscribers = array_merge( $forums_sbs, $forum_sbs, $topic_sbs );
273 if( wpforo_setting( 'email', 'new_reply_notify' ) ) {
274 foreach( wpforo_setting( 'email', 'admin_emails' ) as $admin_email ) $subscribers[] = $admin_email;
275 }
276 $subscribers = apply_filters( 'wpforo_topic_subscribers', $subscribers, $post, $topic );
277
278 foreach( $subscribers as $subscriber ) {
279 if( is_array( $subscriber ) ) {
280 if( $subscriber['userid'] ) {
281 $user = WPF()->member->get_member( $subscriber['userid'] );
282 } elseif( $subscriber['user_email'] ) {
283 $user = [ 'groupid' => 4, 'groupids' => [4], 'display_name' => ( $subscriber['user_name'] ?: $subscriber['user_email'] ), 'user_email' => $subscriber['user_email'] ];
284 } else {
285 continue;
286 }
287
288 if( ! WPF()->post->view_access( $post, $user ) ) continue;
289
290 if( $this->is_approval_context && WPF()->perm->forum_can( 'au', $post['forumid'], wpfval( $user, 'groupids' ) ?: [] ) ) continue;
291
292 $unsubscribe_link = WPF()->sbscrb->get_unsubscribe_link( $subscriber['confirmkey'] );
293 } else {
294 if( $this->is_approval_context ) continue;
295 $user = [ 'display_name' => $subscriber, 'user_email' => $subscriber ];
296 $unsubscribe_link = '';
297 }
298
299 if( ! wpfval( $user, 'user_email' ) ) continue;
300
301 $key = 'postid_' . $post['postid'] . '_user_email_' . $user['user_email'];
302 if( ! WPF()->ram_cache->exists( $key ) ){
303
304 if( apply_filters( 'break_wpforo_subscriber_send_email_after_add_post', false, $user, $owner, $post, $topic ) ) continue;
305
306 if( in_array( wpfval($user, 'status'), ['banned', 'inactive'], true ) ) continue;
307 if( wpforo_is_users_same( $owner, $user ) ) continue;
308 if( wpforo_is_users_same( $user ) ) continue;
309
310 $sbj_msg = WPF()->sbscrb->get_sbj_msg( 'new_post', $topic, $post, $owner, $user, $unsubscribe_link );
311 wpforo_send_email( $user['user_email'], $sbj_msg['sbj'], $sbj_msg['msg'], '', 'subscription', (int) $post['postid'] );
312
313 WPF()->ram_cache->set( $key, true );
314 }
315 }
316 }
317
318 ############### -- AJAX ACTIONS -- ###############
319
320 public function subscribe() {
321 wpforo_verify_nonce( 'wpforo_subscribe_ajax' );
322 $return = 0;
323 $resp = [ 'notice' => WPF()->notice->get_notices() ];
324 $args = [
325 'itemid' => wpforo_bigintval( wpfval( $_POST, 'itemid' ) ),
326 'type' => sanitize_text_field( wpfval( $_POST, 'type' ) ),
327 'userid' => WPF()->current_userid,
328 'active' => null,
329 'user_name' => '',
330 'user_email' => '',
331 ];
332
333 if( ! WPF()->current_userid ) {
334 if( WPF()->current_user_email ) $args['user_email'] = WPF()->current_user_email;
335 if( WPF()->current_user_display_name ) $args['user_name'] = WPF()->current_user_display_name;
336 }
337 if( ! $args['userid'] && ! $args['user_email'] ) wp_send_json_error( $resp );
338
339 if( wpfval( $_POST, 'status' ) === 'subscribe' ) {
340 $item_title = '';
341 if( $args['type'] === 'forum' ) {
342 $forum = WPF()->forum->get_forum( $args['itemid'] );
343 $item_title = wpfval( $forum, 'title' );
344 if( wpfval( $forum, 'forumid' ) && ! WPF()->perm->forum_can( 'vf', $forum['forumid'] ) ) {
345 WPF()->notice->add( 'You are not permitted to subscribe here', 'error' );
346 $resp['notice'] = WPF()->notice->get_notices();
347 wp_send_json_error( $resp );
348 }
349 } elseif( $args['type'] === 'topic' ) {
350 $topic = WPF()->topic->get_topic( $args['itemid'], false );
351 $item_title = wpfval( $topic, 'title' );
352 if( wpfval( $topic, 'forumid' ) ) {
353 if( wpfval( $topic, 'private' ) && ! wpforo_is_owner( $topic['userid'], $topic['email'] ) && ! WPF()->perm->forum_can( 'vp', $topic['forumid'] ) ) {
354 WPF()->notice->add( 'You are not permitted to subscribe here', 'error' );
355 $resp['notice'] = WPF()->notice->get_notices();
356 wp_send_json_error( $resp );
357 }
358 }
359 } elseif( $args['type'] === 'user' ) {
360 $member = WPF()->member->get_member( $args['itemid'] );
361 $item_title = wpforo_user_dname( $member );
362 if( $args['itemid'] === WPF()->current_userid ) {
363 WPF()->notice->add( 'You are not permitted to subscribe with you', 'error' );
364 $resp['notice'] = WPF()->notice->get_notices();
365 wp_send_json_error( $resp );
366 }
367 }
368
369 $args['confirmkey'] = WPF()->sbscrb->get_confirm_key();
370
371 if( wpforo_setting( 'subscriptions', 'subscribe_confirmation' ) ) {
372 $args['active'] = 0;
373 ############### Sending Email ##################
374 $confirmlink = WPF()->sbscrb->get_confirm_link( $args );
375 $member_name = ( WPF()->current_userid ? wpforo_user_dname( WPF()->current_user ) : ( $args['user_name'] ?: $args['user_email'] ) );
376 $subject = wpforo_setting( 'subscriptions', 'confirmation_email_subject' );
377 $message = wpforo_setting( 'subscriptions', 'confirmation_email_message' );
378 $from_tags = [ "[user_display_name]", "[entry_title]", "[confirm_link]" ];
379 $to_words = [
380 sanitize_text_field( $member_name ),
381 sprintf( '<strong>%1$s</strong>', sanitize_text_field( $item_title ) ),
382 sprintf( '<br><br><a target="_blank" href="%1$s"> %2$s </a>', esc_url( (string) $confirmlink ), wpforo_phrase( 'Confirm my subscription', false ) ),
383 ];
384 $subject = stripslashes( strip_tags( str_replace( $from_tags, $to_words, (string) $subject ) ) );
385 $message = stripslashes( str_replace( $from_tags, $to_words, (string) $message ) );
386 $message = wpforo_kses( $message, 'email' );
387
388 add_filter( 'wp_mail_content_type', 'wpforo_set_html_content_type', 999 );
389 $headers = wpforo_mail_headers();
390
391 if( wp_mail( WPF()->current_user_email, sanitize_text_field( $subject ), $message, $headers ) ) {
392 if( WPF()->sbscrb->add( $args ) ) $return = 1;
393 } else {
394 WPF()->notice->add( 'Can\'t send confirmation email', 'error' );
395 }
396 remove_filter( 'wp_mail_content_type', 'wpforo_set_html_content_type' );
397 ############### Sending Email end ##############
398 } else {
399 $args['active'] = 1;
400 if( WPF()->sbscrb->add( $args ) ) $return = 1;
401 }
402 } elseif( wpfval( $_POST, 'status' ) === 'unsubscribe' ) {
403 if( ( $type = wpfval( $args, 'type' ) ) && is_scalar( $type ) && in_array( $type, ['forum','forum-topic'], true ) ) $args['type'] = ['forum','forum-topic'];
404 if( $subscribe = WPF()->sbscrb->get_subscribe( $args ) ){
405 $return = (int) WPF()->sbscrb->delete( $subscribe['confirmkey'] );
406 }
407 }
408
409 $resp['notice'] = WPF()->notice->get_notices();
410 if( $return ) {
411 wp_send_json_success( $resp );
412 } else {
413 wp_send_json_error( $resp );
414 }
415 }
416
417 public function unsubscribe() {
418 wpforo_verify_nonce( 'wpforo_unsubscribe' );
419 $r = false;
420
421 $boardid = wpfkey( $_POST, 'boardid' ) ? (int) $_POST['boardid'] : WPF()->board->get_current( 'boardid' );
422 WPF()->change_board( $boardid );
423
424 if( $key = sanitize_text_field( wpfval( $_POST, 'key' ) ) ) $r = WPF()->sbscrb->delete( $key );
425
426 $data = [ 'notice' => WPF()->notice->get_notices() ];
427 if( $r ){
428 wp_send_json_success( $data );
429 }else{
430 wp_send_json_error( $data );
431 }
432 }
433 }
434