PluginProbe
wpForo Forum / 2.1.3
wpForo Forum v2.1.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 / wpforo.php

wpforo.php in wpForo Forum 2.1.3, at wpforo.php

1,313 lines 50.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 * Plugin Name: wpForo
4 * Plugin URI: https://wpforo.com
5 * Description: WordPress Forum plugin. wpForo is a full-fledged forum solution for your community. Comes with multiple modern forum layouts.
6 * Author: gVectors Team
7 * Author URI: https://gvectors.com/
8 * Version: 2.1.3
9 * Text Domain: wpforo
10 * Domain Path: /languages
11 */
12
13 namespace wpforo;
14
15 define( 'WPFORO_VERSION', '2.1.3' );
16
17 //Exit if accessed directly
18 if( ! defined( 'ABSPATH' ) ) exit;
19
20 define( 'WPFORO_DIR', rtrim( plugin_dir_path( __FILE__ ), '/' ) );
21 define( 'WPFORO_URL', rtrim( plugins_url( '', __FILE__ ), '/' ) );
22 define( 'WPFORO_BASENAME', plugin_basename( __FILE__ ) ); //wpforo/wpforo.php
23
24 require_once WPFORO_DIR . "/autoload.php";
25
26 use stdClass;
27 use wpdb;
28 use wpforo\classes\Actions;
29 use wpforo\classes\Activity;
30 use wpforo\classes\API;
31 use wpforo\classes\Boards;
32 use wpforo\classes\Cache;
33 use wpforo\classes\Feed;
34 use wpforo\classes\Forms;
35 use wpforo\classes\Forums;
36 use wpforo\classes\Logs;
37 use wpforo\classes\Members;
38 use wpforo\classes\Moderation;
39 use wpforo\classes\Notices;
40 use wpforo\classes\Permissions;
41 use wpforo\classes\Phrases;
42 use wpforo\classes\PostMeta;
43 use wpforo\classes\Posts;
44 use wpforo\classes\RamCache;
45 use wpforo\classes\SEO;
46 use wpforo\classes\Settings;
47 use wpforo\classes\Template;
48 use wpforo\classes\Topics;
49 use wpforo\classes\UserGroups;
50 use wpforo\modules\bookmarks\Bookmarks;
51 use wpforo\modules\revisions\Revisions;
52 use wpforo\modules\reactions\Reactions;
53 use wpforo\modules\subscriptions\Subscriptions;
54
55 final class wpforo {
56 private static $_instance = null;
57
58 /** @var wpdb * */
59 public $db;
60 public $default;
61
62 public $blog_prefix = "wp_";
63 public $base_prefix = "wpforo_";
64 public $prefix = "wpforo_";
65 public $_base_tables = [
66 'boards',
67 'usergroups',
68 'profiles',
69 'logs',
70 'follows',
71 'bookmarks',
72 'accesses',
73 ];
74 public $_tables = [
75 'activity',
76 'forums',
77 'languages',
78 'phrases',
79 'postmeta',
80 'posts',
81 'post_revisions',
82 'subscribes',
83 'topics',
84 'tags',
85 'visits',
86 'reactions',
87 ];
88 public $tables;
89 private $_folders = [
90 'assets',
91 'attachments',
92 'avatars',
93 'covers',
94 'cache',
95 'default_attachments',
96 'emoticons',
97 ];
98 public $folders = [];
99
100 public $current_url;
101 public $GET = [];
102 public $current_object;
103
104 public $wp_current_user = null;
105 public $current_user = [];
106 public $current_usermeta = [];
107 public $current_user_groupid = 4;
108 public $current_user_groupids = [ 4 ];
109 public $current_user_secondary_groupids = [];
110 public $current_userid = 0;
111 public $current_user_login = '';
112 public $current_user_email = '';
113 public $current_user_display_name = '';
114 public $current_user_status = '';
115 public $current_user_accesses = [];
116 public $session_token = '';
117
118 public $tools_cleanup;
119 public $tools_misc;
120 public $locale = 'en_US';
121
122 public $dissmissed;
123
124 /** @var Settings */
125 public $settings;
126 /** @var Actions */
127 public $action;
128 /** @var Activity */
129 public $activity;
130 /** @var API */
131 public $api;
132 /** @var Boards */
133 public $board;
134 /** @var Cache */
135 public $cache;
136 /** @var Feed */
137 public $feed;
138 /** @var Forms */
139 public $form;
140 /** @var Forums */
141 public $forum;
142 /** @var Logs */
143 public $log;
144 /** @var Members */
145 public $member;
146 /** @var Moderation */
147 public $moderation;
148 /** @var Notices */
149 public $notice;
150 /** @var Permissions */
151 public $perm;
152 /** @var Phrases */
153 public $phrase;
154 /** @var PostMeta */
155 public $postmeta;
156 /** @var Posts */
157 public $post;
158 /** @var RamCache */
159 public $ram_cache;
160 /** @var Revisions */
161 public $revision;
162 /** @var Reactions */
163 public $reaction;
164 /** @var Bookmarks */
165 public $bookmark;
166 /** @var SEO */
167 public $seo;
168 /** @var Subscriptions */
169 public $sbscrb;
170 /** @var Template */
171 public $tpl;
172 /** @var Topics */
173 public $topic;
174 /** @var UserGroups */
175 public $usergroup;
176
177 public static function instance() {
178 if( is_null( self::$_instance ) ) self::$_instance = new self();
179
180 return self::$_instance;
181 }
182
183 private function init_db() {
184 global $wpdb;
185 $this->db = $wpdb;
186 }
187
188 public function is_db_mysql8() {
189 if( preg_match( '#([\d.]+)-MariaDB#iu', $this->db->get_var( "SELECT VERSION()" ), $match ) ) {
190 $use_mysql8 = version_compare( $match[1], '10.2.6', '>=' );
191 } else {
192 $use_mysql8 = version_compare( $this->db->db_version(), '8.0.0', '>=' );
193 }
194
195 return apply_filters( 'wpforo_use_mysql8', $use_mysql8 );
196 }
197
198 private function __construct() {
199 $this->init_db();
200 $this->init_hooks();
201 }
202
203 public function generate_prefix( $boardid ) {
204 $boardid = intval( $boardid );
205
206 return $this->base_prefix . ( $boardid ? $boardid . '_' : '' );
207 }
208
209 private function init_prefix() {
210 $boardid = $this->board->get_current( 'boardid' );
211 $this->prefix = $this->generate_prefix( $boardid );
212 }
213
214 public function change_board( $args = [] ) {
215 if( is_null( $this->board ) ) return;
216
217 do_action( 'wpforo_before_change_board', $args );
218
219 $boardid = $this->board->get_current( 'boardid' );
220 $is_inited = (bool) wpfval( $this->board->is_inited, $boardid );
221 $this->board->init_current( $args );
222
223 if( ! $is_inited || $boardid !== $this->board->get_current( 'boardid' ) ) {
224 $this->ram_cache->reset();
225
226 $this->init_prefix();
227 $this->init_tables();
228 $this->init_folders();
229 $this->init_options();
230
231 do_action( 'wpforo_after_change_board', $args );
232 }
233 }
234
235 private function init_base_classes() {
236 $this->requires();
237 $this->init_defaults();
238 $this->reset_current_object();
239 $this->init_base_tables();
240 $this->init_folders();
241
242 do_action( 'wpforo_before_init_base_classes' );
243
244 $this->settings = new Settings();
245 $this->tpl = new Template();
246 $this->ram_cache = new RamCache();
247 $this->cache = new Cache();
248 $this->action = new Actions();
249 $this->board = new Boards();
250 $this->usergroup = new UserGroups();
251 $this->member = new Members();
252 $this->perm = new Permissions();
253 $this->notice = new Notices();
254
255 $this->moderation = new Moderation();
256 $this->phrase = new Phrases();
257
258 do_action( 'wpforo_after_init_base_classes' );
259 }
260
261 private function init_classes() {
262 do_action( 'wpforo_before_init_classes' );
263
264 $this->activity = new Activity();
265 $this->api = new API();
266 $this->feed = new Feed();
267 $this->form = new Forms();
268 $this->forum = new Forums();
269 $this->log = new Logs();
270 $this->postmeta = new PostMeta();
271 $this->post = new Posts();
272 $this->seo = new SEO();
273 $this->topic = new Topics();
274 $this->reaction = new Reactions();
275 if( wpforo_is_module_enabled( 'bookmarks' ) ) $this->bookmark = new Bookmarks();
276 if( wpforo_is_module_enabled( 'revisions' ) ) $this->revision = new Revisions();
277 if( wpforo_is_module_enabled( 'subscriptions' ) ) $this->sbscrb = new Subscriptions();
278
279 do_action( 'wpforo_after_init_classes' );
280 }
281
282 public function set_locale( $locale ) {
283 $this->locale = $locale;
284 do_action( 'wpforo_after_set_locale', $locale );
285 }
286
287 private function init_hooks() {
288 add_action(
289 'after_setup_theme',
290 function() {
291 $this->init_base_classes();
292 if( ! $this->is_installed() ) $this->init();
293 },
294 0
295 );
296 add_action( 'change_locale', [ $this, 'set_locale' ] );
297 add_action( 'init', function() { $this->set_locale( get_locale() ); } );
298 add_action( 'widgets_init', function() {
299 $boards = $this->board->get_boards( [ 'status' => true ] );
300 foreach( $boards as $board ) {
301 register_sidebar(
302 [
303 'id' => sprintf(
304 'wpforo_%1$ssidebar',
305 $board['boardid'] ? $board['boardid'] . '_' : ''
306 ),
307 'name' => __( 'wpForo Sidebar', 'wpforo' ) . ' - ( ' . $board['title'] . ' )',
308 'description' => __( "NOTE: If you're going to add widgets in this sidebar, please use 'Full Width' template for wpForo index page to avoid sidebar duplication.", 'wpforo' ),
309 'before_widget' => '<aside id="%1$s" class="footer-widget-col %2$s clearfix">',
310 'after_widget' => '</aside>',
311 'before_title' => '<h3 class="widget-title">',
312 'after_title' => '</h3>',
313 ]
314 );
315 }
316
317 register_widget( 'wpforo\widgets\Forums' );
318 register_widget( 'wpforo\widgets\Profile' );
319 register_widget( 'wpforo\widgets\Search' );
320 register_widget( 'wpforo\widgets\OnlineMembers' );
321 register_widget( 'wpforo\widgets\RecentTopics' );
322 register_widget( 'wpforo\widgets\RecentPosts' );
323 register_widget( 'wpforo\widgets\Tags' );
324 } );
325 add_filter( 'plugin_locale', function( $locale, $domain ) {
326 if( $domain === 'wpforo' && defined( 'DOING_AJAX' ) && DOING_AJAX ) $locale = $this->locale;
327
328 return $locale;
329 }, 10, 2 );
330 add_action( 'wpforo_after_init_classes', function() {
331 if( wpforo_setting( 'email', 'disable_new_user_admin_notification' ) ) {
332 remove_action( 'after_password_reset', 'wp_password_change_notification' );
333
334 remove_action( 'register_new_user', 'wp_send_new_user_notifications' );
335 add_action( 'register_new_user', 'wpforo_send_new_user_notifications' );
336
337 remove_action( 'edit_user_created_user', 'wp_send_new_user_notifications' );
338 add_action( 'edit_user_created_user', 'wpforo_send_new_user_notifications', 10, 2 );
339
340 remove_action( 'network_site_new_created_user', 'wp_send_new_user_notifications' );
341 add_action( 'network_site_new_created_user', 'wpforo_send_new_user_notifications' );
342
343 remove_action( 'network_site_users_created_user', 'wp_send_new_user_notifications' );
344 add_action( 'network_site_new_created_user', 'wpforo_send_new_user_notifications' );
345
346 remove_action( 'network_user_new_created_user', 'wp_send_new_user_notifications' );
347 add_action( 'network_user_new_created_user', 'wpforo_send_new_user_notifications' );
348 }
349 } );
350
351 if( is_admin() || strpos( $_SERVER['REQUEST_URI'], '/wp-json/' ) === 0 || preg_match( '#^/?(?:([^\s/?&=<>:\'\"*\\\|]*/)(?1)*)?[^\s/?&=<>:\'\"*\\\|]+\.(?:php|js|css|jpe?g|png|gif|bmp|webp|svg|tiff)/?(?:\?[^/]*)?$#iu', $_SERVER['REQUEST_URI'] ) ) {
352 add_action( 'init', [ $this, 'init' ], 99 );
353 add_action( 'admin_init', [ $this, 'admin_init' ] );
354 } else {
355 add_action( 'wp', [ $this, 'init' ], 99 );
356 }
357 add_action( 'switch_blog', [ $this, 'after_switch_blog' ], 10, 2 );
358 add_action( 'wpforo_before_init', [ $this, 'change_board' ] );
359 add_action( 'wpforo_after_init_current_url', [ $this, 'change_board' ] );
360 }
361
362 public function after_switch_blog( $new_blog_id, $prev_blog_id ) {
363 if( intval( $new_blog_id ) !== intval( $prev_blog_id ) ) {
364 $this->init_base_tables();
365 $this->init_tables();
366 $this->init_folders();
367 }
368 }
369
370 private function init_base_tables() {
371 $this->db->query( "SET SESSION group_concat_max_len = 1000000" );
372 $blog_id = apply_filters( 'wpforo_current_blog_id', 0 );
373 $this->tables = new stdClass;
374 if( ! $blog_id ) $blog_id = $this->db->blogid;
375 $this->blog_prefix = $this->db->get_blog_prefix( $blog_id );
376 $this->_base_tables = apply_filters( 'wpforo_init_base_tables', $this->_base_tables );
377 foreach( $this->_base_tables as $table ) $this->tables->$table = $this->fix_table_name( $table );
378 }
379
380 private function init_tables() {
381 $this->_tables = apply_filters( 'wpforo_init_tables', $this->_tables );
382 foreach( $this->_tables as $table ) $this->tables->$table = $this->fix_table_name( $table );
383 }
384
385 public function get_active_boards_tables( $basename ) {
386 $tables = [];
387 if( $boardids = $this->board->get_active_boardids() ) {
388 foreach( $boardids as $boardid ) $tables[] = $this->fix_table_name( $basename, $this->generate_prefix( $boardid ) );
389 }
390
391 return array_unique( $tables );
392 }
393
394 /**
395 * @param string $basename
396 *
397 * @return string
398 */
399 public function fix_table_name( $basename, $prefix = null ) {
400 return $this->blog_prefix . ( in_array( $basename, $this->_base_tables, true ) ? $this->base_prefix : ( is_null( $prefix ) ? $this->prefix : $prefix ) ) . $basename;
401 }
402
403 public function fix_dir_sep( $dir ) {
404 $dir = str_replace( [ '/', '\\', '\\\\' ], DIRECTORY_SEPARATOR, $dir );
405
406 return rtrim( trim( $dir ), DIRECTORY_SEPARATOR );
407 }
408
409 public function fix_url_sep( $url ) {
410 return trim( str_replace( [ '/', '\\', '\\\\' ], '/', $url ) );
411 }
412
413 private function init_folders() {
414 $this->_folders = apply_filters( 'wpforo_init_folders', $this->_folders );
415 $boardid = ( is_callable( [ $this->board, 'get_current' ] ) ? $this->board->get_current( 'boardid' ) : 0 );
416 $upload_dir = wp_get_upload_dir();
417
418 // In many cases people leave the website URL protocol as http, but website works with https
419 // In this case colors.css and phrases.js are not loaded because of http blocking by browser
420 $upload_dir['baseurl'] = is_ssl() ? str_replace( 'http://', 'https://', $upload_dir['baseurl'] ) : $upload_dir['baseurl'];
421
422 $this->folders['wp_upload'] = [
423 'dir' => $this->fix_dir_sep( $upload_dir['basedir'] ),
424 'url' => $this->fix_url_sep( $upload_dir['baseurl'] ),
425 ];
426 $this->folders['wp_upload']['url//'] = preg_replace( '#^https?:#i', '', $this->folders['wp_upload']['url'] );
427 $this->folders['upload'] = [
428 'dir' => $this->folders['wp_upload']['dir'] . DIRECTORY_SEPARATOR . "wpforo" . ( $boardid ? '_' . $boardid : '' ),
429 'url' => $this->folders['wp_upload']['url'] . "/wpforo" . ( $boardid ? '_' . $boardid : '' ),
430 'url//' => $this->folders['wp_upload']['url//'] . "/wpforo" . ( $boardid ? '_' . $boardid : '' ),
431 ];
432 foreach( $this->_folders as $folder ) {
433 $this->folders[ $folder ] = [
434 'dir' => $this->folders['upload']['dir'] . DIRECTORY_SEPARATOR . trim( $this->fix_dir_sep( $folder ), DIRECTORY_SEPARATOR ),
435 'url' => $this->folders['upload']['url'] . "/" . trim( $this->fix_url_sep( $folder ), '/' ),
436 'url//' => $this->folders['upload']['url//'] . "/" . trim( $this->fix_url_sep( $folder ), '/' ),
437 ];
438 }
439 do_action( 'wpforo_after_init_folders', $this->folders );
440 }
441
442 private function requires() {
443 require_once WPFORO_DIR . '/includes/functions.php';
444 require_once WPFORO_DIR . '/includes/functions-template.php';
445 require_once WPFORO_DIR . '/includes/hooks.php';
446 require_once WPFORO_DIR . '/includes/installation.php';
447 require_once WPFORO_DIR . '/integrations/functions.php';
448 if( wpforo_is_admin() ) require_once WPFORO_DIR . '/admin/index.php';
449 }
450
451 public function admin_init() {
452 if( wpforo_is_admin() ) {
453 $this->change_board();
454
455 $this->check_issues();
456
457 if( strpos( wpforo_get_request_uri(), 'user-new.php' ) === false ) {
458 if( ! $this->member->get_groupid( $this->current_userid ) ) {
459 $this->member->synchronize_user( $this->current_userid );
460 }
461 }
462
463 if( ! $this->usergroup->can_manage_forum() && wpforo_current_user_is( 'admin' ) ) {
464 $this->member->set_groupid( $this->current_userid, 1 );
465 }
466 }
467 }
468
469 public function check_issues() {
470 //Make sure all users profiles are created
471 if( $this->is_installed() ) {
472 if( apply_filters( 'wpforo_profile_synchronization_notice', true ) ) {
473 if( is_multisite() ) {
474 $sql = "SELECT COUNT(`user_id`) FROM `" . WPF()->db->usermeta . "` WHERE `meta_key` LIKE '" . WPF()->blog_prefix . "capabilities' AND `user_id` NOT IN( SELECT `userid` FROM `" . WPF()->tables->profiles . "` )";
475 } else {
476 $sql = "SELECT COUNT(`ID`) as user_id FROM `" . WPF()->db->users . "` WHERE `ID` NOT IN( SELECT `userid` FROM `" . WPF()->tables->profiles . "` )";
477 }
478 if( (int) $this->db->get_var( $sql ) ) add_action( 'admin_notices', 'wpforo_profile_notice', 10 );
479 }
480 }
481 //Make sure tables structures are correct for current version
482 $wpforo_version_db = wpforo_get_option( 'version_db', null, false );
483 if( ! $wpforo_version_db || version_compare( $wpforo_version_db, WPFORO_VERSION, '<' ) || wpforo_setting( 'general', 'debug_mode' ) ) {
484 if( 'tables' !== wpfval( $_GET, 'view' ) ) {
485 $db_note = false;
486 $problems = wpforo_database_check();
487 if( ! empty( $problems ) ) {
488 foreach( $problems as $key => $problem ) {
489 if( wpfval( $problem, 'fields' ) ) $db_note = true;
490 if( wpfval( $problem, 'exists' ) ) $db_note = true;
491 if( $key === 'data' ) $db_note = true;
492 }
493 if( $db_note ) {
494 add_action( 'admin_notices', 'wpforo_database_notice', 10 );
495 }
496 } else {
497 wpforo_update_option( 'version_db', WPFORO_VERSION );
498 }
499 }
500 }
501 //Check cache plugins
502 $not_excluded_plugins = WPF()->cache->cache_plugins_status();
503 if( ! empty( $not_excluded_plugins ) ) {
504 add_action( 'admin_notices', 'wpforo_cache_information', 10 );
505 }
506 }
507
508 public function init() {
509 do_action( 'wpforo_before_init' );
510 $this->init_classes();
511 $this->init_current_url();
512 do_action( 'wpforo_core_inited' );
513 $this->init_current_object();
514 do_action( 'wpforo_after_init' );
515 }
516
517 public function shortcode_atts_to_url( $atts ) {
518 if( is_null( $this->forum ) ) $this->init_classes();
519
520 $url = wpforo_home_url();
521
522 $args = shortcode_atts(
523 [
524 'item' => 'forum',
525 'id' => 0,
526 'slug' => '',
527 ],
528 (array) $atts
529 );
530
531 if( $args['item'] === 'profile' && ! $args['id'] ) $args['id'] = $this->current_userid;
532
533 if( $args['item'] === 'add-topic' ) {
534 $forum = $this->forum->get_forum( ( $args['slug'] ?: $args['id'] ) );
535 $forumid = (int) wpfval( $forum, 'is_cat' ) ? 0 : (int) wpfval( $forum, 'forumid' );
536 $url = wpforo_home_url( wpforo_settings_get_slug( 'add-topic' ) . '/' . $forumid );
537 } elseif( $args['item'] === 'recent' ) {
538 $url = wpforo_settings_get_slug( 'recent' ) . '/';
539 if( trim( $args['slug'] ) ) $url .= '?view=' . wpforo_settings_get_slug( $args['slug'] );
540 $url = wpforo_home_url( $url );
541 } elseif( $args['id'] || $args['slug'] ) {
542 $getid = ( $args['slug'] ?: $args['id'] );
543 if( $args['item'] === 'topic' ) {
544 $url = $this->topic->get_url( $getid );
545 } elseif( $args['item'] === 'profile' ) {
546 $url = $this->member->get_profile_url( $getid );
547 } else {
548 $url = $this->forum->get_forum_url( $getid );
549 }
550 } elseif( $args['item'] === 'login' ) {
551 $url = wpforo_login_url();
552 } elseif( $args['item'] === 'register' ) {
553 $url = wpforo_register_url();
554 } elseif( $args['item'] === 'lostpassword' ) {
555 $url = wpforo_lostpassword_url();
556 }
557
558 return $url;
559 }
560
561 public function init_current_url( $atts = [] ) {
562 if( is_null( $this->post ) ) $this->init_classes();
563
564 if( is_scalar( $atts ) ) {
565 $url = $atts;
566 $atts = [];
567 } else {
568 $url = wpforo_get_request_uri();
569 }
570 if( $atts || is_wpforo_shortcode_page( $url ) ) {
571 if( $atts || ( $atts = get_wpforo_shortcode_atts( '', $url ) ) ) {
572 $url = $this->shortcode_atts_to_url( $atts );
573 } else {
574 $url = wpforo_home_url();
575 }
576 } elseif( is_wpforo_url( $url ) && preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'postid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $matches ) ) {
577 $post_url = $this->post->get_full_url( $matches[1] );
578 if( $post_url !== wpforo_home_url() ) $url = $post_url;
579 }elseif( is_wpforo_url( $url ) && preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'topicid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $matches ) ) {
580 $topic_url = $this->topic->get_full_url( $matches[1] );
581 if( $topic_url !== wpforo_home_url() ) $url = $topic_url;
582 }
583
584 if( function_exists( 'pll_default_language' ) ) {
585 $qvar = wpforo_get_url_query_vars_str( $url );
586 $qvar = preg_replace( '#^' . preg_quote( pll_default_language() ) . '/#', '', $qvar );
587 $url = $this->user_trailingslashit( home_url( $qvar ) );
588 }
589
590 $url = wpforo_fix_url( $url );
591 $url = preg_replace( '#\#[^/?&]*$#iu', '', $url );
592 parse_str( (string) parse_url( $url, PHP_URL_QUERY ), $get );
593 $get = array_merge( (array) $get, $_GET );
594 $get = wp_unslash( $get );
595
596 $this->current_url = apply_filters( 'wpforo_init_current_url', $url );
597 $this->GET = apply_filters( 'wpforo_init_current_url_GET', $get );
598
599 do_action( 'wpforo_after_init_current_url', $atts );
600 }
601
602 private function init_defaults() {
603 date_default_timezone_set( 'UTC' );
604 ini_set( 'date.timezone', 'UTC' );
605
606 $this->default = new stdClass;
607
608 $this->default->current_object = [
609 'route' => '',
610 'template' => '',
611 'qvars' => [],
612 'args' => [],
613 'layout' => 1,
614 'og_text' => '',
615 'paged' => 1,
616 'items_count' => 0,
617 'items_per_page' => 15,
618 'is_404' => false,
619 'user_is_same_current_user' => false,
620 'orderby' => null,
621 'members' => [],
622 'categories' => [],
623 'topics' => [],
624 'posts' => [],
625 'user' => [],
626 'userid' => 0,
627 'user_nicename' => '',
628 'forum' => [],
629 'forumid' => 0,
630 'forum_slug' => '',
631 'forum_desc' => '',
632 'forum_meta_key' => '',
633 'forum_meta_desc' => '',
634 'topic' => [],
635 'topicid' => 0,
636 'topic_slug' => '',
637 'tags' => [],
638 'load_tinymce' => false,
639 ];
640
641 $this->default->tools_cleanup = [
642 'user_reg_days_ago' => 7,
643 'auto_cleanup_users' => 0,
644 'usergroup' => [ 1 => '0', 5 => '0', 2 => '1', 3 => '0' ],
645 ];
646
647 $this->default->tools_misc = [
648 'admin_note' => '',
649 'admin_note_groups' => [ 1, 2, 3, 4, 5 ],
650 'admin_note_pages' => [ 'forum' ],
651 ];
652
653 $this->default->stats = [
654 'forums' => 0,
655 'topics' => 0,
656 'posts' => 0,
657 'members' => 0,
658 'online_members_count' => 0,
659 'last_post_title' => '',
660 'last_post_url' => '',
661 'newest_member' => [],
662 'newest_member_dname' => '',
663 'newest_member_profile_url' => '',
664 ];
665
666 $this->default->dissmissed = [
667 'recaptcha_backend_note' => 0,
668 'recaptcha_note' => 0,
669 'addons_css_update' => 0,
670 ];
671 }
672
673 private function reset_current_object() {
674 $this->current_object = $this->default->current_object;
675 }
676
677 private function init_options() {
678 $this->tools_cleanup = wpforo_get_option( 'tools_cleanup', $this->default->tools_cleanup );
679 $this->tools_misc = wpforo_get_option( 'tools_misc', $this->default->tools_misc );
680 $this->dissmissed = wpforo_get_option( 'dissmissed', $this->default->dissmissed );
681 }
682
683 public function can_use_trailing_slashes() {
684 return '/' === substr( get_option( 'permalink_structure', '' ), - 1, 1 );
685 }
686
687 public function user_trailingslashit( $url ) {
688 $rtrimed_url = '';
689 $url_append_vars = '';
690 if( preg_match( '#^(.+?)(/?[?&].*)?$#isu', $url, $match ) ) {
691 if( wpfval( $match, 1 ) ) $rtrimed_url = rtrim( $match[1], '/\\' );
692 if( wpfval( $match, 2 ) ) $url_append_vars = '?' . trim( $match[2], '?&/\\' );
693 if( $rtrimed_url ) {
694 $home_url = rtrim( preg_replace( '#/?\?.*$#isu', '', home_url() ), '/\\' );
695 if( $rtrimed_url == $home_url ) {
696 $url = $rtrimed_url . '/';
697 } else {
698 $url = $rtrimed_url . ( wpforo_ram_get( [ $this, 'can_use_trailing_slashes' ] ) ? '/' : '' );
699 }
700 }
701 }
702
703 return $url . $url_append_vars;
704 }
705
706 public function strip_url_paged_var( $url ) {
707 $patterns = [
708 '#/' . preg_quote( wpforo_settings_get_slug( 'paged' ) ) . '/?\d*/?#isu',
709 '#[&?]wpfpaged=\d*#iu',
710 ];
711 $url = preg_replace( $patterns, '', $url );
712
713 return $this->user_trailingslashit( $url );
714 }
715
716 public function statistic_cache_clean() {
717 $this->db->query( "DELETE FROM `" . $this->db->options . "` WHERE `option_name` REGEXP '^" . wpforo_prefix( 'stat_[0-9]+' ) . "'" );
718 }
719
720 public function statistic( $mode = 'get', $template = 'all' ) {
721 $key = 'stat_' . $this->current_user_groupid;
722 if( $mode === 'get' ) {
723 if( $cached_stat = wpforo_get_option( $key, [], false ) ) {
724 $cached_stat['online_members_count'] = $this->member->online_members_count();
725 if( wpfkey( $cached_stat, 'forums' ) && wpfkey( $cached_stat, 'topics' ) && wpfkey( $cached_stat, 'posts' ) ) {
726 return wpforo_array_args_cast_and_merge( $cached_stat, $this->default->stats );
727 }
728 }
729 }
730
731 if( $mode === 'get' || $template === 'all' ) {
732 $stats['forums'] = $this->forum->get_count( [ 'is_cat' => 0 ] );
733 $stats['topics'] = $this->topic->get_count();
734 $stats['posts'] = $this->post->get_count();
735 $member_status = [ 'p.`status`' => $this->member->get_inlist_enabled_statuses() ];
736 $stats['members'] = $this->member->get_count( $member_status );
737 $stats['online_members_count'] = $this->member->online_members_count();
738 $row_count = apply_filters( 'wpforo_get_statistic_row_count', 20 );
739
740 $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => $row_count, 'private' => 0, 'status' => 0, 'permgroup' => 4 ] );
741 $first = key( $posts );
742 if( isset( $posts[ $first ] ) && ! empty( $posts[ $first ] ) && $this->perm->forum_can( 'vf', $posts[ $first ]['forumid'] ) ) {
743 $stats['last_post_title'] = $posts[ $first ]['title'];
744 $stats['last_post_url'] = $this->post->get_url( $posts[ $first ]['last_post'] );
745 }
746
747 $newest_member = $this->member->get_newest_member();
748 if( !empty( $newest_member ) ){
749 $stats['newest_member'] = $newest_member;
750 $stats['newest_member_dname'] = wpforo_user_dname( $newest_member );
751 $stats['newest_member_profile_url'] = $newest_member['profile_url'];
752 }
753 } else {
754 $stats = wpforo_get_option( $key, $this->default->stats, false );
755 switch( $template ) {
756 case 'forum':
757 $stats['forums'] = $this->forum->get_count( [ 'is_cat' => 0 ] );
758 break;
759 case 'topic':
760 $stats['topics'] = $this->topic->get_count();
761 $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] );
762 if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) {
763 $stats['last_post_title'] = $posts[0]['title'];
764 $stats['last_post_url'] = $this->post->get_url( $posts[0]['last_post'] );
765 }
766 break;
767 case 'post':
768 $stats['posts'] = $this->post->get_count();
769 $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] );
770 if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) {
771 $stats['last_post_title'] = $posts[0]['title'];
772 $stats['last_post_url'] = $this->post->get_url( $posts[0]['last_post'] );
773 }
774 break;
775 case 'user':
776 //$member_status = [ 'p.`status`' => $this->member->get_inlist_enabled_statuses() ];
777 //$stats['members'] = $this->member->get_count( $member_status );
778 $stats['members'] = $this->member->get_count();
779 $stats['online_members_count'] = $this->member->online_members_count();
780
781 $newest_member = $this->member->get_newest_member( false );
782 if( !empty( $newest_member ) ){
783 $stats['newest_member'] = $newest_member;
784 $stats['newest_member_dname'] = wpforo_user_dname( $newest_member );
785 $stats['newest_member_profile_url'] = $newest_member['profile_url'];
786 }
787 break;
788 }
789 }
790
791 $stats = apply_filters( 'wpforo_get_statistic_array_filter', $stats );
792 $stats = wpforo_array_args_cast_and_merge( $stats, $this->default->stats );
793 wpforo_update_option( $key, $stats );
794
795 return $stats;
796 }
797
798 public function init_current_object() {
799 $this->reset_current_object();
800 $this->current_object['items_per_page'] = $this->post->get_option_items_per_page();
801 $url = $this->current_url;
802 $get = $this->GET;
803
804 if( ! is_wpforo_page( $url ) ) return;
805
806 $current_url = wpforo_get_url_query_vars_str( $url );
807
808 $current_object = [];
809 if( wpfkey( $get, 'wpfs' ) || wpfval( $get, 'foro' ) === 'search' ) $this->current_object['template'] = 'search';
810 if( wpfval( $get, 'wpforo' ) || wpfval( $get, 'foro' ) ) {
811 $request = ( wpfval( $get, 'wpforo' ) ) ? wpfval( $get, 'wpforo' ) : wpfval( $get, 'foro' );
812 if( $request === 'page' ) $this->current_object['template'] = 'page';
813 }
814
815 $template_key = '';
816 $wpf_url = preg_replace( '#/?\?.*$#isu', '', $current_url );
817 $wpf_url_parse = array_values( array_filter( explode( '/', trim( $wpf_url, '/' ) ) ) );
818 if( array_key_exists( 0, $wpf_url_parse ) && in_array( $wpf_url_parse[0], $this->board->routes ) ) {
819 $this->current_object['route'] = $wpf_url_parse[0];
820 unset( $wpf_url_parse[0] );
821
822 if( in_array( $this->current_object['route'], $this->board->base_routes, true ) ) {
823 $this->current_object['template'] = ( $template_key = wpforo_settings_get_slug_key( $this->current_object['route'] ) ) !== 'member' ? $template_key : '';
824
825 if( $this->current_object['template'] === 'register' ) {
826 $this->form->current['template'] = 'register';
827 $this->form->current['value']['user_login'] = sanitize_user( (string) wpfval( $_POST, 'wpfreg', 'user_login' ) );
828 $this->form->current['value']['user_email'] = sanitize_email( (string) wpfval( $_POST, 'wpfreg', 'user_email' ) );
829 $this->form->current['varname'] = 'wpfreg';
830 } elseif( $this->current_object['template'] === 'logout' && $this->current_userid ) {
831 $this->action->logout();
832 }
833 }
834
835 if( $this->current_userid && in_array( $this->current_object['template'], [ 'register', 'login', 'lostpassword' ], true ) ) wpforo_redirect_to();
836 }
837 $wpf_url_parse = array_reverse( $wpf_url_parse );
838
839 if( in_array( wpforo_settings_get_slug( 'paged' ), $wpf_url_parse ) ) {
840 foreach( $wpf_url_parse as $key => $value ) {
841 if( $value === wpforo_settings_get_slug( 'paged' ) ) {
842 unset( $wpf_url_parse[ $key ] );
843 break;
844 }
845 if( is_numeric( $value ) ) $paged = intval( $value );
846
847 unset( $wpf_url_parse[ $key ] );
848 }
849 }
850 if( $_paged = intval( wpfval( $get, 'wpfpaged' ) ) ) $paged = $_paged;
851 $current_object['paged'] = ( isset( $paged ) && $paged > 0 ) ? $paged : 1;
852 $current_object['orderby'] = wpfval( $get, 'orderby' );
853
854 $wpf_url_parse = array_values( $wpf_url_parse );
855
856 if( ! $this->current_object['template'] ) {
857 $current_object = apply_filters( 'wpforo_before_init_current_object', $current_object, $wpf_url_parse );
858 if( wpfkey( $current_object, 'template' ) ) $this->current_object['template'] = (string) wpfval( $current_object, 'template' );
859 }
860
861 if( ! $this->current_object['template'] ) {
862 $templates = $template_key === 'member' ? $this->tpl->get_member_templates_list() : $this->tpl->get_templates_list();
863 if( $templates ) {
864 if( $template_key === 'member' ) {
865 if( count( $wpf_url_parse ) > 1 ) {
866 $nickname = end( $wpf_url_parse );
867 $profile_route = prev( $wpf_url_parse );
868 array_pop( $wpf_url_parse );
869 array_pop( $wpf_url_parse );
870 array_push( $wpf_url_parse, $nickname, $profile_route );
871 } else {
872 if( ! in_array( end( $wpf_url_parse ), array_map( 'wpforo_settings_get_slug', $templates ) ) ) $wpf_url_parse[] = wpforo_settings_get_slug( 'profile' );
873 }
874 }
875 $__slug = end( $wpf_url_parse );
876 foreach( $templates as $template ) {
877 if( $__slug === wpforo_settings_get_slug( $template ) ) {
878 $this->current_object['template'] = $template;
879 $current_object['qvars'] = $wpf_url_parse;
880 array_pop( $current_object['qvars'] );
881 $current_object['qvars'] = array_reverse( $current_object['qvars'] );
882 break;
883 }
884 }
885
886 if( $template_key === 'member' ) {
887 if( ! $this->current_object['template'] && ! $wpf_url_parse ) {
888 if( $this->current_userid ) {
889 $this->current_object['template'] = 'profile';
890 } else {
891 wp_safe_redirect( wpforo_login_url() );
892 exit();
893 }
894 } elseif( ! wpforo_is_member_template( $this->current_object['template'] ) ) {
895 $this->current_object['template'] = '';
896 $current_object['qvars'] = [];
897 }
898 }
899 }
900 }
901
902 if( ! $this->current_object['template'] ) {
903 $this->current_object['template'] = 'forum';
904 $this->form->current['varname'] = 'thread';
905 if( isset( $wpf_url_parse[0] ) ) {
906 if( isset( $wpf_url_parse[1] ) ) {
907 $current_object['topic_slug'] = $wpf_url_parse[0];
908 $current_object['forum_slug'] = $wpf_url_parse[1];
909 $this->current_object['template'] = 'post';
910 $this->form->current['varname'] = 'post';
911 } else {
912 $current_object['forum_slug'] = $wpf_url_parse[0];
913 $this->current_object['template'] = 'topic';
914 $this->form->current['varname'] = 'thread';
915 }
916 }
917 }
918
919 $current_object = apply_filters( 'wpforo_after_init_current_template', $current_object, $wpf_url_parse, $get );
920 if( wpfkey( $current_object, 'template' ) ) $this->current_object['template'] = (string) wpfval( $current_object, 'template' );
921
922 if( $this->current_object['template'] ) {
923 if( wpforo_is_member_template( $this->current_object['template'] ) ) {
924 if( ! wpfval( $current_object, 'userid' ) && ! wpfval( $current_object, 'user_nicename' ) ) {
925 if( $qvar0 = wpfval( $current_object['qvars'], 0 ) ) {
926 if( wpforo_setting( 'profiles', 'url_structure' ) === 'id' ) {
927 $current_object['userid'] = $qvar0;
928 } else {
929 $current_object['user_nicename'] = $qvar0;
930 }
931 } else {
932 if( $this->current_userid ) {
933 $current_object['userid'] = $this->current_userid;
934 } else {
935 wp_safe_redirect( wpforo_login_url() );
936 exit();
937 }
938 }
939 }
940
941 // redirect old type of member urls to new one
942 if( $template_key !== 'member' ) {
943 if( count( $current_object['qvars'] ) === 1 ) {
944 $redirect = wpforo_url(
945 array_shift( $current_object['qvars'] ) . ( $this->current_object['template'] !== 'profile' ? '/' . wpforo_settings_get_slug( $this->current_object['template'] ) : '' ),
946 'member'
947 );
948 } else {
949 $redirect = wpforo_url(
950 array_shift( $current_object['qvars'] ) . '/' . wpforo_settings_get_slug( $this->current_object['template'] ) . '/' . implode( '/', $current_object['qvars'] ),
951 'member'
952 );
953 }
954 wp_safe_redirect( $redirect );
955 exit();
956 }
957 // redirectiong
958
959 } elseif( $this->current_object['template'] === 'search' ) {
960 $args = [
961 'needle' => sanitize_text_field( wpfval( $get, 'wpfs' ) ),
962 'type' => sanitize_text_field( wpfval( $get, 'wpfin' ) ),
963 'date_period' => intval( wpfval( $get, 'wpfd' ) ),
964 'forumids' => (array) wpfval( $get, 'wpff' ),
965 'offset' => ( $current_object['paged'] - 1 ) * $this->current_object['items_per_page'],
966 'row_count' => $this->current_object['items_per_page'],
967 'orderby' => 'relevancy',
968 'order' => 'desc',
969 'postids' => [],
970 ];
971 if( ! empty( $get['wpfob'] ) ) {
972 $args['orderby'] = sanitize_text_field( $get['wpfob'] );
973 } elseif( in_array( wpfval( $args, 'type' ), [ 'tag', 'user-posts', 'user-topics' ], true ) ) {
974 $args['orderby'] = 'date';
975 }
976 $wpfo = strtolower( wpfval( $get, 'wpfo' ) );
977 if( in_array( $wpfo, [ 'asc', 'desc' ], true ) ) $args['order'] = $wpfo;
978 $sdata = array_filter( (array) wpfval( $get, 'data' ) );
979 $args['postids'] = $this->postmeta->search( $sdata );
980 $current_object['args'] = $args;
981 if( $sdata && ! $args['postids'] ) {
982 $current_object['items_count'] = 0;
983 $current_object['posts'] = [];
984 } else {
985 $current_object['posts'] = $this->post->search( $args, $current_object['items_count'] );
986 }
987 } elseif( $this->current_object['template'] === 'recent' ) {
988 $current_object['items_per_page'] = wpforo_setting( 'topics', 'topics_per_page' );
989 } elseif( $this->current_object['template'] === 'tags' ) {
990 $current_object['items_per_page'] = wpforo_setting( 'tags', 'per_page' );
991 $args = [
992 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'],
993 'row_count' => $current_object['items_per_page'],
994 ];
995 $current_object['tags'] = $this->topic->get_tags( $args, $current_object['items_count'] );
996 } elseif( $this->current_object['template'] === 'members' ) {
997 $current_object['items_per_page'] = wpforo_setting( 'members', 'members_per_page' );
998
999 $this->form->current['template'] = 'members';
1000 $this->form->current['value'] = $get;
1001 $this->form->current['varname'] = '';
1002
1003 if( ! empty( $get['_wpfms'] ) ) {
1004 $users_include = [];
1005 $search_fields_names = $this->member->get_search_fields_names();
1006
1007 $wpfms = ( isset( $get['wpfms'] ) ) ? sanitize_text_field( $get['wpfms'] ) : '';
1008 if( $wpfms ) {
1009 $users_include = $this->member->search( $wpfms, $search_fields_names );
1010 } else {
1011 if( $filters = array_filter( $get, function( $v ) { return ! ( is_null( $v ) || $v === false || $v === '' ); } ) ) {
1012 $filters = array_merge( array_filter( (array) wpfval( $get, 'data' ), function( $v ) { return ! ( is_null( $v ) || $v === false || $v === '' ); } ), $filters );
1013 unset( $filters['data'] );
1014 $args = [];
1015 foreach( $filters as $filter_key => $filter ) {
1016 if( in_array( $filter_key, $search_fields_names ) ) {
1017 $args[ $filter_key ] = $filter;
1018 }
1019 }
1020 $users_include = $this->member->filter( $args );
1021 }
1022 }
1023
1024 $users_include = apply_filters( 'wpforo_member_search_users_include', $users_include );
1025 }
1026 $member_status = $this->member->get_inlist_enabled_statuses();
1027 $args = [
1028 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'],
1029 'row_count' => $current_object['items_per_page'],
1030 'status' => $member_status,
1031 'groupids' => $this->usergroup->get_visible_usergroup_ids(),
1032 ];
1033 switch( wpforo_setting( 'members', 'list_order' ) ) {
1034 case 'online_time':
1035 $args['orderby'] = 'online_time';
1036 $args['order'] = 'desc';
1037 break;
1038 case 'posts__asc':
1039 $args['orderby'] = 'posts';
1040 $args['order'] = 'ASC';
1041 break;
1042 case 'user_registered__asc':
1043 $args['orderby'] = 'user_registered';
1044 $args['order'] = 'ASC';
1045 break;
1046 case 'user_registered__desc':
1047 $args['orderby'] = 'user_registered';
1048 $args['order'] = 'DESC';
1049 break;
1050 case 'display_name__asc':
1051 $args['orderby'] = 'display_name';
1052 $args['order'] = 'ASC';
1053 break;
1054 case 'display_name__desc':
1055 $args['orderby'] = 'display_name';
1056 $args['order'] = 'DESC';
1057 break;
1058 default:
1059 $args['orderby'] = 'posts';
1060 $args['order'] = 'DESC';
1061 break;
1062 }
1063 if( ! empty( $users_include ) ) $args['include'] = $users_include;
1064 $current_object['members'] = $this->member->get_members( $args, $current_object['items_count'] );
1065 if( isset( $users_include ) && empty( $users_include ) ) {
1066 $current_object['members'] = [];
1067 $current_object['items_count'] = 0;
1068 }
1069 } elseif( $this->current_object['template'] === 'add-topic' ) {
1070 if( $qvar0 = (int) wpfval( $current_object['qvars'], 0 ) ) {
1071 $forum = (array) $this->forum->get_forum( $qvar0 );
1072 if( ! $forum || (int) wpfval( $forum, 'is_cat' ) ) {
1073 wp_safe_redirect( wpforo_home_url( wpforo_settings_get_slug( 'add-topic' ) ), 301 );
1074 exit();
1075 }
1076 }
1077 }
1078 }
1079
1080 if( wpfval( $current_object, 'userid' ) || wpfval( $current_object, 'user_nicename' ) ) {
1081 $args = [];
1082 if( isset( $current_object['userid'] ) ) $args['userid'] = $current_object['userid'];
1083 if( isset( $current_object['user_nicename'] ) ) $args['user_nicename'] = $current_object['user_nicename'];
1084 $selected_user = $this->member->get_member( $args );
1085 if( isset( $current_object['userid'] ) && empty( $selected_user ) ) $selected_user = $this->member->get_member( [ 'user_nicename' => $current_object['userid'] ] );
1086 if( $selected_user ) {
1087 $current_object['user'] = $selected_user;
1088 $current_object['userid'] = $selected_user['userid'];
1089 $current_object['user_nicename'] = $selected_user['user_nicename'];
1090 $current_object['user_is_same_current_user'] = ! empty( $this->current_userid ) && $selected_user['userid'] === $this->current_userid;
1091
1092 if( $this->tpl->can_view_template( $this->current_object['template'], $current_object['user'] ) ) {
1093 switch( $this->current_object['template'] ) {
1094 case 'activity':
1095 $args = [
1096 'offset' => ( $current_object['paged'] - 1 ) * $this->current_object['items_per_page'],
1097 'row_count' => $this->current_object['items_per_page'],
1098 'userid' => $current_object['userid'],
1099 'orderby' => '`created` DESC, `postid` DESC',
1100 'check_private' => true,
1101 'is_first_post' => wpfval( $this->GET, 'filter' ) ? $this->GET['filter'] === 'topics' : null,
1102 ];
1103 $current_object['items_count'] = 0;
1104 $current_object['activities'] = $this->post->get_posts( $args, $current_object['items_count'] );
1105 break;
1106 case 'favored':
1107 $current_object['filter'] = strtolower( (string) wpfval( WPF()->GET, 'filter' ) );
1108 if( ! in_array( $current_object['filter'], [ 'likes', 'dislikes' ], true ) ) $current_object['filter'] = 'bookmarks';
1109 if( $current_object['filter'] === 'likes' ) {
1110 $postids = $this->reaction->get_reactions_col(
1111 'postid', [
1112 'userid' => $current_object['userid'],
1113 'type_include' => 'up',
1114 ]
1115 );
1116 } elseif( $current_object['filter'] === 'dislikes' ) {
1117 $postids = $this->reaction->get_reactions_col(
1118 'postid', [
1119 'userid' => $current_object['userid'],
1120 'type_include' => 'down',
1121 ]
1122 );
1123 } else {
1124 $postids = $this->bookmark->get_bookmarks_col(
1125 'postid', [
1126 'userid' => $current_object['userid'],
1127 'boardid' => $this->board->get_current( 'boardid' ),
1128 'status' => true,
1129 ]
1130 );
1131 }
1132
1133 if( $postids ) {
1134 $args = [
1135 'offset' => ( $current_object['paged'] - 1 ) * $this->current_object['items_per_page'],
1136 'row_count' => $this->current_object['items_per_page'],
1137 'orderby' => '`created` DESC, `postid` DESC',
1138 'check_private' => true,
1139 'include' => $postids,
1140 ];
1141 $current_object['items_count'] = 0;
1142 $current_object['favored_posts'] = $this->post->get_posts( $args, $current_object['items_count'] );
1143 } else {
1144 $current_object['items_count'] = 0;
1145 $current_object['favored_posts'] = [];
1146 }
1147 break;
1148 case 'account':
1149 $this->form->current['template'] = 'account';
1150 $this->form->current['varname'] = 'member';
1151 $this->form->current['value'] = array_merge( $current_object['user'], (array) wpfval( $_POST, 'member' ) );
1152 break;
1153 default:
1154 $this->form->current['template'] = 'profile';
1155 $this->form->current['value'] = $current_object['user'];
1156 break;
1157 }
1158 } else {
1159 if( ! $this->current_userid ) {
1160 wp_safe_redirect( wpforo_login_url() );
1161 exit();
1162 }
1163 $current_object['is_404'] = true;
1164 }
1165
1166 } else {
1167 $current_object['is_404'] = true;
1168 }
1169 }
1170
1171 if( wpfval( $current_object, 'topic_slug' ) ) {
1172 $topic = $this->topic->get_topic( [ 'slug' => $current_object['topic_slug'] ], false );
1173 if( ! empty( $topic ) ) {
1174 $topic_forumid = intval( wpfval( $topic, 'forumid' ) );
1175 $is_owner = wpforo_is_owner( $topic['userid'], $topic['email'] );
1176
1177 if( apply_filters( 'wpforo_current_object_topic_protect', true, $topic ) && $topic_forumid && ( ! $this->perm->forum_can( 'vf', $topic_forumid ) || ( ! $is_owner && ! $this->perm->forum_can( 'vt', $topic_forumid ) ) || ( wpfval( $topic, 'private' ) && ! $is_owner && ! $this->perm->forum_can( 'vp', $topic_forumid ) ) || ( wpfval( $topic, 'status' ) && ! $is_owner && ! $this->perm->forum_can( 'au', $topic_forumid ) ) ) ) {
1178 if( ! $this->current_userid ) {
1179 wp_safe_redirect( wpforo_login_url() );
1180 exit();
1181 }
1182 $current_object['is_404'] = true;
1183 } else {
1184 $current_object['topic'] = $topic;
1185 $current_object['topicid'] = $topic['topicid'];
1186 $current_object['og_text'] = (string) wpfval( $topic, 'title' );
1187 }
1188 } else {
1189 $current_object['is_404'] = true;
1190 }
1191 }
1192
1193 if( wpfval( $current_object, 'forum_slug' ) ) {
1194 $args = ( empty( $topic ) ? [ 'slug' => $current_object['forum_slug'] ] : $topic['forumid'] );
1195 if( $forum = $this->forum->get_forum( $args ) ) {
1196 if( ! empty( $topic ) && strtolower( $current_object['forum_slug'] ) !== strtolower( $forum['slug'] ) ) {
1197 wp_safe_redirect( $this->topic->get_url( $topic, $forum ), 301 );
1198 exit();
1199 }
1200 if( $forum['is_cat'] ) $this->current_object['template'] = 'forum';
1201 $current_object['forum'] = $forum;
1202 $current_object['forumid'] = $forum['forumid'];
1203 $current_object['forum_desc'] = $forum['description'];
1204 $current_object['forum_meta_key'] = $forum['meta_key'];
1205 $current_object['forum_meta_desc'] = $forum['meta_desc'];
1206 $current_object['og_text'] = $forum['title'];
1207 $current_object['layout'] = $this->forum->get_layout( $forum );
1208
1209 if( $this->current_object['template'] === 'topic' ) {
1210 $current_object['items_per_page'] = wpforo_setting( 'topics', 'topics_per_page' );
1211 $args = [
1212 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'],
1213 'row_count' => $current_object['items_per_page'],
1214 'forumid' => $current_object['forumid'],
1215 'orderby' => 'type, modified',
1216 'order' => 'DESC',
1217 ];
1218 $args = apply_filters( 'wpforo_topic_list_args', $args );
1219 $current_object['topics'] = $this->topic->get_topics( $args, $current_object['items_count'] );
1220 }
1221 } else {
1222 $current_object['is_404'] = true;
1223 }
1224 }
1225
1226 if( in_array( $this->current_object['template'], [ 'forum', 'topic' ] ) ) {
1227 if( ! empty( $forum ) ) {
1228 $current_object['categories'] = [ $forum ];
1229 } else {
1230 $current_object['categories'] = $this->forum->get_forums( [ "type" => 'category' ] );
1231 }
1232 }
1233
1234 if( $this->current_object['template'] === 'post' && ! empty( $forum ) && ! empty( $topic ) ) {
1235 $current_object['items_per_page'] = $this->post->get_option_items_per_page( $current_object['layout'] );
1236
1237 $args = [
1238 'forumid' => $forum['forumid'],
1239 'topicid' => $topic['topicid'],
1240 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'],
1241 'row_count' => $current_object['items_per_page'],
1242 ];
1243 if( $current_object['layout'] == 4 ) {
1244 $args['parentid'] = 0;
1245 } elseif( $current_object['layout'] == 3 ) {
1246 $args['parentid'] = 0;
1247 switch( $current_object['orderby'] ) {
1248 case 'oldest':
1249 $args['orderby'] = '`is_first_post` DESC, `is_answer` DESC, `created` ASC, `postid` ASC';
1250 break;
1251 case 'newest':
1252 $args['orderby'] = '`is_first_post` DESC, `is_answer` DESC, `modified` DESC, `postid` DESC';
1253 break;
1254 default:
1255 $args['orderby'] = '`is_first_post` DESC, `is_answer` DESC, `votes` DESC, `created` ASC, `postid` ASC';
1256 break;
1257 }
1258 }
1259 if( $this->post->get_option_union_first_post( $current_object['layout'] ) ) $args['union_first_post'] = true;
1260 $args = apply_filters( 'wpforo_post_list_args', $args );
1261 $current_object['posts'] = $this->post->get_posts( $args, $current_object['items_count'] );
1262 }
1263
1264 $this->current_object = wpforo_parse_args( $current_object, $this->current_object );
1265
1266 $this->current_object = apply_filters( 'wpforo_after_init_current_object', $this->current_object, $wpf_url_parse );
1267
1268 if( $this->current_object['template'] ) {
1269 /**
1270 * redirect not logged-in users to login page when that user no access to this page
1271 */
1272 if( ! $this->current_userid && $this->current_object['forumid'] && ( ( in_array( $this->current_object['template'], [ 'forum', 'topic' ] ) && ! $this->perm->forum_can( 'vf', $this->current_object['forumid'] ) ) || ( $this->current_object['template'] === 'post' && ! $this->perm->forum_can( 'vt', $this->current_object['forumid'] ) ) ) ) {
1273 wp_safe_redirect( wpforo_login_url() );
1274 exit();
1275 }
1276
1277 if( $this->current_object['template'] === 'cantlogin' ) {
1278 if( $this->current_userid ) {
1279 if( $this->current_user['status'] !== 'active' ){
1280 WPF()->ram_cache->set( 'USER_LOGIN_REFERER', WPF()->current_user_login );
1281 wp_logout();
1282 }else{
1283 wp_safe_redirect( wpforo_home_url() );
1284 }
1285 } else {
1286 wp_safe_redirect( wpforo_login_url() );
1287 exit();
1288 }
1289 }
1290
1291 /**
1292 * redirect to the first page when paged var is greater items_count
1293 */
1294 if( $this->current_object['items_count'] && $this->current_object['paged'] > 1 && ( ( $this->current_object['paged'] - 1 ) * $this->current_object['items_per_page'] ) >= $this->current_object['items_count'] ) {
1295 wp_safe_redirect( $this->strip_url_paged_var( $this->current_url ), 301 );
1296 exit();
1297 }
1298 } else {
1299 $this->current_object['is_404'] = true;
1300 }
1301 }
1302
1303 public function is_installed() {
1304 return WPFORO_VERSION === wpforo_get_option( 'version', null, false );
1305 }
1306
1307 public function can_use_this_slug( $slug ) {
1308 $return = ! in_array( $slug, $this->settings->slugs, true ) && ! in_array( $slug, array_keys( $this->settings->slugs ), true );
1309
1310 return apply_filters( 'wpforo_can_use_this_slug', $return, $slug );
1311 }
1312 }
1313