PluginProbe
wpForo Forum / 2.1.1
wpForo Forum v2.1.1
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.1, at wpforo.php

1,309 lines 50.4 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.1
9 * Text Domain: wpforo
10 * Domain Path: /languages
11 */
12
13 namespace wpforo;
14
15 define( 'WPFORO_VERSION', '2.1.1' );
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 $url = wpforo_home_url();
519
520 $args = shortcode_atts(
521 [
522 'item' => 'forum',
523 'id' => 0,
524 'slug' => '',
525 ],
526 (array) $atts
527 );
528
529 if( $args['item'] === 'profile' && ! $args['id'] ) $args['id'] = $this->current_userid;
530
531 if( $args['item'] === 'add-topic' ) {
532 $forum = $this->forum->get_forum( ( $args['slug'] ?: $args['id'] ) );
533 $forumid = (int) wpfval( $forum, 'is_cat' ) ? 0 : (int) wpfval( $forum, 'forumid' );
534 $url = wpforo_home_url( wpforo_settings_get_slug( 'add-topic' ) . '/' . $forumid );
535 } elseif( $args['item'] === 'recent' ) {
536 $url = wpforo_settings_get_slug( 'recent' ) . '/';
537 if( trim( $args['slug'] ) ) $url .= '?view=' . wpforo_settings_get_slug( $args['slug'] );
538 $url = wpforo_home_url( $url );
539 } elseif( $args['id'] || $args['slug'] ) {
540 $getid = ( $args['slug'] ?: $args['id'] );
541 if( $args['item'] === 'topic' ) {
542 $url = $this->topic->get_url( $getid );
543 } elseif( $args['item'] === 'profile' ) {
544 $url = $this->member->get_profile_url( $getid );
545 } else {
546 $url = $this->forum->get_forum_url( $getid );
547 }
548 } elseif( $args['item'] === 'login' ) {
549 $url = wpforo_login_url();
550 } elseif( $args['item'] === 'register' ) {
551 $url = wpforo_register_url();
552 } elseif( $args['item'] === 'lostpassword' ) {
553 $url = wpforo_lostpassword_url();
554 }
555
556 return $url;
557 }
558
559 public function init_current_url( $atts = [] ) {
560 if( is_scalar( $atts ) ) {
561 $url = $atts;
562 $atts = [];
563 } else {
564 $url = wpforo_get_request_uri();
565 }
566 if( $atts || is_wpforo_shortcode_page( $url ) ) {
567 if( $atts || ( $atts = get_wpforo_shortcode_atts( '', $url ) ) ) {
568 $url = $this->shortcode_atts_to_url( $atts );
569 } else {
570 $url = wpforo_home_url();
571 }
572 } elseif( is_wpforo_url( $url ) && preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'postid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $matches ) ) {
573 $post_url = $this->post->get_full_url( $matches[1] );
574 if( $post_url !== wpforo_home_url() ) $url = $post_url;
575 }elseif( is_wpforo_url( $url ) && preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'topicid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $matches ) ) {
576 $topic_url = $this->topic->get_full_url( $matches[1] );
577 if( $topic_url !== wpforo_home_url() ) $url = $topic_url;
578 }
579
580 if( function_exists( 'pll_default_language' ) ) {
581 $qvar = wpforo_get_url_query_vars_str( $url );
582 $qvar = preg_replace( '#^' . preg_quote( pll_default_language() ) . '/#', '', $qvar );
583 $url = $this->user_trailingslashit( home_url( $qvar ) );
584 }
585
586 $url = wpforo_fix_url( $url );
587 $url = preg_replace( '#\#[^/?&]*$#iu', '', $url );
588 parse_str( (string) parse_url( $url, PHP_URL_QUERY ), $get );
589 $get = array_merge( (array) $get, $_GET );
590 $get = wp_unslash( $get );
591
592 $this->current_url = apply_filters( 'wpforo_init_current_url', $url );
593 $this->GET = apply_filters( 'wpforo_init_current_url_GET', $get );
594
595 do_action( 'wpforo_after_init_current_url', $atts );
596 }
597
598 private function init_defaults() {
599 date_default_timezone_set( 'UTC' );
600 ini_set( 'date.timezone', 'UTC' );
601
602 $this->default = new stdClass;
603
604 $this->default->current_object = [
605 'route' => '',
606 'template' => '',
607 'qvars' => [],
608 'args' => [],
609 'layout' => 1,
610 'og_text' => '',
611 'paged' => 1,
612 'items_count' => 0,
613 'items_per_page' => 15,
614 'is_404' => false,
615 'user_is_same_current_user' => false,
616 'orderby' => null,
617 'members' => [],
618 'categories' => [],
619 'topics' => [],
620 'posts' => [],
621 'user' => [],
622 'userid' => 0,
623 'user_nicename' => '',
624 'forum' => [],
625 'forumid' => 0,
626 'forum_slug' => '',
627 'forum_desc' => '',
628 'forum_meta_key' => '',
629 'forum_meta_desc' => '',
630 'topic' => [],
631 'topicid' => 0,
632 'topic_slug' => '',
633 'tags' => [],
634 'load_tinymce' => false,
635 ];
636
637 $this->default->tools_cleanup = [
638 'user_reg_days_ago' => 7,
639 'auto_cleanup_users' => 0,
640 'usergroup' => [ 1 => '0', 5 => '0', 2 => '1', 3 => '0' ],
641 ];
642
643 $this->default->tools_misc = [
644 'admin_note' => '',
645 'admin_note_groups' => [ 1, 2, 3, 4, 5 ],
646 'admin_note_pages' => [ 'forum' ],
647 ];
648
649 $this->default->stats = [
650 'forums' => 0,
651 'topics' => 0,
652 'posts' => 0,
653 'members' => 0,
654 'online_members_count' => 0,
655 'last_post_title' => '',
656 'last_post_url' => '',
657 'newest_member' => [],
658 'newest_member_dname' => '',
659 'newest_member_profile_url' => '',
660 ];
661
662 $this->default->dissmissed = [
663 'recaptcha_backend_note' => 0,
664 'recaptcha_note' => 0,
665 'addons_css_update' => 0,
666 ];
667 }
668
669 private function reset_current_object() {
670 $this->current_object = $this->default->current_object;
671 }
672
673 private function init_options() {
674 $this->tools_cleanup = wpforo_get_option( 'tools_cleanup', $this->default->tools_cleanup );
675 $this->tools_misc = wpforo_get_option( 'tools_misc', $this->default->tools_misc );
676 $this->dissmissed = wpforo_get_option( 'dissmissed', $this->default->dissmissed );
677 }
678
679 public function can_use_trailing_slashes() {
680 return '/' === substr( get_option( 'permalink_structure', '' ), - 1, 1 );
681 }
682
683 public function user_trailingslashit( $url ) {
684 $rtrimed_url = '';
685 $url_append_vars = '';
686 if( preg_match( '#^(.+?)(/?[?&].*)?$#isu', $url, $match ) ) {
687 if( wpfval( $match, 1 ) ) $rtrimed_url = rtrim( $match[1], '/\\' );
688 if( wpfval( $match, 2 ) ) $url_append_vars = '?' . trim( $match[2], '?&/\\' );
689 if( $rtrimed_url ) {
690 $home_url = rtrim( preg_replace( '#/?\?.*$#isu', '', home_url() ), '/\\' );
691 if( $rtrimed_url == $home_url ) {
692 $url = $rtrimed_url . '/';
693 } else {
694 $url = $rtrimed_url . ( wpforo_ram_get( [ $this, 'can_use_trailing_slashes' ] ) ? '/' : '' );
695 }
696 }
697 }
698
699 return $url . $url_append_vars;
700 }
701
702 public function strip_url_paged_var( $url ) {
703 $patterns = [
704 '#/' . preg_quote( wpforo_settings_get_slug( 'paged' ) ) . '/?\d*/?#isu',
705 '#[&?]wpfpaged=\d*#iu',
706 ];
707 $url = preg_replace( $patterns, '', $url );
708
709 return $this->user_trailingslashit( $url );
710 }
711
712 public function statistic_cache_clean() {
713 $this->db->query( "DELETE FROM `" . $this->db->options . "` WHERE `option_name` REGEXP '^" . wpforo_prefix( 'stat_[0-9]+' ) . "'" );
714 }
715
716 public function statistic( $mode = 'get', $template = 'all' ) {
717 $key = 'stat_' . $this->current_user_groupid;
718 if( $mode === 'get' ) {
719 if( $cached_stat = wpforo_get_option( $key, [], false ) ) {
720 $cached_stat['online_members_count'] = $this->member->online_members_count();
721 if( wpfkey( $cached_stat, 'forums' ) && wpfkey( $cached_stat, 'topics' ) && wpfkey( $cached_stat, 'posts' ) ) {
722 return wpforo_array_args_cast_and_merge( $cached_stat, $this->default->stats );
723 }
724 }
725 }
726
727 if( $mode === 'get' || $template === 'all' ) {
728 $stats['forums'] = $this->forum->get_count( [ 'is_cat' => 0 ] );
729 $stats['topics'] = $this->topic->get_count();
730 $stats['posts'] = $this->post->get_count();
731 $member_status = [ 'p.`status`' => $this->member->get_inlist_enabled_statuses() ];
732 $stats['members'] = $this->member->get_count( $member_status );
733 $stats['online_members_count'] = $this->member->online_members_count();
734 $row_count = apply_filters( 'wpforo_get_statistic_row_count', 20 );
735
736 $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => $row_count, 'private' => 0, 'status' => 0, 'permgroup' => 4 ] );
737 $first = key( $posts );
738 if( isset( $posts[ $first ] ) && ! empty( $posts[ $first ] ) && $this->perm->forum_can( 'vf', $posts[ $first ]['forumid'] ) ) {
739 $stats['last_post_title'] = $posts[ $first ]['title'];
740 $stats['last_post_url'] = $this->post->get_url( $posts[ $first ]['last_post'] );
741 }
742
743 $newest_member = $this->member->get_newest_member();
744 if( !empty( $newest_member ) ){
745 $stats['newest_member'] = $newest_member;
746 $stats['newest_member_dname'] = wpforo_user_dname( $newest_member );
747 $stats['newest_member_profile_url'] = $newest_member['profile_url'];
748 }
749 } else {
750 $stats = wpforo_get_option( $key, $this->default->stats, false );
751 switch( $template ) {
752 case 'forum':
753 $stats['forums'] = $this->forum->get_count( [ 'is_cat' => 0 ] );
754 break;
755 case 'topic':
756 $stats['topics'] = $this->topic->get_count();
757 $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] );
758 if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) {
759 $stats['last_post_title'] = $posts[0]['title'];
760 $stats['last_post_url'] = $this->post->get_url( $posts[0]['last_post'] );
761 }
762 break;
763 case 'post':
764 $stats['posts'] = $this->post->get_count();
765 $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] );
766 if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) {
767 $stats['last_post_title'] = $posts[0]['title'];
768 $stats['last_post_url'] = $this->post->get_url( $posts[0]['last_post'] );
769 }
770 break;
771 case 'user':
772 //$member_status = [ 'p.`status`' => $this->member->get_inlist_enabled_statuses() ];
773 //$stats['members'] = $this->member->get_count( $member_status );
774 $stats['members'] = $this->member->get_count();
775 $stats['online_members_count'] = $this->member->online_members_count();
776
777 $newest_member = $this->member->get_newest_member( false );
778 if( !empty( $newest_member ) ){
779 $stats['newest_member'] = $newest_member;
780 $stats['newest_member_dname'] = wpforo_user_dname( $newest_member );
781 $stats['newest_member_profile_url'] = $newest_member['profile_url'];
782 }
783 break;
784 }
785 }
786
787 $stats = apply_filters( 'wpforo_get_statistic_array_filter', $stats );
788 $stats = wpforo_array_args_cast_and_merge( $stats, $this->default->stats );
789 wpforo_update_option( $key, $stats );
790
791 return $stats;
792 }
793
794 public function init_current_object() {
795 $this->reset_current_object();
796 $this->current_object['items_per_page'] = $this->post->get_option_items_per_page();
797 $url = $this->current_url;
798 $get = $this->GET;
799
800 if( ! is_wpforo_page( $url ) ) return;
801
802 $current_url = wpforo_get_url_query_vars_str( $url );
803
804 $current_object = [];
805 if( wpfkey( $get, 'wpfs' ) || wpfval( $get, 'foro' ) === 'search' ) $this->current_object['template'] = 'search';
806 if( wpfval( $get, 'wpforo' ) || wpfval( $get, 'foro' ) ) {
807 $request = ( wpfval( $get, 'wpforo' ) ) ? wpfval( $get, 'wpforo' ) : wpfval( $get, 'foro' );
808 if( $request === 'page' ) $this->current_object['template'] = 'page';
809 }
810
811 $template_key = '';
812 $wpf_url = preg_replace( '#/?\?.*$#isu', '', $current_url );
813 $wpf_url_parse = array_values( array_filter( explode( '/', trim( $wpf_url, '/' ) ) ) );
814 if( array_key_exists( 0, $wpf_url_parse ) && in_array( $wpf_url_parse[0], $this->board->routes ) ) {
815 $this->current_object['route'] = $wpf_url_parse[0];
816 unset( $wpf_url_parse[0] );
817
818 if( in_array( $this->current_object['route'], $this->board->base_routes, true ) ) {
819 $this->current_object['template'] = ( $template_key = wpforo_settings_get_slug_key( $this->current_object['route'] ) ) !== 'member' ? $template_key : '';
820
821 if( $this->current_object['template'] === 'register' ) {
822 $this->form->current['template'] = 'register';
823 $this->form->current['value']['user_login'] = sanitize_user( (string) wpfval( $_POST, 'wpfreg', 'user_login' ) );
824 $this->form->current['value']['user_email'] = sanitize_email( (string) wpfval( $_POST, 'wpfreg', 'user_email' ) );
825 $this->form->current['varname'] = 'wpfreg';
826 } elseif( $this->current_object['template'] === 'logout' && $this->current_userid ) {
827 $this->action->logout();
828 }
829 }
830
831 if( $this->current_userid && in_array( $this->current_object['template'], [ 'register', 'login', 'lostpassword' ], true ) ) wpforo_redirect_to();
832 }
833 $wpf_url_parse = array_reverse( $wpf_url_parse );
834
835 if( in_array( wpforo_settings_get_slug( 'paged' ), $wpf_url_parse ) ) {
836 foreach( $wpf_url_parse as $key => $value ) {
837 if( $value === wpforo_settings_get_slug( 'paged' ) ) {
838 unset( $wpf_url_parse[ $key ] );
839 break;
840 }
841 if( is_numeric( $value ) ) $paged = intval( $value );
842
843 unset( $wpf_url_parse[ $key ] );
844 }
845 }
846 if( $_paged = intval( wpfval( $get, 'wpfpaged' ) ) ) $paged = $_paged;
847 $current_object['paged'] = ( isset( $paged ) && $paged > 0 ) ? $paged : 1;
848 $current_object['orderby'] = wpfval( $get, 'orderby' );
849
850 $wpf_url_parse = array_values( $wpf_url_parse );
851
852 if( ! $this->current_object['template'] ) {
853 $current_object = apply_filters( 'wpforo_before_init_current_object', $current_object, $wpf_url_parse );
854 if( wpfkey( $current_object, 'template' ) ) $this->current_object['template'] = (string) wpfval( $current_object, 'template' );
855 }
856
857 if( ! $this->current_object['template'] ) {
858 $templates = $template_key === 'member' ? $this->tpl->get_member_templates_list() : $this->tpl->get_templates_list();
859 if( $templates ) {
860 if( $template_key === 'member' ) {
861 if( count( $wpf_url_parse ) > 1 ) {
862 $nickname = end( $wpf_url_parse );
863 $profile_route = prev( $wpf_url_parse );
864 array_pop( $wpf_url_parse );
865 array_pop( $wpf_url_parse );
866 array_push( $wpf_url_parse, $nickname, $profile_route );
867 } else {
868 if( ! in_array( end( $wpf_url_parse ), $templates ) ) $wpf_url_parse[] = wpforo_settings_get_slug( 'profile' );
869 }
870 }
871 $__slug = end( $wpf_url_parse );
872 foreach( $templates as $template ) {
873 if( $__slug === wpforo_settings_get_slug( $template ) ) {
874 $this->current_object['template'] = $template;
875 $current_object['qvars'] = $wpf_url_parse;
876 array_pop( $current_object['qvars'] );
877 $current_object['qvars'] = array_reverse( $current_object['qvars'] );
878 break;
879 }
880 }
881
882 if( $template_key === 'member' ) {
883 if( ! $this->current_object['template'] && ! $wpf_url_parse ) {
884 if( $this->current_userid ) {
885 $this->current_object['template'] = 'profile';
886 } else {
887 wp_safe_redirect( wpforo_login_url() );
888 exit();
889 }
890 } elseif( ! wpforo_is_member_template( $this->current_object['template'] ) ) {
891 $this->current_object['template'] = '';
892 $current_object['qvars'] = [];
893 }
894 }
895 }
896 }
897
898 if( ! $this->current_object['template'] ) {
899 $this->current_object['template'] = 'forum';
900 $this->form->current['varname'] = 'thread';
901 if( isset( $wpf_url_parse[0] ) ) {
902 if( isset( $wpf_url_parse[1] ) ) {
903 $current_object['topic_slug'] = $wpf_url_parse[0];
904 $current_object['forum_slug'] = $wpf_url_parse[1];
905 $this->current_object['template'] = 'post';
906 $this->form->current['varname'] = 'post';
907 } else {
908 $current_object['forum_slug'] = $wpf_url_parse[0];
909 $this->current_object['template'] = 'topic';
910 $this->form->current['varname'] = 'thread';
911 }
912 }
913 }
914
915 $current_object = apply_filters( 'wpforo_after_init_current_template', $current_object, $wpf_url_parse, $get );
916 if( wpfkey( $current_object, 'template' ) ) $this->current_object['template'] = (string) wpfval( $current_object, 'template' );
917
918 if( $this->current_object['template'] ) {
919 if( wpforo_is_member_template( $this->current_object['template'] ) ) {
920 if( ! wpfval( $current_object, 'userid' ) && ! wpfval( $current_object, 'user_nicename' ) ) {
921 if( $qvar0 = wpfval( $current_object['qvars'], 0 ) ) {
922 if( wpforo_setting( 'profiles', 'url_structure' ) === 'id' ) {
923 $current_object['userid'] = $qvar0;
924 } else {
925 $current_object['user_nicename'] = $qvar0;
926 }
927 } else {
928 if( $this->current_userid ) {
929 $current_object['userid'] = $this->current_userid;
930 } else {
931 wp_safe_redirect( wpforo_login_url() );
932 exit();
933 }
934 }
935 }
936
937 // redirect old type of member urls to new one
938 if( $template_key !== 'member' ) {
939 if( count( $current_object['qvars'] ) === 1 ) {
940 $redirect = wpforo_url(
941 array_shift( $current_object['qvars'] ) . ( $this->current_object['template'] !== 'profile' ? '/' . wpforo_settings_get_slug( $this->current_object['template'] ) : '' ),
942 'member'
943 );
944 } else {
945 $redirect = wpforo_url(
946 array_shift( $current_object['qvars'] ) . '/' . wpforo_settings_get_slug( $this->current_object['template'] ) . '/' . implode( '/', $current_object['qvars'] ),
947 'member'
948 );
949 }
950 wp_safe_redirect( $redirect );
951 exit();
952 }
953 // redirectiong
954
955 } elseif( $this->current_object['template'] === 'search' ) {
956 $args = [
957 'needle' => sanitize_text_field( wpfval( $get, 'wpfs' ) ),
958 'type' => sanitize_text_field( wpfval( $get, 'wpfin' ) ),
959 'date_period' => intval( wpfval( $get, 'wpfd' ) ),
960 'forumids' => (array) wpfval( $get, 'wpff' ),
961 'offset' => ( $current_object['paged'] - 1 ) * $this->current_object['items_per_page'],
962 'row_count' => $this->current_object['items_per_page'],
963 'orderby' => 'relevancy',
964 'order' => 'desc',
965 'postids' => [],
966 ];
967 if( ! empty( $get['wpfob'] ) ) {
968 $args['orderby'] = sanitize_text_field( $get['wpfob'] );
969 } elseif( in_array( wpfval( $args, 'type' ), [ 'tag', 'user-posts', 'user-topics' ], true ) ) {
970 $args['orderby'] = 'date';
971 }
972 $wpfo = strtolower( wpfval( $get, 'wpfo' ) );
973 if( in_array( $wpfo, [ 'asc', 'desc' ], true ) ) $args['order'] = $wpfo;
974 $sdata = array_filter( (array) wpfval( $get, 'data' ) );
975 $args['postids'] = $this->postmeta->search( $sdata );
976 $current_object['args'] = $args;
977 if( $sdata && ! $args['postids'] ) {
978 $current_object['items_count'] = 0;
979 $current_object['posts'] = [];
980 } else {
981 $current_object['posts'] = $this->post->search( $args, $current_object['items_count'] );
982 }
983 } elseif( $this->current_object['template'] === 'recent' ) {
984 $current_object['items_per_page'] = wpforo_setting( 'topics', 'topics_per_page' );
985 } elseif( $this->current_object['template'] === 'tags' ) {
986 $current_object['items_per_page'] = wpforo_setting( 'tags', 'per_page' );
987 $args = [
988 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'],
989 'row_count' => $current_object['items_per_page'],
990 ];
991 $current_object['tags'] = $this->topic->get_tags( $args, $current_object['items_count'] );
992 } elseif( $this->current_object['template'] === 'members' ) {
993 $current_object['items_per_page'] = wpforo_setting( 'members', 'members_per_page' );
994
995 $this->form->current['template'] = 'members';
996 $this->form->current['value'] = $get;
997 $this->form->current['varname'] = '';
998
999 if( ! empty( $get['_wpfms'] ) ) {
1000 $users_include = [];
1001 $search_fields_names = $this->member->get_search_fields_names();
1002
1003 $wpfms = ( isset( $get['wpfms'] ) ) ? sanitize_text_field( $get['wpfms'] ) : '';
1004 if( $wpfms ) {
1005 $users_include = $this->member->search( $wpfms, $search_fields_names );
1006 } else {
1007 if( $filters = array_filter( $get, function( $v ) { return ! ( is_null( $v ) || $v === false || $v === '' ); } ) ) {
1008 $filters = array_merge( array_filter( (array) wpfval( $get, 'data' ), function( $v ) { return ! ( is_null( $v ) || $v === false || $v === '' ); } ), $filters );
1009 unset( $filters['data'] );
1010 $args = [];
1011 foreach( $filters as $filter_key => $filter ) {
1012 if( in_array( $filter_key, $search_fields_names ) ) {
1013 $args[ $filter_key ] = $filter;
1014 }
1015 }
1016 $users_include = $this->member->filter( $args );
1017 }
1018 }
1019
1020 $users_include = apply_filters( 'wpforo_member_search_users_include', $users_include );
1021 }
1022 $member_status = $this->member->get_inlist_enabled_statuses();
1023 $args = [
1024 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'],
1025 'row_count' => $current_object['items_per_page'],
1026 'status' => $member_status,
1027 'groupids' => $this->usergroup->get_visible_usergroup_ids(),
1028 ];
1029 switch( wpforo_setting( 'members', 'list_order' ) ) {
1030 case 'online_time':
1031 $args['orderby'] = 'online_time';
1032 $args['order'] = 'desc';
1033 break;
1034 case 'posts__asc':
1035 $args['orderby'] = 'posts';
1036 $args['order'] = 'ASC';
1037 break;
1038 case 'user_registered__asc':
1039 $args['orderby'] = 'user_registered';
1040 $args['order'] = 'ASC';
1041 break;
1042 case 'user_registered__desc':
1043 $args['orderby'] = 'user_registered';
1044 $args['order'] = 'DESC';
1045 break;
1046 case 'display_name__asc':
1047 $args['orderby'] = 'display_name';
1048 $args['order'] = 'ASC';
1049 break;
1050 case 'display_name__desc':
1051 $args['orderby'] = 'display_name';
1052 $args['order'] = 'DESC';
1053 break;
1054 default:
1055 $args['orderby'] = 'posts';
1056 $args['order'] = 'DESC';
1057 break;
1058 }
1059 if( ! empty( $users_include ) ) $args['include'] = $users_include;
1060 $current_object['members'] = $this->member->get_members( $args, $current_object['items_count'] );
1061 if( isset( $users_include ) && empty( $users_include ) ) {
1062 $current_object['members'] = [];
1063 $current_object['items_count'] = 0;
1064 }
1065 } elseif( $this->current_object['template'] === 'add-topic' ) {
1066 if( $qvar0 = (int) wpfval( $current_object['qvars'], 0 ) ) {
1067 $forum = (array) $this->forum->get_forum( $qvar0 );
1068 if( ! $forum || (int) wpfval( $forum, 'is_cat' ) ) {
1069 wp_safe_redirect( wpforo_home_url( wpforo_settings_get_slug( 'add-topic' ) ), 301 );
1070 exit();
1071 }
1072 }
1073 }
1074 }
1075
1076 if( wpfval( $current_object, 'userid' ) || wpfval( $current_object, 'user_nicename' ) ) {
1077 $args = [];
1078 if( isset( $current_object['userid'] ) ) $args['userid'] = $current_object['userid'];
1079 if( isset( $current_object['user_nicename'] ) ) $args['user_nicename'] = $current_object['user_nicename'];
1080 $selected_user = $this->member->get_member( $args );
1081 if( isset( $current_object['userid'] ) && empty( $selected_user ) ) $selected_user = $this->member->get_member( [ 'user_nicename' => $current_object['userid'] ] );
1082 if( $selected_user ) {
1083 $current_object['user'] = $selected_user;
1084 $current_object['userid'] = $selected_user['userid'];
1085 $current_object['user_nicename'] = $selected_user['user_nicename'];
1086 $current_object['user_is_same_current_user'] = ! empty( $this->current_userid ) && $selected_user['userid'] === $this->current_userid;
1087
1088 if( $this->tpl->can_view_template( $this->current_object['template'], $current_object['user'] ) ) {
1089 switch( $this->current_object['template'] ) {
1090 case 'activity':
1091 $args = [
1092 'offset' => ( $current_object['paged'] - 1 ) * $this->current_object['items_per_page'],
1093 'row_count' => $this->current_object['items_per_page'],
1094 'userid' => $current_object['userid'],
1095 'orderby' => '`created` DESC, `postid` DESC',
1096 'check_private' => true,
1097 'is_first_post' => wpfval( $this->GET, 'filter' ) ? $this->GET['filter'] === 'topics' : null,
1098 ];
1099 $current_object['items_count'] = 0;
1100 $current_object['activities'] = $this->post->get_posts( $args, $current_object['items_count'] );
1101 break;
1102 case 'favored':
1103 $current_object['filter'] = strtolower( (string) wpfval( WPF()->GET, 'filter' ) );
1104 if( ! in_array( $current_object['filter'], [ 'likes', 'dislikes' ], true ) ) $current_object['filter'] = 'bookmarks';
1105 if( $current_object['filter'] === 'likes' ) {
1106 $postids = $this->reaction->get_reactions_col(
1107 'postid', [
1108 'userid' => $current_object['userid'],
1109 'type_include' => 'up',
1110 ]
1111 );
1112 } elseif( $current_object['filter'] === 'dislikes' ) {
1113 $postids = $this->reaction->get_reactions_col(
1114 'postid', [
1115 'userid' => $current_object['userid'],
1116 'type_include' => 'down',
1117 ]
1118 );
1119 } else {
1120 $postids = $this->bookmark->get_bookmarks_col(
1121 'postid', [
1122 'userid' => $current_object['userid'],
1123 'boardid' => $this->board->get_current( 'boardid' ),
1124 'status' => true,
1125 ]
1126 );
1127 }
1128
1129 if( $postids ) {
1130 $args = [
1131 'offset' => ( $current_object['paged'] - 1 ) * $this->current_object['items_per_page'],
1132 'row_count' => $this->current_object['items_per_page'],
1133 'orderby' => '`created` DESC, `postid` DESC',
1134 'check_private' => true,
1135 'include' => $postids,
1136 ];
1137 $current_object['items_count'] = 0;
1138 $current_object['favored_posts'] = $this->post->get_posts( $args, $current_object['items_count'] );
1139 } else {
1140 $current_object['items_count'] = 0;
1141 $current_object['favored_posts'] = [];
1142 }
1143 break;
1144 case 'account':
1145 $this->form->current['template'] = 'account';
1146 $this->form->current['varname'] = 'member';
1147 $this->form->current['value'] = array_merge( $current_object['user'], (array) wpfval( $_POST, 'member' ) );
1148 break;
1149 default:
1150 $this->form->current['template'] = 'profile';
1151 $this->form->current['value'] = $current_object['user'];
1152 break;
1153 }
1154 } else {
1155 if( ! $this->current_userid ) {
1156 wp_safe_redirect( wpforo_login_url() );
1157 exit();
1158 }
1159 $current_object['is_404'] = true;
1160 }
1161
1162 } else {
1163 $current_object['is_404'] = true;
1164 }
1165 }
1166
1167 if( wpfval( $current_object, 'topic_slug' ) ) {
1168 $topic = $this->topic->get_topic( [ 'slug' => $current_object['topic_slug'] ], false );
1169 if( ! empty( $topic ) ) {
1170 $topic_forumid = intval( wpfval( $topic, 'forumid' ) );
1171 $is_owner = wpforo_is_owner( $topic['userid'], $topic['email'] );
1172
1173 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 ) ) ) ) {
1174 if( ! $this->current_userid ) {
1175 wp_safe_redirect( wpforo_login_url() );
1176 exit();
1177 }
1178 $current_object['is_404'] = true;
1179 } else {
1180 $current_object['topic'] = $topic;
1181 $current_object['topicid'] = $topic['topicid'];
1182 $current_object['og_text'] = (string) wpfval( $topic, 'title' );
1183 }
1184 } else {
1185 $current_object['is_404'] = true;
1186 }
1187 }
1188
1189 if( wpfval( $current_object, 'forum_slug' ) ) {
1190 $args = ( empty( $topic ) ? [ 'slug' => $current_object['forum_slug'] ] : $topic['forumid'] );
1191 if( $forum = $this->forum->get_forum( $args ) ) {
1192 if( ! empty( $topic ) && strtolower( $current_object['forum_slug'] ) !== strtolower( $forum['slug'] ) ) {
1193 wp_safe_redirect( $this->topic->get_url( $topic, $forum ), 301 );
1194 exit();
1195 }
1196 if( $forum['is_cat'] ) $this->current_object['template'] = 'forum';
1197 $current_object['forum'] = $forum;
1198 $current_object['forumid'] = $forum['forumid'];
1199 $current_object['forum_desc'] = $forum['description'];
1200 $current_object['forum_meta_key'] = $forum['meta_key'];
1201 $current_object['forum_meta_desc'] = $forum['meta_desc'];
1202 $current_object['og_text'] = $forum['title'];
1203 $current_object['layout'] = $this->forum->get_layout( $forum );
1204
1205 if( $this->current_object['template'] === 'topic' ) {
1206 $current_object['items_per_page'] = wpforo_setting( 'topics', 'topics_per_page' );
1207 $args = [
1208 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'],
1209 'row_count' => $current_object['items_per_page'],
1210 'forumid' => $current_object['forumid'],
1211 'orderby' => 'type, modified',
1212 'order' => 'DESC',
1213 ];
1214 $args = apply_filters( 'wpforo_topic_list_args', $args );
1215 $current_object['topics'] = $this->topic->get_topics( $args, $current_object['items_count'] );
1216 }
1217 } else {
1218 $current_object['is_404'] = true;
1219 }
1220 }
1221
1222 if( in_array( $this->current_object['template'], [ 'forum', 'topic' ] ) ) {
1223 if( ! empty( $forum ) ) {
1224 $current_object['categories'] = [ $forum ];
1225 } else {
1226 $current_object['categories'] = $this->forum->get_forums( [ "type" => 'category' ] );
1227 }
1228 }
1229
1230 if( $this->current_object['template'] === 'post' && ! empty( $forum ) && ! empty( $topic ) ) {
1231 $current_object['items_per_page'] = $this->post->get_option_items_per_page( $current_object['layout'] );
1232
1233 $args = [
1234 'forumid' => $forum['forumid'],
1235 'topicid' => $topic['topicid'],
1236 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'],
1237 'row_count' => $current_object['items_per_page'],
1238 ];
1239 if( $current_object['layout'] == 4 ) {
1240 $args['parentid'] = 0;
1241 } elseif( $current_object['layout'] == 3 ) {
1242 $args['parentid'] = 0;
1243 switch( $current_object['orderby'] ) {
1244 case 'oldest':
1245 $args['orderby'] = '`is_first_post` DESC, `is_answer` DESC, `created` ASC, `postid` ASC';
1246 break;
1247 case 'newest':
1248 $args['orderby'] = '`is_first_post` DESC, `is_answer` DESC, `modified` DESC, `postid` DESC';
1249 break;
1250 default:
1251 $args['orderby'] = '`is_first_post` DESC, `is_answer` DESC, `votes` DESC, `created` ASC, `postid` ASC';
1252 break;
1253 }
1254 }
1255 if( $this->post->get_option_union_first_post( $current_object['layout'] ) ) $args['union_first_post'] = true;
1256 $args = apply_filters( 'wpforo_post_list_args', $args );
1257 $current_object['posts'] = $this->post->get_posts( $args, $current_object['items_count'] );
1258 }
1259
1260 $this->current_object = wpforo_parse_args( $current_object, $this->current_object );
1261
1262 $this->current_object = apply_filters( 'wpforo_after_init_current_object', $this->current_object, $wpf_url_parse );
1263
1264 if( $this->current_object['template'] ) {
1265 /**
1266 * redirect not logged-in users to login page when that user no access to this page
1267 */
1268 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'] ) ) ) ) {
1269 wp_safe_redirect( wpforo_login_url() );
1270 exit();
1271 }
1272
1273 if( $this->current_object['template'] === 'cantlogin' ) {
1274 if( $this->current_userid ) {
1275 if( $this->current_user['status'] !== 'active' ){
1276 WPF()->ram_cache->set( 'USER_LOGIN_REFERER', WPF()->current_user_login );
1277 wp_logout();
1278 }else{
1279 wp_safe_redirect( wpforo_home_url() );
1280 }
1281 } else {
1282 wp_safe_redirect( wpforo_login_url() );
1283 exit();
1284 }
1285 }
1286
1287 /**
1288 * redirect to the first page when paged var is greater items_count
1289 */
1290 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'] ) {
1291 wp_safe_redirect( $this->strip_url_paged_var( $this->current_url ), 301 );
1292 exit();
1293 }
1294 } else {
1295 $this->current_object['is_404'] = true;
1296 }
1297 }
1298
1299 public function is_installed() {
1300 return WPFORO_VERSION === wpforo_get_option( 'version', null, false );
1301 }
1302
1303 public function can_use_this_slug( $slug ) {
1304 $return = ! in_array( $slug, $this->settings->slugs, true ) && ! in_array( $slug, array_keys( $this->settings->slugs ), true );
1305
1306 return apply_filters( 'wpforo_can_use_this_slug', $return, $slug );
1307 }
1308 }
1309