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

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