db = $wpdb; $this->file = __FILE__; $this->error = NULL; $this->locale = get_locale(); $this->basename = plugin_basename($this->file); $this->init_db_tables(); $this->includes(); $this->init_defaults(); $this->reset_current_object(); $this->init_options(); $this->setup(); $this->init_hooks(); $this->sql_cache = new wpForoSqlCache(); $this->action = new wpForoAction(); $this->cache = new wpForoCache(); $this->phrase = new wpForoPhrase(); $this->forum = new wpForoForum(); $this->topic = new wpForoTopic(); $this->postmeta = new wpForoPostMeta(); $this->post = new wpForoPost(); $this->usergroup = new wpForoUsergroup(); $this->member = new wpForoMember(); $this->perm = new wpForoPermissions(); $this->sbscrb = new wpForoSubscribe(); $this->tpl = new wpForoTemplate(); $this->notice = new wpForoNotices(); $this->api = new wpForoAPI(); $this->log = new wpForoLogs(); $this->feed = new wpForoFeed(); $this->form = new wpForoForm(); $this->moderation = new wpForoModeration(); $this->activity = new wpForoActivity(); $this->revision = new wpForoRevision(); $this->seo = new wpForoSEO(); $this->add = new stdClass(); // Integrations } private function init_hooks(){ add_action('plugins_loaded', array($this, 'plugins_loaded')); if( is_admin() ){ add_action('admin_init', array($this, 'admin_init')); add_action('admin_init', array($this, 'init')); }else{ add_action('wp', array($this, 'init')); } add_action('switch_blog', array($this, 'after_switch_blog'), 10, 2); } public function after_switch_blog($new_blog_id, $prev_blog_id){ if( intval($new_blog_id) !== intval($prev_blog_id) ){ $this->init_db_tables(); } } private function init_db_tables($blog_id = 0){ $this->db->query("SET SESSION group_concat_max_len = 1000000"); $blog_id = apply_filters('wpforo_current_blog_id', $blog_id); $this->tables = new stdClass; if(!$blog_id) $blog_id = $this->db->blogid; $this->blog_prefix = $this->db->get_blog_prefix( $blog_id ); $this->_tables = apply_filters('wpforo_init_db_tables', $this->_tables); foreach ( $this->_tables as $table ) $this->tables->$table = $this->blog_prefix . $this->prefix . $table; } private function includes(){ require_once( WPFORO_DIR . '/wpf-includes/wpf-hooks.php' ); require_once( WPFORO_DIR . '/wpf-includes/functions.php' ); require_once( WPFORO_DIR . '/wpf-includes/functions-integration.php' ); require_once( WPFORO_DIR . '/wpf-includes/functions-template.php' ); if(wpforo_is_admin()) { require_once( WPFORO_DIR . '/wpf-includes/functions-installation.php' ); require_once( WPFORO_DIR .'/wpf-admin/admin.php' ); } require_once( WPFORO_DIR . '/wpf-includes/class-sqlcache.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-actions.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-cache.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-forums.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-topics.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-postmeta.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-posts.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-usergroups.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-members.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-permissions.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-phrases.php'); require_once( WPFORO_DIR . '/wpf-includes/class-subscribes.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-template.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-notices.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-logs.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-api.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-feed.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-forms.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-moderation.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-activity.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-revisions.php' ); require_once( WPFORO_DIR . '/wpf-includes/class-seo.php' ); } public function plugins_loaded(){ if ( wpforo_feature( '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'); } } public function admin_init(){ if( wpforo_is_admin() ){ $this->check_database(); if( strpos( wpforo_get_request_uri(), 'user-new.php' ) === false ){ $sql = "SELECT `groupid` FROM ". $this->tables->profiles ." WHERE `userid` = " . wpforo_bigintval($this->current_userid); if( !$current_groupid = $this->db->get_var($sql) ){ $this->member->synchronize_user($this->current_userid); } } if( !$this->forum->manage() && wpforo_current_user_is('admin') ){ $this->member->set_usergroup($this->current_userid, 1); } } } public function check_database(){ //Make sure all users profiles are created if( !wpforo_feature('user-synch') && get_option('wpforo_version') ){ $users = $this->db->get_var("SELECT COUNT(*) FROM `".$this->db->users."`"); $profiles = $this->db->get_var("SELECT COUNT(*) FROM `" . $this->tables->profiles."`"); $delta = $users - $profiles; if( $users > 100 && $delta > 2 ){ add_action( 'admin_notices', 'wpforo_profile_notice', 10 ); } } //Make sure tables structures are correct for current version $wpforo_version_db = get_option('wpforo_version_db'); if( !$wpforo_version_db || version_compare( $wpforo_version_db, WPFORO_VERSION, '<') ){ if( 'tables' != wpfval($_GET, 'view') ){ $db_note = false; $problems = wpforo_database_check(); if( !empty($problems) ) { foreach( $problems as $table_name => $problem ){ if( wpfval($problem, 'fields') ) $db_note = true; if( wpfval($problem, 'exists') ) $db_note = true; } if( $db_note ) { add_action( 'admin_notices', 'wpforo_database_notice', 10 ); } } else { update_option('wpforo_version_db', WPFORO_VERSION ); } } } } public function init(){ do_action( 'wpforo_before_init' ); $this->phrase->init(); $this->perm->init(); $this->perm->init_current_user_accesses(); $this->init_current_url(); $this->init_current_object(); $this->moderation->init(); $this->tpl->init(); $this->api->hooks(); do_action( 'wpforo_after_init' ); } public function shortcode_atts_to_url($atts){ $url = wpforo_home_url(); $args = shortcode_atts( array( 'item' => 'forum', 'id' => 0, 'slug' => '', ), (array) $atts ); if( $args['item'] === 'profile' && !$args['id'] ) $args['id'] = $this->current_userid; if( $args['item'] === 'add-topic' ){ $forum = $this->forum->get_forum( ( $args['slug'] ? $args['slug'] : $args['id'] ) ); $url = wpforo_home_url( wpforo_get_template_slug('add-topic') . '/' . (int) wpfval($forum, 'forumid') ); }elseif( $args['id'] || $args['slug'] ){ $getid = ( $args['slug'] ? $args['slug'] : $args['id'] ); if( $args['item'] === 'topic' ){ $url = $this->topic->get_topic_url($getid); }elseif( $args['item'] === 'profile' ){ $url = $this->member->get_profile_url($getid); }else{ $url = $this->forum->get_forum_url($getid); } }elseif( $args['item'] === 'signin' ){ $url = wpforo_home_url('?foro=signin'); }elseif( $args['item'] === 'signup' ){ $url = wpforo_home_url('?foro=signup'); }elseif( $args['item'] === 'lostpassword' ){ $url = wpforo_home_url('?foro=lostpassword'); } return $url; } public function init_current_url($atts = array()){ $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(); } }elseif( is_wpforo_url($url) && preg_match('#/'.preg_quote(wpforo_get_template_slug('postid')).'/(\d+)/?$#isu', strtok($url, '?'), $matches) ){ $post_url = $this->post->get_post_url($matches[1]); if( $post_url !== wpforo_home_url() ) $url = $post_url; } $url = wpforo_fix_url($url); $url = preg_replace('#\#[^/?&]*$#isu', '', $url); parse_str( parse_url($url, PHP_URL_QUERY), $get ); $get = array_merge( (array) $get, (array) $_GET ); $this->current_url = apply_filters('wpforo_init_current_url', $url); $this->GET = apply_filters('wpforo_init_current_url_GET', $get); } private function init_defaults() { date_default_timezone_set( 'UTC' ); ini_set( 'date.timezone', 'UTC' ); $this->default = new stdClass; $this->default->use_home_url = 0; $this->default->excld_urls = ''; $this->default->permastruct = 'community'; $this->default->current_object = array( 'template' => '', 'qvars' => array(), 'args' => array(), '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' => array(), 'categories' => array(), 'topics' => array(), 'posts' => array(), 'user' => array(), 'userid' => 0, 'user_nicename' => '', 'forum' => array(), 'forumid' => 0, 'forum_slug' => '', 'forum_desc' => '', 'forum_meta_key' => '', 'forum_meta_desc' => '', 'topic' => array(), 'topicid' => 0, 'topic_slug' => '', 'tags' => array(), 'load_tinymce' => false ); $blogname = get_option( 'blogname', '' ); $this->default->general_options = array( 'title' => $blogname . ' ' . __( 'Forum', 'wpforo' ), 'description' => $blogname . ' ' . __( 'Discussion Board', 'wpforo' ), 'lang' => 1 ); $this->default->features = array( 'user-admin-bar' => 0, 'page-title' => 1, 'top-bar' => 1, 'top-bar-search' => 1, 'breadcrumb' => 1, 'footer-stat' => 1, 'notifications' => 1, 'notifications-live' => 0, 'notifications-bar' => 1, 'mention-nicknames' => 1, 'content-do_shortcode' => 0, 'view-logging' => 1, 'track-logging' => 1, 'goto-unread' => 1, 'goto-unread-button' => 0, 'profile' => 1, 'user-register' => 1, 'user-register-email-confirm' => 1, 'disable_new_user_admin_notification' => 1, 'register-url' => 0, 'login-url' => 0, 'resetpass-url' => 1, //In most cases incompatible with security and antispam plugins 'replace-avatar' => 1, 'avatars' => 1, 'custom-avatars' => 1, 'signature' => 1, 'rating' => 1, 'rating_title' => 1, 'member_cashe' => 1, 'object_cashe' => 1, 'html_cashe' => 0, 'memory_cashe' => 1, 'seo-title' => 1, 'seo-meta' => 1, 'seo-profile' => 1, 'rss-feed' => 1, 'font-awesome' => 1, 'bp_activity' => 1, 'bp_notification' => 1, 'bp_forum_tab' => 1, 'um_forum_tab' => 1, 'um_notification' => 1, 'user-synch' => 0, 'role-synch' => 1, 'output-buffer' => 1, 'wp-date-format' => 0, 'subscribe_conf' => 1, 'subscribe_checkbox_on_post_editor' => 1, 'subscribe_checkbox_default_status' => 0, 'attach-media-lib' => 1, 'admin-cp' => 1, 'debug-mode' => 0, 'copyright' => 1 ); $this->default->tools_antispam = array( 'spam_filter' => 1, 'spam_filter_level_topic' => mt_rand( 30, 60 ), 'spam_filter_level_post' => mt_rand( 30, 60 ), 'spam_user_ban' => 0, 'new_user_max_posts' => 3, 'unapprove_post_if_user_is_new' => 0, 'spam_user_ban_notification' => 1, 'min_number_post_to_attach' => 0, 'min_number_post_to_link' => 0, 'spam_file_scanner' => 1, 'limited_file_ext' => 'pdf|doc|docx|txt|htm|html|rtf|xml|xls|xlsx|zip|rar|tar|gz|bzip|7z', 'exclude_file_ext' => 'pdf|doc|docx|txt', 'rc_site_key' => '', 'rc_secret_key' => '', 'rc_theme' => 'light', 'rc_login_form' => 0, 'rc_reg_form' => 0, 'rc_lostpass_form' => 0, 'rc_wpf_login_form' => 1, 'rc_wpf_reg_form' => 1, 'rc_wpf_lostpass_form' => 1, 'rc_topic_editor' => 1, 'rc_post_editor' => 1, 'html' => 'embed(src width height name pluginspage type wmode allowFullScreen allowScriptAccess flashVars),' ); $this->default->tools_cleanup = array( 'user_reg_days_ago' => 7, 'auto_cleanup_users' => 0, 'usergroup' => array( 1 => '0', 5 => '0', 2 => '1', 3 => '0' ) ); $this->default->tools_misc = array( 'dofollow' => '', 'noindex' => '', 'admin_note' => '', 'admin_note_groups' => array( 1, 2, 3, 4, 5 ), 'admin_note_pages' => array( 'forum' ) ); $this->default->tools_legal = array( 'rules_checkbox' => 0, 'rules_text' => null, 'page_terms' => '', 'page_privacy' => '', 'forum_privacy_text' => null, 'checkbox_terms_privacy' => 0, 'checkbox_email_password' => 1, 'checkbox_forum_privacy' => 0, 'checkbox_fb_login' => 1, 'contact_page_url' => null, 'cookies' => 1 ); $this->default->stats = array( 'forums' => 0, 'topics' => 0, 'posts' => 0, 'members' => 0, 'online_members_count' => 0, 'last_post_title' => '', 'last_post_url' => '', 'newest_member' => array(), 'newest_member_dname' => '', 'newest_member_profile_url' => '' ); $this->default->dissmissed = array( '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(){ $permalink_structure = get_option('permalink_structure'); $this->use_trailing_slashes = ( '/' == substr($permalink_structure, -1, 1) ); //OPTIONS $this->use_home_url = get_wpf_option('wpforo_use_home_url', $this->default->use_home_url); $this->excld_urls = get_wpf_option('wpforo_excld_urls', $this->default->excld_urls); $this->permastruct = trim( get_wpf_option('wpforo_permastruct', $this->default->permastruct), '/' ); $this->permastruct = preg_replace('#^/?index\.php/?#isu', '', $this->permastruct); $this->permastruct = trim($this->permastruct, '/'); $this->base_permastruct = (!$this->use_home_url ? $this->permastruct : ''); $this->base_permastruct = rtrim( ( strpos($permalink_structure, 'index.php') !== FALSE ? '/index.php/' . $this->base_permastruct : '/' . $this->base_permastruct ), '/\\' ); $this->url = esc_url( home_url( $this->user_trailingslashit($this->base_permastruct) ) ); $this->pageid = get_wpf_option( 'wpforo_pageid', 0); $this->general_options = get_wpf_option( 'wpforo_general_options', $this->default->general_options); $this->features = get_wpf_option('wpforo_features', $this->default->features); $fp = intval($this->features['profile']); if( ($fp === 3 && !class_exists('BP_Component')) || ($fp === 4 && !function_exists('UM')) ){ $this->features['profile'] = 1; update_option('wpforo_features', array_map( 'intval', $this->features)); } $this->tools_antispam = get_wpf_option('wpforo_tools_antispam', $this->default->tools_antispam); $this->tools_cleanup = get_wpf_option('wpforo_tools_cleanup', $this->default->tools_cleanup); $this->tools_misc = get_wpf_option('wpforo_tools_misc', $this->default->tools_misc); $this->tools_legal = get_wpf_option('wpforo_tools_legal', $this->default->tools_legal); $this->dissmissed = get_wpf_option('wpforo_dissmissed', $this->default->dissmissed); //CONSTANTS define('WPFORO_BASE_PERMASTRUCT', $this->base_permastruct ); define('WPFORO_BASE_URL', $this->url ); } private function setup(){ if( wpforo_is_admin() ){ register_activation_hook($this->basename, 'do_wpforo_activation'); register_deactivation_hook($this->basename, 'do_wpforo_deactivation'); } } 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 = ( $this->use_trailing_slashes ? $rtrimed_url . '/' : $rtrimed_url ); } } } return $url . $url_append_vars; } public function strip_url_paged_var($url){ $patterns = array( '#/'. preg_quote( wpforo_get_template_slug('paged') ) .'/?\d*/?#isu', '#[\&\?]wpfpaged=\d*#isu' ); $url = preg_replace($patterns, '', $url); $url = $this->user_trailingslashit($url); return $url; } public function statistic( $mode = 'get', $template = 'all' ){ if( $mode === 'get' ){ if( $cached_stat = get_option('wpforo_stat' ) ){ $cached_stat['online_members_count'] = $this->member->online_members_count(); if( wpfval($cached_stat, 'forums') && wpfval($cached_stat, 'topics') && wpfval($cached_stat, 'posts') ){ $cached_stat = wpforo_array_args_cast_and_merge($cached_stat, $this->default->stats); return $cached_stat; } } } if( $mode === 'get' || $template === 'all' ) { $stats['forums'] = $this->forum->get_count( array('is_cat' => 0) ); $stats['topics'] = $this->topic->get_count(); $stats['posts'] = $this->post->get_count(); $member_status = array( 'p.`status`' => apply_filters('wpforo_display_members_status', array('active'))); $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', 20); $posts = $this->topic->get_topics(array('orderby' => 'modified', 'order' => 'DESC', 'row_count' => $row_count, 'private' => 0, 'status' => 0, 'permgroup' => 4 )); $first = key($posts); if ( isset($posts[$first]) && !empty($posts[$first]) && $this->perm->forum_can('vf', $posts[$first]['forumid'], 4) ) { $stats['last_post_title'] = $posts[$first]['title']; $stats['last_post_url'] = $this->post->get_post_url($posts[$first]['last_post']); } $members = $this->member->get_members(array('orderby' => 'userid', 'order' => 'DESC', 'row_count' => 1, 'groupids' => $this->usergroup->get_visible_usergroup_ids())); if (isset($members[0]) && !empty($members[0])) { $members[0]['profile_url'] = $this->member->profile_url($members[0]); $stats['newest_member'] = $members[0]; $stats['newest_member_dname'] = wpforo_user_dname($members[0]); $stats['newest_member_profile_url'] = $members[0]['profile_url']; } }else{ $stats = get_wpf_option('wpforo_stat', $this->default->stats); switch ($template){ case 'forum': $stats['forums'] = $this->forum->get_count( array('is_cat' => 0) ); break; case 'topic': $stats['topics'] = $this->topic->get_count(); $posts = $this->topic->get_topics(array('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_post_url($posts[0]['last_post']); } break; case 'post': $stats['posts'] = $this->post->get_count(); $posts = $this->topic->get_topics(array('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_post_url($posts[0]['last_post']); } break; case 'user': $member_status = array( 'p.`status`' => apply_filters('wpforo_display_members_status', array('active'))); $stats['members'] = $this->member->get_count( $member_status ); $stats['online_members_count'] = $this->member->online_members_count(); $members = $this->member->get_members(array('orderby' => 'userid', 'order' => 'DESC', 'row_count' => 1, 'groupids' => $this->usergroup->get_visible_usergroup_ids())); if (isset($members[0]) && !empty($members[0])) { $members[0]['profile_url'] = WPF()->member->profile_url($members[0]); $stats['newest_member'] = $members[0]; $stats['newest_member_dname'] = wpforo_user_dname($members[0]); $stats['newest_member_profile_url'] = $members[0]['profile_url']; } break; } } $stats = apply_filters('wpforo_get_statistic_array_filter', $stats); $stats = wpforo_array_args_cast_and_merge($stats, $this->default->stats); update_option( 'wpforo_stat', $stats ); return $stats; } public function init_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); if( $this->use_home_url ) $this->permastruct = ''; $current_object = array(); if( wpfkey($get, 'wpfs') || wpfval($get, 'foro') === 'search' ) $current_object['template'] = 'search'; if( wpfval($get, 'wpforo') || wpfval($get, 'foro') ){ $request = ( wpfval($get, 'wpforo') ) ? wpfval($get, 'wpforo') : wpfval($get, 'foro'); switch( $request ){ case 'signup': if(!is_user_logged_in()) { $this->data['template'] = $current_object['template'] = 'register'; $this->data['value']['user_login'] = sanitize_user((string) wpfval($_POST, 'wpfreg', 'user_login')); $this->data['value']['user_email'] = sanitize_email((string) wpfval($_POST, 'wpfreg', 'user_email')); $this->data['varname'] = 'wpfreg'; } break; case 'signin': if(!is_user_logged_in()) $current_object['template'] = 'login'; break; case 'lostpassword': if(!is_user_logged_in()) $current_object['template'] = 'lostpassword'; break; case 'resetpassword': $current_object['template'] = 'resetpassword'; break; case 'page': $current_object['template'] = 'page'; break; case 'logout': wp_logout(); wp_redirect( wpforo_home_url( preg_replace('#\?.*$#is', '', wpforo_get_request_uri()) ) ); exit(); break; } } $wpf_url = preg_replace( '#^/?'.preg_quote($this->permastruct).'#isu', '' , $current_url, 1 ); $wpf_url = preg_replace('#/?\?.*$#isu', '', $wpf_url); $wpf_url_parse = array_filter( explode('/', trim($wpf_url, '/')) ); $wpf_url_parse = array_reverse($wpf_url_parse); if(in_array(wpforo_get_template_slug('paged'), $wpf_url_parse)){ foreach($wpf_url_parse as $key => $value){ if( $value === wpforo_get_template_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( wpfval($current_object, 'template') === 'search' ){ $args = array( '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' => array() ); if( !empty($get['wpfob']) ){ $args['orderby'] = sanitize_text_field( $get['wpfob'] ); }elseif( in_array(wpfval( $args, 'type' ), array('tag','user-posts','user-topics'), true) ) { $args['orderby'] = 'date'; } $wpfo = strtolower(wpfval($get, 'wpfo')); if( in_array($wpfo, array('asc','desc'), true) ) $args['order'] = $wpfo; $sdata = array_filter( (array) wpfval($get, 'data') ); $args['postids'] = WPF()->postmeta->search($sdata); $current_object['args'] = $args; if( $sdata && !$args['postids'] ){ $current_object['items_count'] = 0; $current_object['posts'] = array(); }else{ $current_object['posts'] = WPF()->post->search($args, $current_object['items_count']); } } if( !wpfval($current_object, 'template') ){ $current_object = apply_filters('wpforo_before_init_current_object', $current_object, $wpf_url_parse); } if( !wpfval($current_object, 'template') ){ if( $templates = $this->tpl->get_templates_list() ){ $__slug = end($wpf_url_parse); foreach ( $templates as $template ){ if( $__slug === wpforo_get_template_slug($template) ){ $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( wpfval($current_object, 'template') ){ if( !wpfval($current_object, 'userid') && !wpfval($current_object, 'user_nicename') && wpforo_is_member_template($current_object['template']) ){ if( $qvar0 = wpfval($current_object['qvars'], 0) ){ if( $this->member->options['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_redirect( wpforo_login_url() ); exit(); } } }elseif($current_object['template'] === 'recent'){ $current_object['items_per_page'] = $this->post->options['topics_per_page']; }elseif($current_object['template'] === 'tags'){ $current_object['items_per_page'] = $this->post->options['tags_per_page']; $args = array( '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($current_object['template'] === 'members'){ $current_object['items_per_page'] = $this->member->options['members_per_page']; $this->data['template'] = 'members'; $this->data['value'] = $get; $this->data['varname'] = ''; if( !empty($get['_wpfms']) ){ $users_include = array(); $search_fields_names = $this->member->get_search_fields_names(false); $wpfms = (isset($get['wpfms'])) ? sanitize_text_field($get['wpfms']) : ''; if($wpfms){ $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 = array(); foreach ($filters as $filter_key => $filter){ if( in_array($filter_key, (array) $search_fields_names) ){ $args[$filter_key] = $filter; } } $users_include = $this->member->filter($args); } } $users_include = apply_filters('wpforo_member_search_users_include', $users_include); } $member_status = apply_filters('wpforo_display_members_status', array('active')); $args = array( 'offset' => ($current_object['paged'] - 1) * $current_object['items_per_page'], 'row_count' => $current_object['items_per_page'], 'orderby' => 'posts', 'order' => 'DESC', 'status' => $member_status, 'groupids' => $this->usergroup->get_visible_usergroup_ids() ); if(!empty($users_include)) $args['include'] = $users_include; $current_object['members'] = $this->member->get_members($args, $current_object['items_count']); if(isset($users_include) && empty($users_include)){ $current_object['members'] = array(); $current_object['items_count'] = 0; } } }else{ $current_object['template'] = 'forum'; $this->data['varname'] = 'topic'; 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]; $current_object['template'] = 'post'; $this->data['varname'] = 'post'; }else{ $current_object['forum_slug'] = $wpf_url_parse[0]; $current_object['template'] = 'topic'; $this->data['varname'] = 'topic'; } } } if( wpfval($current_object, 'userid') || wpfval($current_object, 'user_nicename') ){ $args = array(); 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(array('user_nicename' => $current_object['userid'])); if(!empty($selected_user)){ $current_object['user'] = $selected_user; $current_object['userid'] = $selected_user['ID']; $current_object['user_nicename'] = $selected_user['user_nicename']; $current_object['user_is_same_current_user'] = !empty($this->current_userid) && $selected_user['ID'] == $this->current_userid; if( $this->tpl->can_view_template($current_object['template'], $current_object['user']) ){ switch($current_object['template']){ case 'activity': $args = array( '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 ); $current_object['items_count'] = 0; $current_object['activities'] = $this->post->get_posts( $args, $current_object['items_count']); break; case 'subscriptions': $args = array( 'offset' => ($current_object['paged'] - 1) * $this->current_object['items_per_page'], 'row_count' => $this->current_object['items_per_page'], 'userid' => $current_object['userid'], 'order' => 'DESC' ); $current_object['items_count'] = 0; $current_object['subscribes'] = $this->sbscrb->get_subscribes( $args, $current_object['items_count']); break; case 'account': $this->data['template'] = 'account'; $this->data['varname'] = 'member'; $this->data['value'] = array_merge($current_object['user'], (array) wpfval($_POST, 'member')); break; default: $this->data['template'] = 'profile'; $this->data['value'] = $current_object['user']; break; } }else{ if( !$this->current_userid ){ wp_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(array('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( $topic_forumid && ( !WPF()->perm->forum_can('vf', $topic_forumid) || ( !$is_owner && !WPF()->perm->forum_can('vt', $topic_forumid) ) || ( wpfval($topic, 'private') && !$is_owner && !WPF()->perm->forum_can('vp', $topic_forumid) ) || ( wpfval($topic, 'status') && !$is_owner && !WPF()->perm->forum_can('au', $topic_forumid) ) ) ){ if( !$this->current_userid ){ wp_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) ? array('slug' => $current_object['forum_slug']) : $topic['forumid'] ); if( $forum = $this->forum->get_forum( $args ) ){ if( $forum['is_cat'] ) $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( $current_object['template'] === 'topic' ){ $current_object['items_per_page'] = $this->post->options['topics_per_page']; $args = array( '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' ); $current_object['topics'] = $this->topic->get_topics( $args, $current_object['items_count'] ); } }else{ $current_object['is_404'] = true; } } if( in_array($current_object['template'], array('forum', 'topic')) ){ if( !empty($forum) ){ $current_object['categories'] = array( $forum ); }else{ $current_object['categories'] = $this->forum->get_forums( array( "type" => 'category' ) ); } } if ( $current_object['template'] === 'post' && ! empty( $forum ) && ! empty( $topic ) ) { $current_object['items_per_page'] = $this->post->get_option_items_per_page($current_object['layout']); $args = array( '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; $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'], array('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_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_redirect( $this->strip_url_paged_var( $this->current_url ) ); exit(); } }else{ $this->current_object['is_404'] = true; } } public function is_installed(){ return (bool) get_option('wpforo_version'); } public function can_use_this_slug($slug){ $return = !in_array($slug, $this->tpl->slugs, true) && !in_array($slug, array_keys($this->tpl->slugs), true); return apply_filters('wpforo_can_use_this_slug', $return, $slug); } } /** * Main instance of wpForo. * * Returns the main instance of WPF to prevent the need to use globals. * * @since 1.4.3 * @return wpForo */ if ( !function_exists('WPF') ){ function WPF() { return wpForo::instance(); } } // Global for backwards compatibility. $GLOBALS['wpforo'] = WPF(); //ADDONS///////////////////////////////////////////////////// WPF()->addons = array( 'embeds' => array('version' => '2.0.7', 'requires' => '1.8.0', 'class' => 'wpForoEmbeds', 'title' => 'Embeds', 'thumb' => WPFORO_URL . '/wpf-assets/addons/embeds/header.png', 'desc' => __('Allows to embed hundreds of video, social network, audio and photo content providers in forum topics and posts.', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-embeds/'), 'polls' => array('version' => '1.0.6', 'requires' => '1.8.0', 'class' => 'wpForoPoll', 'title' => 'Polls', 'thumb' => WPFORO_URL . '/wpf-assets/addons/polls/header.png', 'desc' => __('wpForo Polls is a complete addon to help forum members create, vote and manage polls effectively. Comes with poll specific permissions and settings.', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-polls/'), 'tcf' => array('version' => '1.0.0', 'requires' => '1.8.0', 'class' => 'wpForoTcf', 'title' => 'Topic Custom Fields', 'thumb' => WPFORO_URL . '/wpf-assets/addons/tcf/header.png', 'desc' => __('Allows to create topic custom fields and manage topic form layout with a form builder. Adds topic search options by custom fields', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-topic-custom-fields/'), 'mycred' => array('version' => '1.1.2', 'requires' => '1.8.0', 'class' => 'myCRED_Hook_wpForo', 'title' => 'MyCRED Integration', 'thumb' => WPFORO_URL . '/wpf-assets/addons/mycred/header.png', 'desc' => __('Awards myCRED points for forum activity. Integrates myCRED Badges and Ranks. Converts wpForo topic and posts, likes to myCRED points.', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-mycred/'), 'ucf' => array('version' => '2.0.2', 'requires' => '1.8.0', 'class' => 'WpforoUcf', 'title' => 'User Custom Fields', 'thumb' => WPFORO_URL . '/wpf-assets/addons/ucf/header.png', 'desc' => __('Advanced user profile builder system. Allows to add new fields and manage profile page. Creates custom Registration, Account, Member Search forms.', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-user-custom-fields/'), 'attachments' => array('version' => '2.0.4', 'requires' => '1.8.0', 'class' => 'wpForoAttachments', 'title' => 'Advanced Attachments', 'thumb' => WPFORO_URL . '/wpf-assets/addons/attachments/header.png', 'desc' => __('Adds an advanced file attachment system to forum topics and posts. AJAX powered media uploading and displaying system with user specific library.', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-advanced-attachments/'), 'pm' => array('version' => '1.3.3', 'requires' => '1.8.0', 'class' => 'wpForoPMs', 'title' => 'Private Messages', 'thumb' => WPFORO_URL . '/wpf-assets/addons/pm/header.png', 'desc' => __('Provides a safe way to communicate directly with other members. Messages are private and can only be viewed by conversation participants.', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-private-messages/'), 'cross' => array('version' => '2.1.5', 'requires' => '1.8.0', 'class' => 'wpForoCrossPosting', 'title' => '"Forum - Blog" Cross Posting', 'thumb' => WPFORO_URL . '/wpf-assets/addons/cross/header.png', 'desc' => __('Blog to Forum and Forum to Blog content synchronization. Blog posts with Forum topics and Blog comments with Forum replies.', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-cross-posting/'), 'ad-manager' => array('version' => '1.1.3', 'requires' => '1.8.0', 'class' => 'wpForoAD', 'title' => 'Ads Manager', 'thumb' => WPFORO_URL . '/wpf-assets/addons/ad-manager/header.png', 'desc' => __('Ads Manager is a powerful yet simple advertisement management system, that allows you to add adverting banners between forums, topics and posts.', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-ad-manager/'), 'emoticons' => array('version' => '1.0.5', 'requires' => '1.8.0', 'class' => 'wpForoSmiles', 'title' => 'wpForo Emoticons', 'thumb' => WPFORO_URL . '/wpf-assets/addons/wpforo-emoticons/header.png', 'desc' => __('Adds awesome Sticker and Emoticons packs to editor. Allows to create new custom emoticons packs.', 'wpforo'), 'url' => 'https://gvectors.com/product/wpforo-emoticons/'), ); $wp_version = get_bloginfo('version'); if (version_compare($wp_version, '4.2.0', '>=')) { add_action('wp_ajax_dismiss_wpforo_addon_note', array(WPF()->notice, 'dismissAddonNote')); add_action('admin_notices', array(WPF()->notice, 'addonNote'));} ///////////////////////////////////////////////////////////// }