db = $wpdb; } public function is_db_mysql8() { if( preg_match( '#([\d.]+)-MariaDB#iu', (string) $this->db->get_var( "SELECT VERSION()" ), $match ) ) { $use_mysql8 = version_compare( $match[1], '10.2.6', '>=' ); } else { $use_mysql8 = version_compare( $this->db->db_version(), '8.0.0', '>=' ); } return apply_filters( 'wpforo_use_mysql8', $use_mysql8 ); } private function __construct() { $this->init_db(); $this->init_hooks(); } public function generate_prefix( $boardid ) { $boardid = intval( $boardid ); return $this->base_prefix . ( $boardid ? $boardid . '_' : '' ); } private function init_prefix() { $boardid = $this->board->get_current( 'boardid' ); $this->prefix = $this->generate_prefix( $boardid ); } public function change_board( $args = [] ) { if( is_null( $this->board ) ) return; do_action( 'wpforo_before_change_board', $args ); $boardid = $this->board->get_current( 'boardid' ); $is_inited = (bool) wpfval( $this->board->is_inited, $boardid ); $this->board->init_current( $args ); if( ! $is_inited || $boardid !== $this->board->get_current( 'boardid' ) ) { $this->ram_cache->reset(); $this->init_prefix(); $this->init_tables(); $this->init_folders(); $this->init_options(); do_action( 'wpforo_after_change_board', $args ); } } private function init_base_classes() { $this->requires(); $this->init_defaults(); $this->reset_current_object(); $this->init_base_tables(); $this->init_folders(); do_action( 'wpforo_before_init_base_classes' ); $this->settings = new Settings(); $this->tpl = new Template(); $this->ram_cache = new RamCache(); $this->cache = new Cache(); $this->action = new Actions(); $this->board = new Boards(); $this->usergroup = new UserGroups(); $this->member = new Members(); $this->perm = new Permissions(); $this->notice = new Notices(); $this->moderation = new Moderation(); $this->phrase = new Phrases(); $this->blocks = new Blocks(); do_action( 'wpforo_after_init_base_classes' ); } private function init_classes() { do_action( 'wpforo_before_init_classes' ); $this->activity = new Activity(); $this->api = new API(); // AIClient: Initialize globally for both admin and front-end features // (semantic search, antispam, auto-translation, etc.) $this->ai_client = new AIClient(); // AIChatbot: AI-powered chat functionality in AI Assistant widget $this->ai_chatbot = new AIChatbot(); // VectorStorageManager: Unified abstraction for vector storage (local/cloud) $this->vector_storage = new VectorStorageManager(); // TaskManager: Initialize for AI task scheduling and execution $this->task_manager = new TaskManager(); // AIContentModeration: Central class for AI-powered content moderation $this->ai_content_moderation = AIContentModeration::get_instance(); // AILogs: Logging of all AI actions for admin visibility $this->ai_logs = new AILogs(); // AIWordPressIndexer: WordPress content type indexing for AI search $this->ai_wp_indexer = new AIWordPressIndexer(); $this->feed = new Feed(); $this->form = new Forms(); $this->forum = new Forums(); $this->log = new Logs(); $this->postmeta = new PostMeta(); $this->post = new Posts(); $this->seo = new SEO(); $this->topic = new Topics(); $this->reaction = new Reactions(); $this->bookmark = new Bookmarks(); $this->sbscrb = new Subscriptions(); $this->email_queue = new EmailQueue(); if( wpforo_is_module_enabled( 'revisions' ) ) $this->revision = new Revisions(); do_action( 'wpforo_after_init_classes' ); } public function set_locale( $locale ) { $this->locale = $locale; do_action( 'wpforo_after_set_locale', $locale ); } private function init_hooks() { add_action( 'wpforo_after_init_folders', function( $folders ) { $this->create_folders( $folders ); }, 9999 ); add_action( 'after_setup_theme', function() { do_action( 'wpforo_before_base_init' ); $this->init_base_classes(); if( ! $this->is_installed() ) $this->init(); }, 0 ); add_action( 'change_locale', [ $this, 'set_locale' ] ); add_action( 'init', function() { $this->set_locale( get_locale() ); } ); add_action( 'widgets_init', function() { $boards = $this->board->get_boards( [ 'status' => true ] ); foreach( $boards as $board ) { register_sidebar( [ 'id' => sprintf( 'wpforo_%1$ssidebar', $board['boardid'] ? $board['boardid'] . '_' : '' ), 'name' => __( 'wpForo Sidebar', 'wpforo' ) . ' - ( ' . $board['title'] . ' )', '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' ), 'before_widget' => '', 'before_title' => '

', 'after_title' => '

', ] ); } register_widget( 'wpforo\widgets\Forums' ); register_widget( 'wpforo\widgets\Profile' ); register_widget( 'wpforo\widgets\Search' ); register_widget( 'wpforo\widgets\OnlineMembers' ); register_widget( 'wpforo\widgets\RecentTopics' ); register_widget( 'wpforo\widgets\RecentPosts' ); register_widget( 'wpforo\widgets\Tags' ); } ); add_filter( 'plugin_locale', function( $locale, $domain ) { if( $domain === 'wpforo' && defined( 'DOING_AJAX' ) && DOING_AJAX ) $locale = $this->locale; return $locale; }, 10, 2 ); add_action( 'wpforo_after_init_classes', function() { if( wpforo_setting( 'email', 'disable_new_user_admin_notification' ) ) { remove_action( 'after_password_reset', 'wp_password_change_notification' ); remove_action( 'register_new_user', 'wp_send_new_user_notifications' ); add_action( 'register_new_user', 'wpforo_send_new_user_notifications' ); remove_action( 'edit_user_created_user', 'wp_send_new_user_notifications' ); add_action( 'edit_user_created_user', 'wpforo_send_new_user_notifications', 10, 2 ); remove_action( 'network_site_new_created_user', 'wp_send_new_user_notifications' ); add_action( 'network_site_new_created_user', 'wpforo_send_new_user_notifications' ); remove_action( 'network_site_users_created_user', 'wp_send_new_user_notifications' ); add_action( 'network_site_new_created_user', 'wpforo_send_new_user_notifications' ); remove_action( 'network_user_new_created_user', 'wp_send_new_user_notifications' ); add_action( 'network_user_new_created_user', 'wpforo_send_new_user_notifications' ); } } ); // WP Cron: Ensure classes are initialized early for cron hook callbacks if ( wp_doing_cron() || isset( $_GET['doing_wp_cron'] ) ) { add_action( 'init', [ $this, 'init' ], 1 ); // Priority 1 - before cron runs } elseif( is_admin() || strpos( (string) $_SERVER['REQUEST_URI'], '/peepsoajax/' ) === 0 || preg_match( '#^/?(?:([^\s/?&=<>:\'\"*\\\|]*/)(?1)*)?[^\s/?&=<>:\'\"*\\\|]+\.(?:php|js|css|jpe?g|png|gif|bmp|webp|svg|tiff)/?(?:\?[^/]*)?$#iu', (string) $_SERVER['REQUEST_URI'] ) ) { add_action( 'init', [ $this, 'init' ], 99 ); add_action( 'admin_init', [ $this, 'admin_init' ] ); } elseif( strpos( (string) $_SERVER['REQUEST_URI'], '/wp-json/' ) !== false ) { add_filter( 'rest_authentication_errors', function( $r ) { $this->init(); return $r; }, 9999 ); } else { add_action( 'wp', [ $this, 'init' ], 99 ); } add_action( 'switch_blog', [ $this, 'after_switch_blog' ], 10, 2 ); add_action( 'wpforo_before_init', [ $this, 'change_board' ] ); add_action( 'wpforo_after_init_current_url', [ $this, 'change_board' ] ); } public function after_switch_blog( $new_blog_id, $prev_blog_id ) { if( intval( $new_blog_id ) !== intval( $prev_blog_id ) ) { $this->init_base_tables(); $this->init_tables(); $this->init_folders(); } } private function init_base_tables() { $this->db->query( "SET SESSION group_concat_max_len = 1000000" ); $blog_id = apply_filters( 'wpforo_current_blog_id', 0 ); $this->tables = new stdClass; if( ! $blog_id ) $blog_id = $this->db->blogid; $this->blog_prefix = $this->db->get_blog_prefix( $blog_id ); $this->_base_tables = apply_filters( 'wpforo_init_base_tables', $this->_base_tables ); foreach( $this->_base_tables as $table ) $this->tables->$table = $this->fix_table_name( $table ); } private function init_tables() { $this->_tables = apply_filters( 'wpforo_init_tables', $this->_tables ); foreach( $this->_tables as $table ) $this->tables->$table = $this->fix_table_name( $table ); } public function get_active_boards_tables( $basename ) { $tables = []; if( $boardids = $this->board->get_active_boardids() ) { foreach( $boardids as $boardid ) $tables[] = $this->fix_table_name( $basename, $this->generate_prefix( $boardid ) ); } return array_unique( $tables ); } /** * @param string $basename * * @return string */ public function fix_table_name( $basename, $prefix = null ) { return $this->blog_prefix . ( in_array( $basename, $this->_base_tables, true ) ? $this->base_prefix : ( is_null( $prefix ) ? $this->prefix : $prefix ) ) . $basename; } public function fix_dir_sep( $dir ) { $dir = str_replace( [ '/', '\\', '\\\\' ], DIRECTORY_SEPARATOR, $dir ); return rtrim( trim( (string) $dir ), DIRECTORY_SEPARATOR ); } public function fix_url_sep( $url ) { return trim( str_replace( [ '/', '\\', '\\\\' ], '/', (string) $url ) ); } private function init_folders() { $this->_folders = apply_filters( 'wpforo_init_folders', $this->_folders ); $boardid = ( is_callable( [ $this->board, 'get_current' ] ) ? $this->board->get_current( 'boardid' ) : 0 ); $upload_dir = wp_get_upload_dir(); // In many cases people leave the website URL protocol as http, but website works with https // In this case colors.css and phrases.js are not loaded because of http blocking by browser $upload_dir['baseurl'] = is_ssl() ? str_replace( 'http://', 'https://', $upload_dir['baseurl'] ) : $upload_dir['baseurl']; $this->folders['wp_upload'] = [ 'dir' => $this->fix_dir_sep( $upload_dir['basedir'] ), 'url' => $this->fix_url_sep( $upload_dir['baseurl'] ), ]; $this->folders['wp_upload']['url//'] = preg_replace( '#^https?:#i', '', (string) $this->folders['wp_upload']['url'] ); $this->folders['upload'] = [ 'dir' => $this->folders['wp_upload']['dir'] . DIRECTORY_SEPARATOR . "wpforo" . ( $boardid ? '_' . $boardid : '' ), 'url' => $this->folders['wp_upload']['url'] . "/wpforo" . ( $boardid ? '_' . $boardid : '' ), 'url//' => $this->folders['wp_upload']['url//'] . "/wpforo" . ( $boardid ? '_' . $boardid : '' ), ]; foreach( $this->_folders as $folder ) { $this->folders[ $folder ] = [ 'dir' => $this->folders['upload']['dir'] . DIRECTORY_SEPARATOR . trim( $this->fix_dir_sep( (string) $folder ), DIRECTORY_SEPARATOR ), 'url' => $this->folders['upload']['url'] . "/" . trim( $this->fix_url_sep( (string) $folder ), '/' ), 'url//' => $this->folders['upload']['url//'] . "/" . trim( $this->fix_url_sep( (string) $folder ), '/' ), ]; } $this->folders = apply_filters( 'wpforo_working_folders', $this->folders ); do_action( 'wpforo_after_init_folders', $this->folders ); } private function create_folders( array $folders = [] ): void { if( ! $folders ) $folders = WPF()->folders; foreach( $folders as $folder ) { $dir = ( is_scalar( $folder ) ? $folder : ( array_key_exists( 'dir', $folder ) ? (string) $folder['dir'] : '' ) ); if( $dir && ! is_dir( $dir ) ) { if( wp_mkdir_p( $dir ) ) { wpforo_write_file( "$dir/index.html", "" ); wpforo_write_file( "$dir/robots.txt", "User-agent: *\nDisallow: /" ); } } } } private function requires() { require_once WPFORO_DIR . '/includes/functions.php'; require_once WPFORO_DIR . '/includes/functions-template.php'; require_once WPFORO_DIR . '/includes/hooks.php'; require_once WPFORO_DIR . '/includes/installation.php'; require_once WPFORO_DIR . '/integrations/functions.php'; if( wpforo_is_admin() ) require_once WPFORO_DIR . '/admin/index.php'; } public function admin_init() { if( wpforo_is_admin() ) { $this->change_board(); $this->check_issues(); if( strpos( wpforo_get_request_uri(), 'user-new.php' ) === false ) { if( ! $this->member->get_groupid( $this->current_userid ) ) { $this->member->synchronize_user( $this->current_userid ); } } if( ! $this->usergroup->can_manage_forum() && wpforo_current_user_is( 'admin' ) ) { $this->member->set_groupid( $this->current_userid, 1 ); } } } public function check_issues() { //Make sure all users profiles are created if( $this->is_installed() ) { if( apply_filters( 'wpforo_profile_synchronization_notice', true ) ) { if( is_multisite() ) { $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 . "` )"; } else { $sql = "SELECT COUNT(`ID`) as user_id FROM `" . WPF()->db->users . "` WHERE `ID` NOT IN( SELECT `userid` FROM `" . WPF()->tables->profiles . "` )"; } if( (int) $this->db->get_var( $sql ) ) add_action( 'admin_notices', 'wpforo_profile_notice', 10 ); } } //Make sure tables structures are correct for current version $wpforo_version_db = wpforo_get_option( 'version_db', null, false ); if( ! $wpforo_version_db || version_compare( $wpforo_version_db, WPFORO_VERSION, '<' ) || wpforo_setting( 'general', 'debug_mode' ) ) { if( 'tables' !== wpfval( $_GET, 'view' ) ) { $db_note = false; $problems = wpforo_database_check(); if( ! empty( $problems ) ) { foreach( $problems as $key => $problem ) { if( wpfval( $problem, 'fields' ) ) $db_note = true; if( wpfval( $problem, 'exists' ) ) $db_note = true; if( $key === 'data' ) $db_note = true; } if( $db_note ) { add_action( 'admin_notices', 'wpforo_database_notice', 10 ); } } else { wpforo_update_option( 'version_db', WPFORO_VERSION ); } } } //Check cache plugins $not_excluded_plugins = WPF()->cache->cache_plugins_status(); if( ! empty( $not_excluded_plugins ) ) { add_action( 'admin_notices', 'wpforo_cache_information', 10 ); } } public function init() { do_action( 'wpforo_before_init' ); $this->init_classes(); $this->init_current_url(); do_action( 'wpforo_core_inited' ); $this->init_current_object(); do_action( 'wpforo_after_init' ); } public function shortcode_atts_to_url( $atts ) { if( is_null( $this->forum ) ) $this->init_classes(); $url = wpforo_home_url(); $args = shortcode_atts( [ 'boardid' => 0, 'item' => 'forum', 'id' => 0, 'slug' => '', ], (array) $atts ); WPF()->change_board( $args['boardid'] ); if( $args['item'] === 'profile' && ! $args['id'] ) $args['id'] = $this->current_userid; if( $args['item'] === 'add-topic' ) { $forum = $this->forum->get_forum( ( $args['slug'] ?: $args['id'] ) ); $forumid = (int) wpfval( $forum, 'is_cat' ) ? 0 : (int) wpfval( $forum, 'forumid' ); $url = wpforo_home_url( wpforo_settings_get_slug( 'add-topic' ) . '/' . $forumid ); } elseif( $args['item'] === 'recent' ) { $url = wpforo_settings_get_slug( 'recent' ) . '/'; if( trim( (string) $args['slug'] ) ) $url .= '?view=' . wpforo_settings_get_slug( $args['slug'] ); $url = wpforo_home_url( $url ); } elseif( $args['item'] === 'members' ) { $url = wpforo_members_url(); } elseif( $args['id'] || $args['slug'] ) { $getid = ( $args['slug'] ?: $args['id'] ); if( $args['item'] === 'topic' ) { $url = $this->topic->get_url( $getid ); } elseif( $args['item'] === 'profile' ) { $url = $this->member->get_profile_url( $getid ); } elseif( $args['item'] === 'account' ) { $url = $this->member->get_profile_url( $getid, 'account' ); } elseif( $args['item'] === 'activity' ) { $url = $this->member->get_profile_url( $getid, 'activity' ); } elseif( $args['item'] === 'favored' ) { $url = $this->member->get_profile_url( $getid, 'favored' ); } elseif( $args['item'] === 'subscriptions' ) { $url = $this->member->get_profile_url( $getid, 'subscriptions' ); } elseif( $args['item'] === 'messages' ) { $url = $this->member->get_profile_url( $getid, 'messages' ); } else { $url = $this->forum->get_forum_url( $getid ); } } elseif( $args['item'] === 'login' ) { $url = wpforo_login_url(); } elseif( $args['item'] === 'register' ) { $url = wpforo_register_url(); } elseif( $args['item'] === 'lostpassword' ) { $url = wpforo_lostpassword_url(); } return $url; } public function init_current_url( $atts = [] ) { if( is_null( $this->post ) ) $this->init_classes(); if( is_scalar( $atts ) ) { $url = $atts; $atts = []; } else { $url = wpforo_get_request_uri(); } if( $atts || is_wpforo_shortcode_page( $url ) ) { if( $atts || ( $atts = get_wpforo_shortcode_atts( '', $url ) ) ) { $url = $this->shortcode_atts_to_url( $atts ); } else { $url = wpforo_home_url(); } } if( is_wpforo_url( $url ) && preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'postid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $matches ) ) { $post_url = $this->post->get_full_url( $matches[1] ); if( $post_url !== wpforo_home_url() ) { $url = $post_url; $this->canonical_url = $this->post->get_url( $matches[1] ); } } elseif( is_wpforo_url( $url ) && preg_match( '#/' . preg_quote( wpforo_settings_get_slug( 'topicid' ) ) . '/(\d+)/?$#isu', strtok( $url, '?' ), $matches ) ) { $topic_url = $this->topic->get_full_url( $matches[1] ); if( $topic_url !== wpforo_home_url() ) { $url = $topic_url; $this->canonical_url = $this->topic->get_url( $matches[1] ); } } if( function_exists( 'pll_default_language' ) ) { $qvar = wpforo_get_url_query_vars_str( $url ); $qvar = preg_replace( '#^' . preg_quote( pll_default_language() ) . '/#', '', $qvar ); $url = $this->user_trailingslashit( home_url( $qvar ) ); } $url = wpforo_fix_url( $url ); $url = preg_replace( '#\#[^/?&]*$#iu', '', $url ); parse_str( (string) parse_url( $url, PHP_URL_QUERY ), $get ); $get = array_merge( (array) $get, $_GET ); $get = wp_unslash( $get ); if( ! $this->canonical_url ) $this->canonical_url = $this->current_url; $this->current_url = apply_filters( 'wpforo_init_current_url', $url ); $this->GET = apply_filters( 'wpforo_init_current_url_GET', $get ); if( ! $this->canonical_url ) $this->canonical_url = $this->current_url; if( strpos( $this->canonical_url, '?wpfin=tag' ) === false && strpos( $this->canonical_url, '?view=' ) === false ) { $this->canonical_url = preg_replace( '#\?.*$#isu', '', $this->canonical_url ); } $this->canonical_url = apply_filters( 'wpforo_init_canonical_url', $this->canonical_url ); do_action( 'wpforo_after_init_current_url', $atts ); } private function init_defaults() { $this->default = new stdClass; $this->default->current_object = [ 'route' => '', 'template' => '', 'qvars' => [], 'args' => [], 'layout' => 1, 'og_text' => '', 'paged' => 1, 'items_count' => 0, 'items_per_page' => 15, 'is_404' => false, 'user_is_same_current_user' => false, 'orderby' => null, 'members' => [], 'categories' => [], 'topics' => [], 'posts' => [], 'user' => [], 'userid' => 0, 'user_nicename' => '', 'forum' => [], 'forumid' => 0, 'forum_slug' => '', 'forum_desc' => '', 'forum_meta_key' => '', 'forum_meta_desc' => '', 'topic' => [], 'topicid' => 0, 'topic_slug' => '', 'tags' => [], 'load_tinymce' => false, ]; $this->default->tools_cleanup = [ 'user_reg_days_ago' => 7, 'auto_cleanup_users' => 0, 'usergroup' => [ 1 => '0', 5 => '0', 2 => '1', 3 => '0' ], ]; $this->default->tools_misc = [ 'admin_note' => '', 'admin_note_groups' => [ 1, 2, 3, 4, 5 ], 'admin_note_pages' => [ 'forum' ], ]; $this->default->stats = [ 'forums' => 0, 'topics' => 0, 'posts' => 0, 'members' => 0, 'online_members_count' => 0, 'last_post_title' => '', 'last_post_url' => '', 'newest_member' => [], 'newest_member_dname' => '', 'newest_member_profile_url' => '', ]; $this->default->dissmissed = [ 'recaptcha_backend_note' => 0, 'recaptcha_note' => 0, 'addons_css_update' => 0, ]; } private function reset_current_object() { $this->current_object = $this->default->current_object; } private function init_options() { $this->tools_cleanup = wpforo_get_option( 'tools_cleanup', $this->default->tools_cleanup ); $this->tools_misc = wpforo_get_option( 'tools_misc', $this->default->tools_misc ); $this->dissmissed = wpforo_get_option( 'dissmissed', $this->default->dissmissed ); } public function can_use_trailing_slashes() { return '/' === substr( (string) get_option( 'permalink_structure', '' ), - 1, 1 ); } public function user_trailingslashit( $url ) { $rtrimed_url = ''; $url_append_vars = ''; if( preg_match( '#^(.+?)(/?[?&].*)?$#isu', $url, $match ) ) { if( wpfval( $match, 1 ) ) $rtrimed_url = rtrim( $match[1], '/\\' ); if( wpfval( $match, 2 ) ) $url_append_vars = '?' . trim( $match[2], '?&/\\' ); if( $rtrimed_url ) { $home_url = rtrim( preg_replace( '#/?\?.*$#isu', '', home_url() ), '/\\' ); if( $rtrimed_url == $home_url ) { $url = $rtrimed_url . '/'; } else { $url = $rtrimed_url . ( wpforo_ram_get( [ $this, 'can_use_trailing_slashes' ] ) ? '/' : '' ); } } } return $url . $url_append_vars; } public function strip_url_paged_var( $url ) { $patterns = [ '#/' . preg_quote( wpforo_settings_get_slug( 'paged' ) ) . '/?\d*/?#isu', '#[&?]wpfpaged=\d*#iu', ]; $url = preg_replace( $patterns, '', (string) $url ); return $this->user_trailingslashit( $url ); } public function statistic_cache_clean() { $this->db->query( "DELETE FROM `" . $this->db->options . "` WHERE `option_name` REGEXP '^" . wpforo_prefix( 'stat_[0-9]+' ) . "'" ); } public function statistic( $mode = 'get', $template = 'all' ) { $key = 'stat_' . $this->current_user_groupid; if( $mode === 'get' ) { if( $cached_stat = wpforo_get_option( $key, [], false ) ) { $cached_stat['online_members_count'] = $this->member->online_members_count(); if( wpfkey( $cached_stat, 'forums' ) && wpfkey( $cached_stat, 'topics' ) && wpfkey( $cached_stat, 'posts' ) ) { return wpforo_array_args_cast_and_merge( $cached_stat, $this->default->stats ); } } } if( $mode === 'get' || $template === 'all' ) { $stats['forums'] = $this->forum->get_count( [ 'is_cat' => 0 ] ); $stats['topics'] = $this->topic->get_count(); $stats['posts'] = $this->post->get_count(); $member_status = [ 'p.`status`' => $this->member->get_inlist_enabled_statuses() ]; $stats['members'] = $this->member->get_count( $member_status ); $stats['online_members_count'] = $this->member->online_members_count(); $row_count = apply_filters( 'wpforo_get_statistic_row_count', 1 ); $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => $row_count, 'private' => 0, 'status' => 0, 'permgroup' => 4 ] ); $first = key( $posts ); if( !is_null( $first ) && ! empty( $posts[ $first ] ) && $this->perm->forum_can( 'vf', $posts[ $first ]['forumid'] ) ) { $stats['last_post_title'] = $posts[ $first ]['title']; $stats['last_post_url'] = $this->post->get_url( $posts[ $first ]['last_post'] ); } $newest_member = $this->member->get_newest_member(); if( ! empty( $newest_member ) ) { $stats['newest_member'] = $newest_member; $stats['newest_member_dname'] = wpforo_user_dname( $newest_member ); $stats['newest_member_profile_url'] = $newest_member['profile_url']; } } else { $stats = wpforo_get_option( $key, $this->default->stats, false ); switch( $template ) { case 'forum': $stats['forums'] = $this->forum->get_count( [ 'is_cat' => 0 ] ); break; case 'topic': $stats['topics'] = $this->topic->get_count(); $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] ); if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) { $stats['last_post_title'] = $posts[0]['title']; $stats['last_post_url'] = $this->post->get_url( $posts[0]['last_post'] ); } break; case 'post': $stats['posts'] = $this->post->get_count(); $posts = $this->topic->get_topics( [ 'orderby' => 'modified', 'order' => 'DESC', 'row_count' => 1 ] ); if( isset( $posts[0] ) && ! empty( $posts[0] ) && $this->perm->forum_can( 'vf', $posts[0]['forumid'] ) ) { $stats['last_post_title'] = $posts[0]['title']; $stats['last_post_url'] = $this->post->get_url( $posts[0]['last_post'] ); } break; case 'user': //$member_status = [ 'p.`status`' => $this->member->get_inlist_enabled_statuses() ]; //$stats['members'] = $this->member->get_count( $member_status ); $stats['members'] = $this->member->get_count(); $stats['online_members_count'] = $this->member->online_members_count(); $newest_member = $this->member->get_newest_member( false ); if( ! empty( $newest_member ) ) { $stats['newest_member'] = $newest_member; $stats['newest_member_dname'] = wpforo_user_dname( $newest_member ); $stats['newest_member_profile_url'] = $newest_member['profile_url']; } break; } } $stats = apply_filters( 'wpforo_get_statistic_array_filter', $stats ); $stats = wpforo_array_args_cast_and_merge( $stats, $this->default->stats ); wpforo_update_option( $key, $stats ); return $stats; } public function init_current_object() { $this->reset_current_object(); $this->current_object['items_per_page'] = $this->post->get_option_items_per_page(); $url = $this->current_url; $get = $this->GET; if( ! is_wpforo_page( $url ) ) return; $current_url = wpforo_get_url_query_vars_str( $url ); $current_object = []; if( wpfkey( $get, 'wpfs' ) || wpfval( $get, 'foro' ) === 'search' ) $this->current_object['template'] = 'search'; if( wpfval( $get, 'wpforo' ) || wpfval( $get, 'foro' ) ) { $request = ( wpfval( $get, 'wpforo' ) ) ? wpfval( $get, 'wpforo' ) : wpfval( $get, 'foro' ); if( $request === 'page' ) $this->current_object['template'] = 'page'; } $template_key = ''; $wpf_url = preg_replace( '#/?\?.*$#isu', '', $current_url ); $wpf_url_parse = array_values( array_filter( explode( '/', trim( (string) $wpf_url, '/' ) ) ) ); if( array_key_exists( 0, $wpf_url_parse ) && in_array( $wpf_url_parse[0], $this->board->routes ) ) { $this->current_object['route'] = $wpf_url_parse[0]; unset( $wpf_url_parse[0] ); if( in_array( $this->current_object['route'], $this->board->base_routes, true ) ) { $this->current_object['template'] = ( $template_key = wpforo_settings_get_slug_key( $this->current_object['route'] ) ) !== 'member' ? $template_key : ''; $current_object['qvars'] = $wpf_url_parse; $current_object['qvars'] = array_values( $current_object['qvars'] ); if( $this->current_object['template'] === 'register' ) { $this->form->current['template'] = 'register'; $this->form->current['value'] = array_merge( (array) wpfval( $this->form->current, 'value' ), (array) wpfval( $_POST, 'wpfreg' ), (array) wpfval( $_POST, 'data' ) ); $this->form->current['value']['user_login'] = sanitize_user( (string) wpfval( $_POST, 'wpfreg', 'user_login' ) ); $this->form->current['value']['user_email'] = sanitize_email( (string) wpfval( $_POST, 'wpfreg', 'user_email' ) ); $this->form->current['varname'] = 'wpfreg'; } elseif( $this->current_object['template'] === 'logout' && $this->current_userid ) { $this->action->logout(); } } if( $this->current_userid && in_array( $this->current_object['template'], [ 'register', 'login', 'lostpassword' ], true ) && ! wpforo_is_admin() ) wpforo_redirect_to(); } $wpf_url_parse = array_reverse( $wpf_url_parse ); if( in_array( wpforo_settings_get_slug( 'paged' ), $wpf_url_parse ) ) { foreach( $wpf_url_parse as $key => $value ) { if( $value === wpforo_settings_get_slug( 'paged' ) ) { unset( $wpf_url_parse[ $key ] ); break; } if( is_numeric( $value ) ) $paged = intval( $value ); unset( $wpf_url_parse[ $key ] ); } } if( $_paged = intval( wpfval( $get, 'wpfpaged' ) ) ) $paged = $_paged; $current_object['paged'] = ( isset( $paged ) && $paged > 0 ) ? $paged : 1; $current_object['orderby'] = wpfval( $get, 'orderby' ); $wpf_url_parse = array_values( $wpf_url_parse ); if( ! $this->current_object['template'] ) { $current_object = apply_filters( 'wpforo_before_init_current_object', $current_object, $wpf_url_parse ); if( wpfkey( $current_object, 'template' ) ) $this->current_object['template'] = (string) wpfval( $current_object, 'template' ); } if( ! $this->current_object['template'] ) { $templates = $template_key === 'member' ? $this->tpl->get_member_templates_list() : $this->tpl->get_templates_list(); if( $templates ) { if( $template_key === 'member' ) { if( count( $wpf_url_parse ) > 1 ) { $nickname = end( $wpf_url_parse ); $profile_route = prev( $wpf_url_parse ); array_pop( $wpf_url_parse ); array_pop( $wpf_url_parse ); array_push( $wpf_url_parse, $nickname, $profile_route ); } else { if( ! in_array( end( $wpf_url_parse ), array_map( 'wpforo_settings_get_slug', $templates ) ) ) $wpf_url_parse[] = wpforo_settings_get_slug( 'profile' ); } } $__slug = end( $wpf_url_parse ); foreach( $templates as $template ) { if( $__slug === wpforo_settings_get_slug( $template ) ) { $this->current_object['template'] = $template; $current_object['qvars'] = $wpf_url_parse; array_pop( $current_object['qvars'] ); $current_object['qvars'] = array_reverse( $current_object['qvars'] ); break; } } if( $template_key === 'member' ) { if( ! $this->current_object['template'] && ! $wpf_url_parse ) { if( $this->current_userid ) { $this->current_object['template'] = 'profile'; } else { wp_safe_redirect( wpforo_login_url() ); exit(); } } elseif( ! wpforo_is_member_template( $this->current_object['template'] ) ) { $this->current_object['template'] = ''; $current_object['qvars'] = []; } } } } if( ! $this->current_object['template'] ) { $this->current_object['template'] = 'forum'; $this->form->current['varname'] = 'thread'; if( isset( $wpf_url_parse[0] ) ) { if( isset( $wpf_url_parse[1] ) ) { $current_object['topic_slug'] = $wpf_url_parse[0]; $current_object['forum_slug'] = $wpf_url_parse[1]; $this->current_object['template'] = 'post'; $this->form->current['varname'] = 'post'; } else { $current_object['forum_slug'] = $wpf_url_parse[0]; $this->current_object['template'] = 'topic'; $this->form->current['varname'] = 'thread'; } } } $current_object = apply_filters( 'wpforo_after_init_current_template', $current_object, $wpf_url_parse, $get ); if( wpfkey( $current_object, 'template' ) ) $this->current_object['template'] = (string) wpfval( $current_object, 'template' ); if( $this->current_object['template'] ) { if( wpforo_is_member_template( $this->current_object['template'] ) ) { if( ! wpfval( $current_object, 'userid' ) && ! wpfval( $current_object, 'user_nicename' ) ) { if( $qvar0 = wpfval( $current_object['qvars'], 0 ) ) { if( wpforo_setting( 'profiles', 'url_structure' ) === 'id' ) { $current_object['userid'] = $qvar0; } else { $current_object['user_nicename'] = $qvar0; } } else { if( $this->current_userid ) { $current_object['userid'] = $this->current_userid; } else { wp_safe_redirect( wpforo_login_url() ); exit(); } } } // redirect old type of member urls to new one if( $template_key !== 'member' ) { if( count( $current_object['qvars'] ) === 1 ) { $redirect = wpforo_url( array_shift( $current_object['qvars'] ) . ( $this->current_object['template'] !== 'profile' ? '/' . wpforo_settings_get_slug( $this->current_object['template'] ) : '' ), 'member' ); } else { $redirect = wpforo_url( array_shift( $current_object['qvars'] ) . '/' . wpforo_settings_get_slug( $this->current_object['template'] ) . '/' . implode( '/', $current_object['qvars'] ), 'member' ); } wp_safe_redirect( $redirect ); exit(); } // redirection } elseif( $this->current_object['template'] === 'search' ) { $args = [ 'needle' => sanitize_text_field( wpfval( $get, 'wpfs' ) ), 'type' => sanitize_text_field( wpfval( $get, 'wpfin' ) ), 'date_period' => intval( wpfval( $get, 'wpfd' ) ), 'forumids' => (array) wpfval( $get, 'wpff' ), 'offset' => ( $current_object['paged'] - 1 ) * $this->current_object['items_per_page'], 'row_count' => $this->current_object['items_per_page'], 'orderby' => 'relevancy', 'order' => 'desc', 'postids' => [], ]; if( ! empty( $get['wpfob'] ) ) { $args['orderby'] = wpforo_sanitize_orderby( $get['wpfob'], 'search', 'relevancy' ); } elseif( in_array( wpfval( $args, 'type' ), [ 'tag', 'user-posts', 'user-topics' ], true ) ) { $args['orderby'] = 'date'; } $wpfo = strtolower( (string) wpfval( $get, 'wpfo' ) ); if( in_array( $wpfo, [ 'asc', 'desc' ], true ) ) $args['order'] = $wpfo; $sdata = array_filter( (array) wpfval( $get, 'data' ) ); $args['postids'] = $this->postmeta->search( $sdata ); $current_object['args'] = $args; if( $sdata && ! $args['postids'] ) { $current_object['items_count'] = 0; $current_object['posts'] = []; } else { $current_object['posts'] = $this->post->search( $args, $current_object['items_count'] ); } } elseif( $this->current_object['template'] === 'recent' ) { $args = []; $view = false; $current_object['items_count'] = 0; if( ! empty( WPF()->GET['view'] ) ) $view = sanitize_title( WPF()->GET['view'] ); if( ! empty( WPF()->GET['wpff'] ) ) $args['forumid'] = intval( WPF()->GET['wpff'] ); if( ! empty( WPF()->GET['prefixid'] ) ) { $args['prefixid'] = intval( WPF()->GET['prefixid'] ); } $type = ( $view && $view !== 'unapproved' ? 'topics' : wpforo_setting( 'topics', 'recent_posts_type' ) ); if( $view === 'unapproved' ) $type = 'posts'; if( $view === 'prefix' ) $type = 'topics'; if( ! WPF()->current_userid || ! WPF()->usergroup->can( 'aum' ) ) { $args['private'] = 0; $args['status'] = 0; } $days = apply_filters( 'wpforo_recent_posts_limit', 30 ); $end_date = time() - ( intval( $days ) * 24 * 60 * 60 ); if( $type === 'topics' ) { $current_object['items_per_page'] = wpforo_setting( 'topics', 'topics_per_page' ); if( wpfval( $args, 'prefixid' ) ) $args['prefix'] = (int) wpfval( $args, 'prefixid' ); $args['where'] = "`modified` > '" . gmdate( 'Y-m-d H:i:s', $end_date ) . "'"; $args['orderby'] = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified'; $args['order'] = 'DESC'; $args['offset'] = ( $current_object['paged'] - 1 ) * $current_object['items_per_page']; $args['row_count'] = $current_object['items_per_page']; switch( $view ) { case 'unread': $args['read'] = false; break; case 'no-replies': $args['where'] = null; $args['include'] = wpforo_get_not_replied_topicids(); break; case 'solved': $args['solved'] = 1; break; case 'unsolved': $args['solved'] = 0; break; case 'closed': $args['closed'] = 1; break; case 'opened': $args['closed'] = 0; break; case 'sticky': $args['type'] = 1; break; case 'private': $args['private'] = 1; break; case 'unapproved': $args['status'] = 1; break; case 'prefix': $args['where'] = null; break; } $topics = $view === 'no-replies' && empty( $args['include'] ) ? [] : WPF()->topic->get_topics( $args, $current_object['items_count'] ); if( $topics ) { $intro_posts = wpforo_setting( 'topics', 'layout_extended_intro_posts_count' ); if( $intro_posts < 1 ) { $intro_posts = null; } else { $intro_posts = ( $intro_posts > 1 ) ? ( $intro_posts - 1 ) : 0; } foreach( $topics as $key => $topic ) { $topics[ $key ]['replies'] = []; $topics[ $key ]['member'] = wpforo_member( $topic ); $topics[ $key ]['forum'] = wpforo_forum( $topic['forumid'] ); if( isset( $topic['last_post'] ) && $topic['last_post'] != 0 ) { $topics[ $key ]['last_post'] = wpforo_post( $topic['last_post'] ); $topics[ $key ]['last_poster'] = wpforo_member( $topics[ $key ]['last_post'] ); } if( isset( $topic['first_postid'] ) && $topic['first_postid'] != 0 ) { $topics[ $key ]['first_post'] = wpforo_post( $topic['first_postid'] ); $topics[ $key ]['first_poster'] = wpforo_member( $topics[ $key ]['first_post'] ); if( ! $view && apply_filters( 'wpforo_recent_topics_intro', true, $topic ) ) { $topics[ $key ]['replies'] = WPF()->post->get_posts( [ 'topicid' => $topic['topicid'], 'orderby' => '`is_first_post` ASC, `created` DESC, `postid` DESC', 'row_count' => $intro_posts ] ); } } $topics[ $key ]['topic_url'] = wpforo_topic( $topic['topicid'], 'url' ); $topics[ $key ]['topic_posturl'] = ( $view === 'unread' && wpfval( $topics[ $key ]['last_post'], 'url' ) ) ? $topics[ $key ]['last_post']['url'] : WPF()->topic->get_url( $topic['topicid'] ); } $args['intro_posts'] = $intro_posts; } $current_object['topics'] = $topics; } else { $current_object['items_per_page'] = wpforo_setting( 'topics', 'posts_per_page' ); if( $view !== 'unapproved' ) $args['where'] = "`created` > '" . gmdate( 'Y-m-d H:i:s', $end_date ) . "'"; $args['orderby'] = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created'; $args['order'] = 'DESC'; $args['offset'] = ( $current_object['paged'] - 1 ) * $current_object['items_per_page']; $args['row_count'] = $current_object['items_per_page']; if( $view === 'unapproved' ) { $args['status'] = 1; } $current_object['posts'] = WPF()->post->get_posts( $args, $current_object['items_count'] ); } $args['view'] = $view; $args['type'] = $type; $current_object['args'] = $args; } elseif( $this->current_object['template'] === 'recent-activity' ) { $current_object['items_per_page'] = 20; $current_object['items_count'] = 0; // Get filter parameters from URL $activity_type = ! empty( WPF()->GET['type'] ) ? sanitize_text_field( WPF()->GET['type'] ) : 'all'; $period = ! empty( WPF()->GET['period'] ) ? sanitize_text_field( WPF()->GET['period'] ) : 'week'; // Calculate date_from based on period $date_from = null; switch( $period ) { case 'day': $date_from = time() - ( 24 * 60 * 60 ); break; case 'week': $date_from = time() - ( 7 * 24 * 60 * 60 ); break; case 'month': $date_from = time() - ( 30 * 24 * 60 * 60 ); break; case 'all': default: $date_from = null; break; } // Get enabled activity types from settings $enabled_types = WPF()->settings->activity['enabled_types'] ?? []; // Build activity query args $args = [ 'types_exclude' => [ 'new_reply' ], // Exclude notification-only types 'orderby' => 'date', 'order' => 'DESC', 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'], 'row_count' => $current_object['items_per_page'], 'date_from' => $date_from, ]; // Filter by activity type if( $activity_type !== 'all' ) { $type_mapping = [ 'topic' => [ 'wpforo_topic', 'edit_topic' ], 'reply' => [ 'wpforo_post', 'edit_post' ], 'reaction' => [ 'new_like', 'new_dislike', 'new_up_vote', 'new_down_vote', 'new_reaction' ], 'favorite' => [ 'new_favorite' ], 'solved' => [ 'topic_solved' ], 'closed' => [ 'topic_closed' ], 'answer' => [ 'post_answer' ], ]; if( isset( $type_mapping[ $activity_type ] ) ) { // Intersect with enabled types to respect settings $args['types_include'] = array_intersect( $type_mapping[ $activity_type ], $enabled_types ); } } else { // Show all enabled types if( ! empty( $enabled_types ) ) { $args['types_include'] = $enabled_types; } } $current_object['activities'] = WPF()->activity->get_activities( $args, $current_object['items_count'], true, true ); $current_object['args'] = [ 'activity_type' => $activity_type, 'period' => $period, ]; } elseif( $this->current_object['template'] === 'tags' ) { $current_object['items_per_page'] = wpforo_setting( 'tags', 'per_page' ); $args = [ 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'], 'row_count' => $current_object['items_per_page'], ]; $current_object['tags'] = $this->topic->get_tags( $args, $current_object['items_count'] ); } elseif( $this->current_object['template'] === 'members' ) { $current_object['items_per_page'] = wpforo_setting( 'members', 'members_per_page' ); $this->form->current['template'] = 'members'; $this->form->current['value'] = $get; $this->form->current['varname'] = ''; if( ! empty( $get['_wpfms'] ) ) { $users_include = []; $search_fields_names = $this->member->get_search_fields_names(); $wpfms = ( isset( $get['wpfms'] ) ) ? sanitize_text_field( $get['wpfms'] ) : ''; if( $wpfms ) { if( apply_filters( 'wpforo_member_search_provider', false, $wpfms, $search_fields_names, $get ) ) { $users_include = apply_filters( 'wpforo_search_by_provider', [], $wpfms, $search_fields_names, $get ); } else { $users_include = $this->member->search( $wpfms, $search_fields_names ); } } else { if( $filters = array_filter( $get, function( $v ) { return ! ( is_null( $v ) || $v === false || $v === '' ); } ) ) { $filters = array_merge( array_filter( (array) wpfval( $get, 'data' ), function( $v ) { return ! ( is_null( $v ) || $v === false || $v === '' ); } ), $filters ); unset( $filters['data'] ); $args = []; foreach( $filters as $filter_key => $filter ) { if( in_array( $filter_key, $search_fields_names ) ) { $args[ $filter_key ] = $filter; } } if( apply_filters( 'wpforo_member_filter_provider', false, $args, $get ) ) { $users_include = apply_filters( 'wpforo_filter_by_provider', [], $args, $get ); } else { $users_include = $this->member->filter( $args ); } } } $users_include = apply_filters( 'wpforo_member_search_users_include', $users_include ); } $member_status = $this->member->get_inlist_enabled_statuses(); $args = [ 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'], 'row_count' => $current_object['items_per_page'], 'status' => $member_status, 'groupids' => $this->usergroup->get_visible_usergroup_ids(), ]; $orderby = wpfval( $get, 'wpfob' ) ? sanitize_text_field( $get['wpfob'] ) : wpforo_setting( 'members', 'list_order' ); switch( $orderby ) { case 'online_time': $args['orderby'] = 'online_time'; $args['order'] = 'desc'; break; case 'posts__asc': $args['orderby'] = 'posts'; $args['order'] = 'ASC'; break; case 'user_registered__asc': $args['orderby'] = 'user_registered'; $args['order'] = 'ASC'; break; case 'user_registered__desc': $args['orderby'] = 'user_registered'; $args['order'] = 'DESC'; break; case 'display_name__asc': $args['orderby'] = 'display_name'; $args['order'] = 'ASC'; break; case 'display_name__desc': $args['orderby'] = 'display_name'; $args['order'] = 'DESC'; break; default: $args['orderby'] = 'posts'; $args['order'] = 'DESC'; break; } if( ! empty( $users_include ) ) $args['include'] = $users_include; $args = apply_filters( 'wpforo_current_object_members_args_filter', $args, $get ); $current_object['members'] = $this->member->get_members( $args, $current_object['items_count'] ); if( isset( $users_include ) && empty( $users_include ) ) { $current_object['members'] = []; $current_object['items_count'] = 0; } } elseif( $this->current_object['template'] === 'add-topic' ) { if( $qvar0 = (int) wpfval( $current_object['qvars'], 0 ) ) { $forum = (array) $this->forum->get_forum( $qvar0 ); if( ! $forum || (int) wpfval( $forum, 'is_cat' ) ) { wp_safe_redirect( wpforo_home_url( wpforo_settings_get_slug( 'add-topic' ) ), 301 ); exit(); } } } } if( wpfval( $current_object, 'userid' ) || wpfval( $current_object, 'user_nicename' ) ) { $args = []; if( isset( $current_object['userid'] ) ) $args['userid'] = $current_object['userid']; if( isset( $current_object['user_nicename'] ) ) $args['user_nicename'] = $current_object['user_nicename']; $selected_user = $this->member->get_member( $args ); if( isset( $current_object['userid'] ) && empty( $selected_user ) ) $selected_user = $this->member->get_member( [ 'user_nicename' => $current_object['userid'] ] ); $selected_user = apply_filters( 'wpforo_init_current_selected_user', $selected_user ); if( $selected_user ) { $current_object['user'] = $selected_user; $current_object['userid'] = $selected_user['userid']; $current_object['user_nicename'] = $selected_user['user_nicename']; $current_object['user_is_same_current_user'] = ! empty( $this->current_userid ) && $selected_user['userid'] === $this->current_userid; if( $this->tpl->can_view_template( $this->current_object['template'], $current_object['user'] ) ) { switch( $this->current_object['template'] ) { case 'activity': $args = [ 'offset' => ( $current_object['paged'] - 1 ) * $this->current_object['items_per_page'], 'row_count' => $this->current_object['items_per_page'], 'userid' => $current_object['userid'], 'orderby' => '`created` DESC, `postid` DESC', 'check_private' => true, 'is_first_post' => wpfval( $this->GET, 'filter' ) ? $this->GET['filter'] === 'topics' : null, ]; $current_object['items_count'] = 0; $current_object['activities'] = $this->post->get_posts( $args, $current_object['items_count'] ); break; case 'favored': $current_object['filter'] = strtolower( (string) wpfval( WPF()->GET, 'filter' ) ); if( ! in_array( $current_object['filter'], [ 'likes', 'dislikes' ], true ) ) $current_object['filter'] = 'bookmarks'; if( $current_object['filter'] === 'likes' ) { $postids = $this->reaction->get_reactions_col( 'postid', [ 'userid' => $current_object['userid'], 'type_include' => 'up', ] ); } elseif( $current_object['filter'] === 'dislikes' ) { $postids = $this->reaction->get_reactions_col( 'postid', [ 'userid' => $current_object['userid'], 'type_include' => 'down', ] ); } else { $postids = $this->bookmark->get_bookmarks_col( 'postid', [ 'userid' => $current_object['userid'], 'boardid' => $this->board->get_current( 'boardid' ), 'status' => true, ] ); } if( $postids ) { $args = [ 'offset' => ( $current_object['paged'] - 1 ) * $this->current_object['items_per_page'], 'row_count' => $this->current_object['items_per_page'], 'orderby' => '`created` DESC, `postid` DESC', 'check_private' => true, 'include' => $postids, ]; $current_object['items_count'] = 0; $current_object['favored_posts'] = $this->post->get_posts( $args, $current_object['items_count'] ); } else { $current_object['items_count'] = 0; $current_object['favored_posts'] = []; } break; case 'account': $this->form->current['template'] = 'account'; $this->form->current['varname'] = 'member'; $this->form->current['value'] = array_merge( $current_object['user'], (array) wpfval( $_POST, 'member' ) ); break; default: $this->form->current['template'] = 'profile'; $this->form->current['value'] = $current_object['user']; break; } } else { if( ! $this->current_userid ) { wp_safe_redirect( wpforo_login_url() ); exit(); } $current_object['is_404'] = true; } } else { $current_object['is_404'] = true; } } if( wpfval( $current_object, 'topic_slug' ) ) { $topic = $this->topic->get_topic( [ 'slug' => $current_object['topic_slug'] ], false ); if( ! empty( $topic ) ) { $topic_forumid = intval( wpfval( $topic, 'forumid' ) ); $is_owner = wpforo_is_owner( $topic['userid'], $topic['email'] ); 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 ) ) ) ) { if( ! $this->current_userid ) { wp_safe_redirect( wpforo_login_url() ); exit(); } $current_object['is_404'] = true; } else { $current_object['topic'] = $topic; $current_object['topicid'] = $topic['topicid']; $current_object['og_text'] = (string) wpfval( $topic, 'title' ); } } else { $current_object['is_404'] = true; } } if( wpfval( $current_object, 'forum_slug' ) ) { $args = ( empty( $topic ) ? [ 'slug' => $current_object['forum_slug'] ] : $topic['forumid'] ); if( $forum = $this->forum->get_forum( $args ) ) { if( ! empty( $topic ) && strtolower( (string) $current_object['forum_slug'] ) !== strtolower( (string) $forum['slug'] ) ) { wp_safe_redirect( $this->topic->get_url( $topic, $forum ), 301 ); exit(); } if( $forum['is_cat'] ) $this->current_object['template'] = 'forum'; $current_object['forum'] = $forum; $current_object['forumid'] = $forum['forumid']; $current_object['forum_desc'] = $forum['description']; $current_object['forum_meta_key'] = $forum['meta_key']; $current_object['forum_meta_desc'] = $forum['meta_desc']; $current_object['og_text'] = $forum['title']; $current_object['layout'] = $this->forum->get_layout( $forum ); if( $this->current_object['template'] === 'topic' ) { $current_object['items_per_page'] = wpforo_setting( 'topics', 'topics_per_page' ); $args = [ 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'], 'row_count' => $current_object['items_per_page'], 'forumid' => $current_object['forumid'], 'orderby' => 'type, modified', 'order' => 'DESC', ]; $args = apply_filters( 'wpforo_topic_list_args', $args ); $current_object['topics'] = $this->topic->get_topics( $args, $current_object['items_count'] ); } } else { $current_object['is_404'] = true; } } if( in_array( $this->current_object['template'], [ 'forum', 'topic' ] ) ) { if( ! empty( $forum ) ) { $current_object['categories'] = [ $forum ]; } else { $current_object['categories'] = $this->forum->get_forums( [ "type" => 'category' ] ); } } if( $this->current_object['template'] === 'post' && ! empty( $forum ) && ! empty( $topic ) ) { $current_object['items_per_page'] = $this->post->get_option_items_per_page( $current_object['layout'] ); $args = [ 'forumid' => $forum['forumid'], 'topicid' => $topic['topicid'], 'offset' => ( $current_object['paged'] - 1 ) * $current_object['items_per_page'], 'row_count' => $current_object['items_per_page'], ]; if( $current_object['layout'] == 4 ) { $args['parentid'] = 0; } elseif( $current_object['layout'] == 3 ) { $args['parentid'] = 0; switch( $current_object['orderby'] ) { case 'oldest': $args['orderby'] = '`is_first_post` DESC, `is_answer` DESC, `created` ASC, `postid` ASC'; break; case 'newest': $args['orderby'] = '`is_first_post` DESC, `is_answer` DESC, `modified` DESC, `postid` DESC'; break; default: $args['orderby'] = '`is_first_post` DESC, `is_answer` DESC, `votes` DESC, `created` ASC, `postid` ASC'; break; } } if( $this->post->get_option_union_first_post( $current_object['layout'] ) ) $args['union_first_post'] = true; $args = apply_filters( 'wpforo_post_list_args', $args ); $current_object['posts'] = $this->post->get_posts( $args, $current_object['items_count'] ); } $this->current_object = wpforo_parse_args( $current_object, $this->current_object ); $this->current_object = apply_filters( 'wpforo_after_init_current_object', $this->current_object, $wpf_url_parse ); if( $this->current_object['template'] ) { /** * redirect not logged-in users to login page when that user no access to this page */ 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'] ) ) ) ) { wp_safe_redirect( wpforo_login_url() ); exit(); } if( $this->current_object['template'] === 'cantlogin' ) { if( $this->current_userid ) { if( $this->current_user['status'] !== 'active' ) { WPF()->ram_cache->set( 'USER_LOGIN_REFERER', WPF()->current_user_login ); wp_logout(); } else { wp_safe_redirect( wpforo_home_url() ); } } else { wp_safe_redirect( wpforo_login_url() ); exit(); } } /** * redirect to the first page when paged var is greater items_count */ 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'] ) { wp_safe_redirect( $this->strip_url_paged_var( $this->current_url ), 301 ); exit(); } } else { $this->current_object['is_404'] = true; } } public function get_version() { return wpforo_get_option( 'version', null, false ); } public function need_activation() { return WPFORO_VERSION !== $this->get_version(); } public function is_installed() { return (bool) $this->get_version(); } public function can_use_this_slug( $slug ) { $return = ! in_array( $slug, $this->settings->slugs, true ) && ! in_array( $slug, array_keys( $this->settings->slugs ), true ); return apply_filters( 'wpforo_can_use_this_slug', $return, $slug ); } }