PluginProbe
wpForo Forum / 2.2.3
wpForo Forum v2.2.3
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 2.2.3, at modules/subscriptions/classes/Actions.php

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