PluginProbe
wpForo Forum / 2.0.9
wpForo Forum v2.0.9
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.0.9, at wpforo.php

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