'', 'location' => 0, 'posts_per_page' => 10, 'topics_per_page' => 20, 'members_per_page' => 25, 'minimalistic_editor' => true, 'allow_shortcodes' => false, 'embed_content' => true, 'allow_guest_postings' => false, 'allowed_filetypes' => 'jpg,jpeg,gif,png,bmp,pdf', 'allow_file_uploads' => false, 'upload_permission' => 'loggedin', 'hide_uploads_from_guests' => false, 'hide_profiles_from_guests' => false, 'uploads_maximum_number' => 5, 'uploads_maximum_size' => 5, 'uploads_show_thumbnails' => true, 'admin_subscriptions' => false, 'allow_subscriptions' => true, 'notification_sender_name' => '', 'notification_sender_mail' => '', 'receivers_admin_notifications' => '', 'mail_template_new_post_subject' => '', 'mail_template_new_post_message' => '', 'mail_template_new_topic_subject' => '', 'mail_template_new_topic_message' => '', 'mail_template_mentioned_subject' => '', 'mail_template_mentioned_message' => '', 'allow_signatures' => false, 'signatures_permission' => 'loggedin', 'signatures_html_allowed' => false, 'signatures_html_tags' => '
', 'enable_avatars' => true, 'enable_mentioning' => true, 'enable_mentioning_suggestions' => true, 'enable_reactions' => true, 'enable_search' => true, 'enable_profiles' => true, 'enable_memberslist' => true, 'enable_rss' => false, 'load_fontawesome' => true, 'load_fontawesome_compat_v4' => true, 'count_topic_views' => true, 'reports_enabled' => true, 'reports_notifications' => true, 'memberslist_loggedin_only' => false, 'show_login_button' => true, 'show_logout_button' => true, 'show_register_button' => true, 'show_who_is_online' => true, 'show_statistics' => true, 'enable_breadcrumbs' => true, 'breadcrumbs_show_category' => true, 'highlight_admin' => true, 'highlight_authors' => true, 'show_author_posts_counter' => true, 'show_edit_date' => true, 'enable_edit_post' => true, 'time_limit_edit_posts' => 0, 'enable_delete_post' => false, 'time_limit_delete_posts' => 3, 'enable_delete_topic' => false, 'time_limit_delete_topics' => 3, 'show_description_in_forum' => false, 'require_login' => false, 'require_login_posts' => false, 'create_blog_topics_id' => 0, 'enable_ads' => true, 'ads_frequency_categories' => 2, 'ads_frequency_forums' => 4, 'ads_frequency_topics' => 8, 'ads_frequency_posts' => 6, 'approval_for' => 'guests', 'enable_activity' => true, 'activity_days' => 14, 'activities_per_page' => 50, 'enable_polls' => true, 'polls_permission' => 'loggedin', 'polls_results_visible' => false, 'enable_seo_urls' => true, 'seo_url_mode_content' => 'slug', 'seo_url_mode_profile' => 'slug', 'view_name_activity' => 'activity', 'view_name_subscriptions' => 'subscriptions', 'view_name_search' => 'search', 'view_name_forum' => 'forum', 'view_name_topic' => 'topic', 'view_name_addtopic' => 'addtopic', 'view_name_movetopic' => 'movetopic', 'view_name_addpost' => 'addpost', 'view_name_editpost' => 'editpost', 'view_name_markallread' => 'markallread', 'view_name_members' => 'members', 'view_name_profile' => 'profile', 'view_name_history' => 'history', 'view_name_unread' => 'unread', 'view_name_unapproved' => 'unapproved', 'view_name_reports' => 'reports', 'enable_spoilers' => true, 'hide_spoilers_from_guests' => false, 'subforums_location' => 'above' ); var $options_editor = array( 'media_buttons' => false, 'editor_height' => 250, 'teeny' => true, 'quicktags' => false ); var $cache = array(); // Used to store selected database queries. var $rewrite = null; var $shortcode = null; var $reports = null; var $profile = null; var $editor = null; var $reactions = null; var $mentioning = null; var $notifications = null; var $appearance = null; var $uploads = null; var $search = null; var $online = null; var $content = null; var $breadcrumbs = null; var $activity = null; var $memberslist = null; var $pagination = null; var $unread = null; var $feed = null; var $permissions = null; var $ads = null; var $approval = null; var $spoilers = null; var $polls = null; function __construct() { // Initialize database. global $wpdb; $database = new AsgarosForumDatabase(); $this->tables = $database->getTables(); $this->db = $wpdb; $this->plugin_url = plugin_dir_url(dirname(__FILE__)); $this->plugin_path = plugin_dir_path(dirname(__FILE__)); $this->loadOptions(); $this->date_format = get_option('date_format'); $this->time_format = get_option('time_format'); add_action('wp', array($this, 'prepare')); add_action('wp_enqueue_scripts', array($this, 'enqueue_css_js'), 10); // Add filters for modifying the title of the page. add_filter('wp_title', array($this, 'change_wp_title'), 100, 3); add_filter('document_title_parts', array($this, 'change_document_title_parts'), 100); add_filter('pre_get_document_title', array($this, 'change_pre_get_document_title'), 100); // Add hook when topics should get created for new blog posts. if ($this->options['create_blog_topics_id'] != 0) { add_action('transition_post_status', array($this, 'createBlogTopic'), 10, 3); } add_filter('oembed_dataparse', array($this, 'prevent_oembed_dataparse'), 10, 3); // Deleting an user. add_action('delete_user_form', array($this, 'delete_user_form_reassign'), 10, 2); add_action('deleted_user', array($this, 'deleted_user_reassign'), 10, 2); new AsgarosForumCompatibility($this); new AsgarosForumStatistics($this); new AsgarosForumUserGroups($this); new AsgarosForumWidgets($this); $this->rewrite = new AsgarosForumRewrite($this); $this->shortcode = new AsgarosForumShortcodes($this); $this->reports = new AsgarosForumReports($this); $this->profile = new AsgarosForumProfile($this); $this->editor = new AsgarosForumEditor($this); $this->reactions = new AsgarosForumReactions($this); $this->mentioning = new AsgarosForumMentioning($this); $this->notifications = new AsgarosForumNotifications($this); $this->appearance = new AsgarosForumAppearance($this); $this->uploads = new AsgarosForumUploads($this); $this->search = new AsgarosForumSearch($this); $this->online = new AsgarosForumOnline($this); $this->content = new AsgarosForumContent($this); $this->breadcrumbs = new AsgarosForumBreadCrumbs($this); $this->activity = new AsgarosForumActivity($this); $this->memberslist = new AsgarosForumMembersList($this); $this->pagination = new AsgarosForumPagination($this); $this->unread = new AsgarosForumUnread($this); $this->feed = new AsgarosForumFeed($this); $this->permissions = new AsgarosForumPermissions($this); $this->ads = new AsgarosForumAds($this); $this->approval = new AsgarosForumApproval($this); $this->spoilers = new AsgarosForumSpoilers($this); $this->polls = new AsgarosForumPolls($this); } //====================================================================== // FUNCTIONS FOR GETTING AND SETTING OPTIONS. //====================================================================== function loadOptions() { // Get current options. $current_options = get_option('asgarosforum_options', array()); // Merge options if current options are present, otherwise use default-options. if (!empty($current_options)) { $this->options = array_merge($this->options_default, $current_options); } else { $this->options = $this->options_default; } $this->options_editor['teeny'] = $this->options['minimalistic_editor']; // Ensure default values if some needed files got deleted. if (empty($this->options['forum_title'])) { $this->options['forum_title'] = __('Forum', 'asgaros-forum'); } if (empty($this->options['notification_sender_name'])) { $this->options['notification_sender_name'] = get_bloginfo('name'); } if (empty($this->options['notification_sender_mail'])) { $this->options['notification_sender_mail'] = get_bloginfo('admin_email'); } if (empty($this->options['receivers_admin_notifications'])) { $this->options['receivers_admin_notifications'] = get_bloginfo('admin_email'); } if (empty($this->options['mail_template_new_post_subject'])) { $this->options['mail_template_new_post_subject'] = __('New answer: ###TITLE###', 'asgaros-forum'); } if (empty($this->options['mail_template_new_post_message'])) { $this->options['mail_template_new_post_message'] = __('Hello ###USERNAME###,

You received this message because there is a new answer in a forum-topic you have subscribed to.

Topic:
###TITLE###

Author:
###AUTHOR###

Answer:
###CONTENT###

Link:
###LINK###

If you dont want to receive these mails anymore you can unsubscribe via the subscription-area. Please dont answer to this mail!', 'asgaros-forum'); } if (empty($this->options['mail_template_new_topic_subject'])) { $this->options['mail_template_new_topic_subject'] = __('New topic: ###TITLE###', 'asgaros-forum'); } if (empty($this->options['mail_template_new_topic_message'])) { $this->options['mail_template_new_topic_message'] = __('Hello ###USERNAME###,

You received this message because there is a new forum-topic.

Topic:
###TITLE###

Author:
###AUTHOR###

Text:
###CONTENT###

Link:
###LINK###

If you dont want to receive these mails anymore you can unsubscribe via the subscription-area. Please dont answer to this mail!', 'asgaros-forum'); } if (empty($this->options['mail_template_mentioned_subject'])) { $this->options['mail_template_mentioned_subject'] = __('You have been mentioned!', 'asgaros-forum'); } if (empty($this->options['mail_template_mentioned_message'])) { $this->options['mail_template_mentioned_message'] = __('Hello ###USERNAME###,

You have been mentioned in a forum-post.

Topic:
###TITLE###

Author:
###AUTHOR###

Text:
###CONTENT###

Link:
###LINK###', 'asgaros-forum'); } } function saveOptions($options) { update_option('asgarosforum_options', $options); // Reload options after saving them. $this->loadOptions(); } //====================================================================== // FUNCTIONS FOR PAGE TITLE. //====================================================================== function change_wp_title($title, $sep, $seplocation) { return $this->get_title($title); } function change_document_title_parts($title) { $title['title'] = $this->get_title($title['title']); return $title; } function change_pre_get_document_title($title) { // Only modify it when a title is already set. if (!empty($title)) { $title = $this->get_title($title); } return $title; } function get_title($title) { if ($this->executePlugin) { $metaTitle = $this->getMetaTitle(); if ($metaTitle) { $title = $metaTitle.' - '.$title; } } return $title; } // Gets the pages meta title. public function getMetaTitle() { // Get the main title by default with disabled default title generation. $metaTitle = $this->getMainTitle(false); // Apply custom modifications. if (!$this->error && $this->current_view) { if ($this->current_view === 'forum' && $this->current_forum) { $metaTitle = $this->addCurrentPageToString($metaTitle); } else if ($this->current_view === 'topic' && $this->current_topic) { $metaTitle = $this->addCurrentPageToString($metaTitle); } } return $metaTitle; } function prepare() { global $post; if (is_a($post, 'WP_Post') && $this->shortcode->checkForShortcode($post)) { $this->executePlugin = true; $this->options['location'] = $post->ID; } do_action('asgarosforum_execution_check'); // Set all base links. if ($this->executePlugin || get_post($this->options['location'])) { $this->rewrite->set_links(); } if (!$this->executePlugin) { return; } // Parse the URL. $this->rewrite->parse_url(); // Update online status. $this->online->update_online_status(); do_action('asgarosforum_prepare'); switch ($this->current_view) { case 'forum': case 'addtopic': $this->setParents($this->current_element, 'forum'); break; case 'movetopic': case 'topic': case 'addpost': $this->setParents($this->current_element, 'topic'); break; case 'editpost': $this->setParents($this->current_element, 'post'); break; case 'markallread': case 'unread': break; case 'subscriptions': // Go back to the overview when this functionality is not enabled or the user is not logged-in. if (!$this->options['allow_subscriptions'] || !is_user_logged_in()) { $this->current_view = 'overview'; } break; case 'search': // Go back to the overview when this functionality is not enabled. if (!$this->options['enable_search']) { $this->current_view = 'overview'; } break; case 'profile': case 'history': if (!$this->profile->functionalityEnabled()) { $this->current_view = 'overview'; } break; case 'members': // Go back to the overview when this functionality is not enabled. if (!$this->memberslist->functionality_enabled()) { $this->current_view = 'overview'; } break; case 'activity': if (!$this->activity->functionality_enabled()) { $this->current_view = 'overview'; } break; case 'unapproved': // Ensure that the user is at least a moderator. if (!$this->permissions->isModerator('current')) { $this->current_view = 'overview'; } break; case 'reports': // Ensure that the user is at least a moderator. if (!$this->permissions->isModerator('current')) { $this->current_view = 'overview'; } break; default: $this->current_view = 'overview'; break; } $this->shortcode->handleAttributes(); // Check access. $this->check_access(); // Override editor settings. $this->options_editor = apply_filters('asgarosforum_filter_editor_settings', $this->options_editor); // Prevent generation of some head-elements. remove_action('wp_head', 'rel_canonical'); remove_action('wp_head', 'wp_shortlink_wp_head'); remove_action('wp_head', 'wp_oembed_add_discovery_links'); if (isset($_POST['submit_action'])) { $this->content->do_insertion(); } else if (isset($_GET['move_topic'])) { $this->moveTopic(); } else if (isset($_GET['delete_topic'])) { $this->delete_topic($this->current_topic); } else if (isset($_GET['remove_post'])) { $post_id = (!empty($_GET['post'])) ? absint($_GET['post']) : 0; $this->remove_post($post_id); } else if (!empty($_POST['sticky_topic']) || isset($_GET['sticky_topic'])) { $sticky_mode = 1; if (!empty($_POST['sticky_topic'])) { $sticky_mode = intval($_POST['sticky_topic']); } $this->set_sticky($this->current_topic, $sticky_mode); } else if (isset($_GET['unsticky_topic'])) { $this->set_sticky($this->current_topic, 0); } else if (isset($_GET['open_topic'])) { $this->change_status('open'); } else if (isset($_GET['close_topic'])) { $this->change_status('closed'); } else if (isset($_GET['approve_topic'])) { $this->approval->approve_topic($this->current_topic); } else if (isset($_GET['subscribe_topic'])) { $topic_id = $_GET['subscribe_topic']; $this->notifications->subscribe_topic($topic_id); } else if (isset($_GET['unsubscribe_topic'])) { $topic_id = $_GET['unsubscribe_topic']; $this->notifications->unsubscribe_topic($topic_id); } else if (isset($_GET['subscribe_forum'])) { $forum_id = $_GET['subscribe_forum']; $this->notifications->subscribe_forum($forum_id); } else if (isset($_GET['unsubscribe_forum'])) { $forum_id = $_GET['unsubscribe_forum']; $this->notifications->unsubscribe_forum($forum_id); } else if (isset($_GET['report_add'])) { $post_id = (!empty($_GET['post'])) ? absint($_GET['post']) : 0; $reporter_id = get_current_user_id(); $this->reports->add_report($post_id, $reporter_id); } else if (!empty($_GET['report_delete']) && is_numeric($_GET['report_delete'])) { $this->reports->remove_report($_GET['report_delete']); } do_action('asgarosforum_prepare_'.$this->current_view); } function check_access() { // Check login access. if ($this->options['require_login'] && !is_user_logged_in()) { $this->error = __('Sorry, only logged-in users can access the forum.', 'asgaros-forum'); $this->error = apply_filters('asgarosforum_filter_error_message_require_login', $this->error); return; } // Check category access. $this->category_access_level = get_term_meta($this->current_category, 'category_access', true); if ($this->category_access_level) { if ($this->category_access_level === 'loggedin' && !is_user_logged_in()) { $this->error = __('Sorry, only logged-in users can access this category.', 'asgaros-forum'); return; } if ($this->category_access_level === 'moderator' && !$this->permissions->isModerator('current')) { $this->error = __('Sorry, you cannot access this area.', 'asgaros-forum'); return; } } // Check usergroups access. if (!AsgarosForumUserGroups::checkAccess($this->current_category)) { $this->error = __('Sorry, you cannot access this area.', 'asgaros-forum'); return; } if ($this->current_view === 'topic' || $this->current_view === 'addpost') { // Check topic-access. if ($this->options['require_login_posts'] && !is_user_logged_in()) { $this->error = __('Sorry, only logged-in users can access this topic.', 'asgaros-forum'); return; } // Check unapproved-topic access. if (!$this->approval->is_topic_approved($this->current_topic) && !$this->permissions->isModerator('current')) { $this->rewrite->redirect('overview'); } } // Check custom access. $custom_access = apply_filters('asgarosforum_filter_check_access', true, $this->current_category); if (!$custom_access) { $this->error = __('Sorry, you cannot access this area.', 'asgaros-forum'); return; } // Add a login-notice if necessary. if (!is_user_logged_in() && !$this->options['allow_guest_postings']) { $notice = __('You need to log in to create posts and topics.', 'asgaros-forum'); $notice = apply_filters('asgarosforum_filter_login_message', $notice); $this->add_notice($notice); } } function enqueue_css_js() { if ($this->options['load_fontawesome']) { wp_enqueue_style('af-fontawesome', $this->plugin_url.'libs/fontawesome/css/all.min.css', array(), $this->version); } if ($this->options['load_fontawesome_compat_v4']) { wp_enqueue_style('af-fontawesome-compat-v4', $this->plugin_url.'libs/fontawesome/css/v4-shims.min.css', array(), $this->version); } $themeurl = $this->appearance->get_current_theme_url(); wp_enqueue_style('af-widgets', $themeurl.'/widgets.css', array(), $this->version); if (!$this->executePlugin) { return; } wp_enqueue_style('af-style', $themeurl.'/style.css', array(), $this->version); if (is_rtl()) { wp_enqueue_style('af-rtl', $themeurl.'/rtl.css', array(), $this->version); } wp_enqueue_script('asgarosforum-js', $this->plugin_url.'js/script.js', array('jquery', 'wp-api'), $this->version); wp_localize_script('wp-api', 'wpApiSettings', array('root' => esc_url_raw(rest_url()), 'nonce' => wp_create_nonce('wp_rest'))); if ($this->options['enable_spoilers']) { wp_enqueue_script('asgarosforum-js-spoilers', $this->plugin_url.'js/script-spoilers.js', array('jquery'), $this->version); } do_action('asgarosforum_enqueue_css_js'); } // Gets the pages main title. public function getMainTitle($setDefaultTitle = true) { $mainTitle = false; if ($setDefaultTitle) { $mainTitle = $this->options['forum_title']; } if (!$this->error && $this->current_view) { if ($this->current_view === 'forum' && $this->current_forum) { $mainTitle = esc_html(stripslashes($this->current_forum_name)); } else if ($this->current_view === 'topic' && $this->current_topic) { $mainTitle = esc_html(stripslashes($this->current_topic_name)); } else if ($this->current_view === 'editpost') { $mainTitle = __('Edit Post', 'asgaros-forum'); } else if ($this->current_view === 'addpost') { $mainTitle = __('Post Reply', 'asgaros-forum').': '.esc_html(stripslashes($this->current_topic_name)); } else if ($this->current_view === 'addtopic') { $mainTitle = __('New Topic', 'asgaros-forum'); } else if ($this->current_view === 'movetopic') { $mainTitle = __('Move Topic', 'asgaros-forum'); } else if ($this->current_view === 'search') { $mainTitle = __('Search', 'asgaros-forum'); } else if ($this->current_view === 'subscriptions') { $mainTitle = __('Subscriptions', 'asgaros-forum'); } else if ($this->current_view === 'profile') { $mainTitle = $this->profile->get_profile_title(); } else if ($this->current_view === 'history') { $mainTitle = $this->profile->get_history_title(); } else if ($this->current_view === 'members') { $mainTitle = __('Members', 'asgaros-forum'); } else if ($this->current_view === 'activity') { $mainTitle = __('Activity', 'asgaros-forum'); } else if ($this->current_view === 'unread') { $mainTitle = __('Unread Topics', 'asgaros-forum'); } else if ($this->current_view === 'unapproved') { $mainTitle = __('Unapproved Topics', 'asgaros-forum'); } else if ($this->current_view === 'reports') { $mainTitle = __('Reports', 'asgaros-forum'); } } return $mainTitle; } // Adds the current page to a string. function addCurrentPageToString($someString) { if ($this->current_page > 0) { $currentPage = $this->current_page + 1; $someString .= ' - '.__('Page', 'asgaros-forum').' '.$currentPage; } return $someString; } // Holds all notices. private $notices = array(); // Adds a new notice to the notices array. function add_notice($notice_message, $notice_link = false, $notice_icon = false) { $this->notices[] = array( 'message' => $notice_message, 'link' => $notice_link, 'icon' => $notice_icon ); } // Renders a single given notice. function render_notice($notice_message, $notice_link = false, $notice_icon = false, $in_panel = false) { if ($in_panel) { echo '
'; } } // Renders all existing notices. function render_notices() { if (!empty($this->notices)) { echo '
'; foreach ($this->notices as $notice) { $this->render_notice($notice['message'], $notice['link'], $notice['icon']); } echo '
'; } } function forum() { ob_start(); echo '
'; do_action('asgarosforum_content_top'); do_action('asgarosforum_'.$this->current_view.'_custom_content_top'); // Show Header Area except for single posts. if ($this->current_view !== 'post') { $this->showHeader(); do_action('asgarosforum_content_header'); } if (!empty($this->error)) { echo '
'.$this->error.'
'; } else { if ($this->current_view === 'post') { $this->showSinglePost(); } else { $this->render_notices(); $this->showMainTitleAndDescription(); switch ($this->current_view) { case 'search': $this->search->show_search_results(); break; case 'subscriptions': $this->notifications->show_subscription_overview(); break; case 'movetopic': $this->showMoveTopic(); break; case 'forum': $this->show_forum(); break; case 'topic': $this->showTopic(); break; case 'addtopic': case 'addpost': case 'editpost': $this->editor->showEditor($this->current_view); break; case 'profile': $this->profile->showProfile(); break; case 'history': $this->profile->show_history(); break; case 'members': $this->memberslist->show_memberslist(); break; case 'activity': $this->activity->show_activity(); break; case 'unread': $this->unread->show_unread_topics(); break; case 'unapproved': $this->approval->show_unapproved_topics(); break; case 'reports': $this->reports->show_reports(); break; default: $this->overview(); break; } // Action hook for optional bottom navigation elements. echo '
'; do_action('asgarosforum_bottom_navigation', $this->current_view); echo '
'; } } do_action('asgarosforum_content_bottom'); do_action('asgarosforum_'.$this->current_view.'_custom_content_bottom'); echo '
'; echo '
'; return ob_get_clean(); } function showMainTitleAndDescription() { $mainTitle = $this->getMainTitle(); echo '

'; // Show lock symbol for closed topics. if ($this->current_view == 'topic' && $this->is_topic_closed($this->current_topic)) { echo ''; } echo $mainTitle; echo '

'; if ($this->current_view === 'forum' && $this->options['show_description_in_forum'] && !empty($this->current_description)) { $forum_object = $this->content->get_forum($this->current_forum); echo '
'.stripslashes($forum_object->description).'
'; } } function overview() { $categories = $this->content->get_categories(); require('views/overview.php'); } function showSinglePost() { $counter = 0; $topicStarter = $this->get_topic_starter($this->current_topic); $post = $this->content->get_post($this->current_post); echo '
'; require('views/post-element.php'); } function show_forum() { require('views/forum.php'); } function render_topic_element($topic_object, $topic_type = 'topic-normal', $show_topic_location = false) { $lastpost_data = $this->get_lastpost_in_topic($topic_object->id); $unread_status = $this->unread->get_status_topic($topic_object->id); $topic_title = esc_html(stripslashes($topic_object->name)); echo '
'; echo '
'; echo '
'; if ($this->is_topic_sticky($topic_object->id)) { echo ''; } if ($this->is_topic_closed($topic_object->id)) { echo ''; } if ($this->polls->has_poll($topic_object->id)) { echo ''; } echo ''; echo $topic_title; echo ''; echo ''; echo __('By', 'asgaros-forum').' '.$this->getUsername($topic_object->author_id); // Show the name of the forum in which a topic is located in. This is currently only used for search results. if ($show_topic_location) { echo ' · '; echo __('In', 'asgaros-forum').' '; echo ''; echo esc_html(stripslashes($topic_object->forum_name)); echo ''; } $this->pagination->renderTopicOverviewPagination($topic_object->id, ($topic_object->answers + 1)); echo ''; // Show topic stats. echo ''; $count_answers_i18n = number_format_i18n($topic_object->answers); echo sprintf(_n('%s Answer', '%s Answers', $topic_object->answers, 'asgaros-forum'), $count_answers_i18n); if ($this->options['count_topic_views']) { $count_views_i18n = number_format_i18n($topic_object->views); echo ' · '; echo sprintf(_n('%s View', '%s Views', $topic_object->views, 'asgaros-forum'), $count_views_i18n); } echo ''; // Show lastpost info. echo ''; echo $this->render_lastpost_in_topic($topic_object->id, true); echo ''; echo '
'; do_action('asgarosforum_custom_topic_column', $topic_object->id); echo '
'.$this->render_lastpost_in_topic($topic_object->id).'
'; echo '
'; do_action('asgarosforum_after_topic'); } // Renders all subforums inside of a category/forum combination. function render_subforums($category_id, $forum_id) { $subforums = $this->get_forums($category_id, $forum_id); if (!empty($subforums)) { echo '
'; echo __('Subforums', 'asgaros-forum'); echo ''.__('Last post', 'asgaros-forum').''; echo '
'; echo '
'; foreach ($subforums as $forum) { require('views/forum-element.php'); } echo '
'; } } function showTopic() { // Create a unique slug for this topic if necessary. $topic = $this->content->get_topic($this->current_topic); if (empty($topic->slug)) { $slug = $this->rewrite->create_unique_slug($topic->name, $this->tables->topics, 'topic'); $this->db->update($this->tables->topics, array('slug' => $slug), array('id' => $topic->id), array('%s'), array('%d')); } // Get posts of topic. $posts = $this->get_posts(); if ($posts) { $this->incrementTopicViews(); require('views/topic.php'); } else { $this->render_notice(__('Sorry, but there are no posts.', 'asgaros-forum')); } } public function incrementTopicViews() { if ($this->options['count_topic_views']) { $this->db->query($this->db->prepare("UPDATE {$this->tables->topics} SET views = views + 1 WHERE id = %d", $this->current_topic)); } } function showMoveTopic() { if ($this->permissions->isModerator('current')) { $strOUT = '
'; $strOUT .= '
'.sprintf(__('Move "%s" to new forum:', 'asgaros-forum'), esc_html(stripslashes($this->current_topic_name))).'
'; $strOUT .= '
'; $strOUT .= '



'; echo $strOUT; } else { $this->render_notice(__('You are not allowed to move topics.', 'asgaros-forum')); } } function get_category_name($category_id) { $category = get_term($category_id, 'asgarosforum-category'); if ($category) { return $category->name; } else { return false; } } var $topic_counters_cache = false; function get_topic_counters() { // If the cache is not set yet, create it. if ($this->topic_counters_cache === false) { // Get all topic-counters of each forum first. $topic_counters = $this->db->get_results("SELECT parent_id AS forum_id, COUNT(*) AS topic_counter FROM {$this->tables->topics} WHERE approved = 1 GROUP BY parent_id;"); // Assign topic-counter for each forum. if (!empty($topic_counters)) { foreach ($topic_counters as $counter) { $this->topic_counters_cache[$counter->forum_id] = $counter->topic_counter; } } // Now get all subforums. $subforums = $this->content->get_all_subforums(); // Re-assign topic-counter for each forum based on the topic-counters in its subforums. if (!empty($subforums)) { foreach ($subforums as $subforum) { // Continue if the subforum has no topics. if (!isset($this->topic_counters_cache[$subforum->id])) { continue; } // Re-assign value when the parent-forum has no topics. if (!isset($this->topic_counters_cache[$subforum->parent_forum])) { $this->topic_counters_cache[$subforum->parent_forum] = $this->topic_counters_cache[$subforum->id]; continue; } // Otherwise add subforum-topics to the counter of the parent forum. $this->topic_counters_cache[$subforum->parent_forum] = ($this->topic_counters_cache[$subforum->parent_forum] + $this->topic_counters_cache[$subforum->id]); } } } return $this->topic_counters_cache; } function get_forum_topic_counter($forum_id) { $counters = $this->get_topic_counters(); if (isset($counters[$forum_id])) { return intval($counters[$forum_id]); } else { return 0; } } var $post_counters_cache = false; function get_post_counters() { // If the cache is not set yet, create it. if ($this->post_counters_cache === false) { // Get all post-counters of each forum first. $post_counters = $this->db->get_results("SELECT t.parent_id AS forum_id, COUNT(*) AS post_counter FROM {$this->tables->posts} AS p, {$this->tables->topics} AS t WHERE p.parent_id = t.id AND t.approved = 1 GROUP BY t.parent_id;"); // Assign post-counter for each forum. if (!empty($post_counters)) { foreach ($post_counters as $counter) { $this->post_counters_cache[$counter->forum_id] = $counter->post_counter; } } // Now get all subforums. $subforums = $this->content->get_all_subforums(); // Re-assign post-counter for each forum based on the post-counters in its subforums. if (!empty($subforums)) { foreach ($subforums as $subforum) { // Continue if the subforum has no posts. if (!isset($this->post_counters_cache[$subforum->id])) { continue; } // Re-assign value when the parent-forum has no posts. if (!isset($this->post_counters_cache[$subforum->parent_forum])) { $this->post_counters_cache[$subforum->parent_forum] = $this->post_counters_cache[$subforum->id]; continue; } // Otherwise add subforum-posts to the counter of the parent forum. $this->post_counters_cache[$subforum->parent_forum] = ($this->post_counters_cache[$subforum->parent_forum] + $this->post_counters_cache[$subforum->id]); } } } return $this->post_counters_cache; } function get_forum_post_counter($forum_id) { $counters = $this->get_post_counters(); if (isset($counters[$forum_id])) { return intval($counters[$forum_id]); } else { return 0; } } function get_forums($id = false, $parent_forum = 0, $output_type = OBJECT) { if ($id) { $query_count_subforums = "SELECT COUNT(*) FROM {$this->tables->forums} WHERE parent_forum = f.id"; return $this->db->get_results($this->db->prepare("SELECT f.*, ({$query_count_subforums}) AS count_subforums FROM {$this->tables->forums} AS f WHERE f.parent_id = %d AND f.parent_forum = %d ORDER BY f.sort ASC;", $id, $parent_forum), $output_type); } } function getSpecificForums($ids) { $results = $this->db->get_results("SELECT id, parent_id AS category_id, name FROM {$this->tables->forums} WHERE id IN (".implode(',', $ids).") ORDER BY id ASC;"); return $results; } function getSpecificTopics($ids) { $results = $this->db->get_results("SELECT t.id, f.parent_id AS category_id, t.name FROM {$this->tables->topics} AS t LEFT JOIN {$this->tables->forums} AS f ON (f.id = t.parent_id) WHERE t.id IN (".implode(',', $ids).") ORDER BY t.id ASC;"); return $results; } function get_posts() { $start = $this->current_page * $this->options['posts_per_page']; $end = $this->options['posts_per_page']; $order = apply_filters('asgarosforum_filter_get_posts_order', 'p1.id ASC'); $results = $this->db->get_results($this->db->prepare("SELECT p1.id, p1.text, p1.date, p1.date_edit, p1.author_id, p1.author_edit, (SELECT COUNT(*) FROM {$this->tables->posts} AS p2 WHERE p2.author_id = p1.author_id) AS author_posts, p1.uploads FROM {$this->tables->posts} AS p1 WHERE p1.parent_id = %d ORDER BY {$order} LIMIT %d, %d;", $this->current_topic, $start, $end)); $results = apply_filters('asgarosforum_filter_get_posts', $results); return $results; } private $is_first_post_cache = array(); function is_first_post($post_id, $topic_id = false) { // When we dont know the topic-id, we need to figure it out. if (!$topic_id) { // Check if there exists an current-topic-id. if ($this->current_topic) { $topic_id = $this->current_topic; } } if (empty($this->is_first_post_cache[$topic_id])) { $this->is_first_post_cache[$topic_id] = $this->db->get_var("SELECT id FROM {$this->tables->posts} WHERE parent_id = {$topic_id} ORDER BY id ASC LIMIT 1;"); } if ($post_id == $this->is_first_post_cache[$topic_id]) { return true; } else { return false; } } function cut_string($string, $length = 33) { if (strlen($string) > $length) { return mb_substr($string, 0, $length, 'UTF-8') . ' …'; } return $string; } // TODO: Clean up the complete username logic ... function get_plain_username($user_id) { if ($user_id) { $user = get_userdata($user_id); if ($user) { return $user->display_name; } else { return __('Deleted user', 'asgaros-forum'); } } else { return __('Guest', 'asgaros-forum'); } } /** * Returns and caches a username. */ var $cacheGetUsername = array(); function getUsername($user_id) { if ($user_id) { if (empty($this->cacheGetUsername[$user_id])) { $user = get_userdata($user_id); if ($user) { $this->cacheGetUsername[$user_id] = $this->renderUsername($user); } else { $this->cacheGetUsername[$user_id] = __('Deleted user', 'asgaros-forum'); } } return $this->cacheGetUsername[$user_id]; } else { return __('Guest', 'asgaros-forum'); } } /** * Renders a username. */ function renderUsername($userObject, $custom_name = false) { $user_name = $userObject->display_name; if ($custom_name) { $user_name = $custom_name; } $renderedUserName = $user_name; $profileLink = $this->profile->getProfileLink($userObject); if ($profileLink) { $renderedUserName = ''.$user_name.'';; } else { $renderedUserName = $user_name; } $renderedUserName = $this->highlight_username($userObject, $renderedUserName); return $renderedUserName; } /** * Highlights a username when he is an administrator/moderator. */ function highlight_username($user, $string) { if ($this->options['highlight_admin']) { if ($this->permissions->isAdministrator($user->ID)) { return ''.$string.''; } else if ($this->permissions->isModerator($user->ID)) { return ''.$string.''; } } return $string; } private $lastpost_forum_cache = false; function lastpost_forum_cache() { if ($this->lastpost_forum_cache === false) { // Get all lastpost-elements of each forum first. Selection on topics is needed here because we only want posts of approved topics. $lastpost_elements = $this->db->get_results("SELECT t.parent_id AS forum_id, MAX(p.id) AS id FROM {$this->tables->posts} AS p, {$this->tables->topics} AS t WHERE p.parent_id = t.id AND t.approved = 1 GROUP BY t.parent_id;"); // Assign lastpost-ids for each forum. if (!empty($lastpost_elements)) { foreach ($lastpost_elements as $element) { $this->lastpost_forum_cache[$element->forum_id] = $element->id; } } // Now get all subforums. $subforums = $this->content->get_all_subforums(); // Re-assign lastpost-ids for each forum based on the lastposts in its subforums. if (!empty($subforums)) { foreach ($subforums as $subforum) { // Continue if the subforum has no posts. if (!isset($this->lastpost_forum_cache[$subforum->id])) { continue; } // Re-assign value when the parent-forum has no posts. if (!isset($this->lastpost_forum_cache[$subforum->parent_forum])) { $this->lastpost_forum_cache[$subforum->parent_forum] = $this->lastpost_forum_cache[$subforum->id]; } // Otherwise re-assign value when a subforum has a more recent post. if ($this->lastpost_forum_cache[$subforum->id] > $this->lastpost_forum_cache[$subforum->parent_forum]) { $this->lastpost_forum_cache[$subforum->parent_forum] = $this->lastpost_forum_cache[$subforum->id]; } } } } } private $get_lastpost_in_forum_cache = array(); function get_lastpost_in_forum($forum_id) { if (!isset($this->get_lastpost_in_forum_cache[$forum_id])) { $this->lastpost_forum_cache(); if (isset($this->lastpost_forum_cache[$forum_id])) { $this->get_lastpost_in_forum_cache[$forum_id] = $this->db->get_row("SELECT p.id, p.date, p.parent_id, p.author_id, t.name FROM {$this->tables->posts} AS p, {$this->tables->topics} AS t WHERE p.id = ".$this->lastpost_forum_cache[$forum_id]." AND t.id = p.parent_id;"); } else { $this->get_lastpost_in_forum_cache[$forum_id] = false; } } return $this->get_lastpost_in_forum_cache[$forum_id]; } function render_lastpost_in_forum($forum_id, $compact = false) { $lastpost = $this->get_lastpost_in_forum($forum_id); if ($lastpost === false) { return ''.__('No topics yet!', 'asgaros-forum').''; } else { $output = ''; $post_link = $this->rewrite->get_post_link($lastpost->id, $lastpost->parent_id); if ($compact === true) { $output .= __('Last post:', 'asgaros-forum'); $output .= ' '; $output .= ''.esc_html($this->cut_string(stripslashes($lastpost->name), 34)).''; $output .= ' · '; $output .= ''.sprintf(__('%s ago', 'asgaros-forum'), human_time_diff(strtotime($lastpost->date), current_time('timestamp'))).''; $output .= ' · '; $output .= $this->getUsername($lastpost->author_id); } else { // Avatar if ($this->options['enable_avatars']) { $output .= '
'.get_avatar($lastpost->author_id, 40, '', '', array('force_display' => true)).'
'; } // Summary $output .= '
'; $output .= ''.esc_html($this->cut_string(stripslashes($lastpost->name), 25)).'
'; $output .= ''; $output .= ''.sprintf(__('%s ago', 'asgaros-forum'), human_time_diff(strtotime($lastpost->date), current_time('timestamp'))).''; $output .= ' · '; $output .= $this->getUsername($lastpost->author_id); $output .= ''; $output .= '
'; } return $output; } } function get_lastpost_in_topic($topic_id) { if (empty($this->cache['get_lastpost_in_topic'][$topic_id])) { $this->cache['get_lastpost_in_topic'][$topic_id] = $this->db->get_row("SELECT id, date, author_id, parent_id FROM {$this->tables->posts} WHERE parent_id = {$topic_id} ORDER BY id DESC LIMIT 1;"); } return $this->cache['get_lastpost_in_topic'][$topic_id]; } function render_lastpost_in_topic($topic_id, $compact = false) { $lastpost = $this->get_lastpost_in_topic($topic_id); $output = ''; $post_link = $this->rewrite->get_post_link($lastpost->id, $lastpost->parent_id); if ($compact === true) { $output .= __('Last post:', 'asgaros-forum'); $output .= ' '; $output .= ''.sprintf(__('%s ago', 'asgaros-forum'), human_time_diff(strtotime($lastpost->date), current_time('timestamp'))).''; $output .= ' · '; $output .= $this->getUsername($lastpost->author_id); } else { // Avatar if ($this->options['enable_avatars']) { $output .= '
'.get_avatar($lastpost->author_id, 40, '', '', array('force_display' => true)).'
'; } // Summary $output .= '
'; $output .= ''.sprintf(__('%s ago', 'asgaros-forum'), human_time_diff(strtotime($lastpost->date), current_time('timestamp'))).'
'; $output .= ''; $output .= $this->getUsername($lastpost->author_id); $output .= ''; $output .= '
'; } return $output; } function get_topic_starter($topic_id) { return $this->db->get_var($this->db->prepare("SELECT author_id FROM {$this->tables->posts} WHERE parent_id = %d ORDER BY id ASC LIMIT 1;", $topic_id)); } function format_date($date, $full = true) { if ($full) { return date_i18n($this->date_format.', '.$this->time_format, strtotime($date)); } else { return date_i18n($this->date_format, strtotime($date)); } } function current_time() { return current_time('Y-m-d H:i:s'); } function get_post_author($post_id) { return $this->db->get_var($this->db->prepare("SELECT author_id FROM {$this->tables->posts} WHERE id = %d;", $post_id)); } function get_post_date($post_id) { return $this->db->get_var($this->db->prepare("SELECT `date` FROM {$this->tables->posts} WHERE id = %d;", $post_id)); } // Returns the topics created by a user. function countTopicsByUser($user_id) { return $this->db->get_var("SELECT COUNT(*) FROM {$this->tables->posts} WHERE id IN (SELECT MIN(id) FROM {$this->tables->posts} GROUP BY parent_id) AND author_id = {$user_id};"); } function countPostsByUser($userID) { return $this->db->get_var("SELECT COUNT(*) FROM {$this->tables->posts} WHERE author_id = {$userID};"); } /** * Generating menus for forums, topics and posts. */ function showForumMenu() { $menu = ''; if ($this->forumIsOpen()) { if ((is_user_logged_in() && !$this->permissions->isBanned('current')) || (!is_user_logged_in() && $this->options['allow_guest_postings'])) { // New topic button. $menu .= ''; } } $menu = apply_filters('asgarosforum_filter_forum_menu', $menu); return $menu; } public function render_sticky_panel() { // Cancel if the current user is not at least a moderator. if (!$this->permissions->isModerator('current')) { return; } echo '
'; echo '
'; echo ''; echo __('Select Sticky Mode:', 'asgaros-forum'); echo '
'; echo '
'; echo '
'; echo '
'; echo ''; echo ''; echo '
'; echo '
'; echo '
'; echo '
'; } function show_topic_menu($show_all_buttons = true) { $menu = ''; $current_user_id = get_current_user_id(); // Show answer and certain moderation-buttons only for approved topics. if ($this->approval->is_topic_approved($this->current_topic)) { if ($this->permissions->can_create_post($current_user_id)) { // Reply button. $menu .= ''; $menu .= ''; $menu .= __('Reply', 'asgaros-forum'); $menu .= ''; } if ($this->permissions->isModerator('current') && $show_all_buttons) { // Move button. $menu .= ''; $menu .= ''; $menu .= __('Move', 'asgaros-forum'); $menu .= ''; if ($this->is_topic_sticky($this->current_topic)) { // Undo sticky button. $menu .= ''; $menu .= ''; $menu .= __('Unsticky', 'asgaros-forum'); $menu .= ''; } else { // Sticky button. $menu .= ''; $menu .= ''; $menu .= __('Sticky', 'asgaros-forum'); $menu .= ''; } if ($this->is_topic_closed($this->current_topic)) { // Open button. $menu .= ''; $menu .= ''; $menu .= __('Open', 'asgaros-forum'); $menu .= ''; } else { // Close button. $menu .= ''; $menu .= ''; $menu .= __('Close', 'asgaros-forum'); $menu .= ''; } } } else { if ($this->permissions->isModerator('current') && $show_all_buttons) { // Approve button. if (!$this->approval->is_topic_approved($this->current_topic)) { $menu .= ''; $menu .= ''; $menu .= __('Approve', 'asgaros-forum'); $menu .= ''; } } } if ($this->permissions->can_delete_topic($current_user_id, $this->current_topic) && $show_all_buttons) { // Delete button. $menu .= ''; $menu .= ''; $menu .= __('Delete', 'asgaros-forum'); $menu .= ''; } $menu = (!empty($menu)) ? '
'.$menu.'
' : $menu; $menu = apply_filters('asgarosforum_filter_topic_menu', $menu); return $menu; } function show_post_menu($post_id, $author_id, $counter, $post_date) { $menu = ''; // Only show post-menu when the topic is approved. if ($this->approval->is_topic_approved($this->current_topic)) { if (is_user_logged_in()) { $current_user_id = get_current_user_id(); if ($this->permissions->can_delete_post($current_user_id, $post_id, $author_id, $post_date) && ($counter > 1 || $this->current_page >= 1)) { // Delete button. $menu .= ''; $menu .= ''; $menu .= __('Delete', 'asgaros-forum'); $menu .= ''; } if ($this->permissions->can_edit_post($current_user_id, $post_id, $author_id, $post_date)) { // Edit button. $menu .= ''; $menu .= ''; $menu .= __('Edit', 'asgaros-forum'); $menu .= ''; } } if ($this->permissions->isModerator('current') || (!$this->is_topic_closed($this->current_topic) && ((is_user_logged_in() && !$this->permissions->isBanned('current')) || (!is_user_logged_in() && $this->options['allow_guest_postings'])))) { // Quote button. $menu .= ''; $menu .= ''; $menu .= __('Quote', 'asgaros-forum'); $menu .= ''; } } $menu = (!empty($menu)) ? '
'.$menu.'
' : $menu; $menu = apply_filters('asgarosforum_filter_post_menu', $menu); return $menu; } function showHeader() { echo '
'; echo ''; echo ''.__('Forum Navigation', 'asgaros-forum').''; echo '
'; echo ''.__('Forum', 'asgaros-forum').''; $this->profile->myProfileLink(); $this->memberslist->show_memberslist_link(); $this->notifications->show_subscription_overview_link(); $this->activity->show_activity_link(); $this->showLoginLink(); $this->showRegisterLink(); $this->showLogoutLink(); do_action('asgarosforum_custom_header_menu'); echo '
'; $this->search->show_search_input(); echo '
'; echo '
'; $this->breadcrumbs->show_breadcrumbs(); } function showLogoutLink() { if (is_user_logged_in() && $this->options['show_logout_button']) { echo ''.__('Logout', 'asgaros-forum').''; } } function showLoginLink() { if (!is_user_logged_in() && $this->options['show_login_button']) { echo ''; } } function showRegisterLink() { if (!is_user_logged_in() && $this->options['show_register_button']) { echo ''.__('Register', 'asgaros-forum').''; } } function delete_topic($topic_id, $admin_action = false, $permission_check = true) { // Cancel when no topic is given. if (!$topic_id) { return false; } // Cancel when topic does not exist. if (!$this->content->topic_exists($topic_id)) { return false; } // Cancel if user cannot delete topic. if ($permission_check) { $user_id = get_current_user_id(); if (!$this->permissions->can_delete_topic($user_id, $topic_id)) { return false; } } // Continue ... do_action('asgarosforum_before_delete_topic', $topic_id); // Delete posts. $posts = $this->db->get_col($this->db->prepare("SELECT id FROM {$this->tables->posts} WHERE parent_id = %d;", $topic_id)); foreach ($posts as $post) { $this->remove_post($post, false); } // Delete topic. $this->db->delete($this->tables->topics, array('id' => $topic_id), array('%d')); $this->notifications->remove_all_topic_subscriptions($topic_id); do_action('asgarosforum_after_delete_topic', $topic_id); if (!$admin_action) { wp_redirect(html_entity_decode($this->get_link('forum', $this->current_forum))); exit; } } function moveTopic() { $newForumID = $_POST['newForumID']; if ($this->permissions->isModerator('current') && $newForumID && $this->content->forum_exists($newForumID)) { $this->db->update($this->tables->topics, array('parent_id' => $newForumID), array('id' => $this->current_topic), array('%d'), array('%d')); $this->db->update($this->tables->posts, array('forum_id' => $newForumID), array('parent_id' => $this->current_topic), array('%d'), array('%d')); wp_redirect(html_entity_decode($this->get_link('topic', $this->current_topic))); exit; } } function remove_post($post_id, $permission_check = true) { // Cancel if no post is given. if (!$post_id) { return false; } // Cancel if post does not exist. if (!$this->content->post_exists($post_id)) { return false; } // Cancel if user cannot delete post. if ($permission_check) { $user_id = get_current_user_id(); if (!$this->permissions->can_delete_post($user_id, $post_id)) { return false; } } // Delete post. do_action('asgarosforum_before_delete_post', $post_id); $this->uploads->delete_post_files($post_id); $this->reports->remove_report($post_id, false); $this->reactions->remove_all_reactions($post_id); $this->db->delete($this->tables->posts, array('id' => $post_id), array('%d')); do_action('asgarosforum_after_delete_post', $post_id); } function change_status($property) { if ($this->permissions->isModerator('current')) { if ($property == 'closed') { $this->db->update($this->tables->topics, array('closed' => 1), array('id' => $this->current_topic), array('%d'), array('%d')); } else if ($property == 'open') { $this->db->update($this->tables->topics, array('closed' => 0), array('id' => $this->current_topic), array('%d'), array('%d')); } } } function set_sticky($topic_id, $sticky_mode) { if (!$this->permissions->isModerator('current')) { return; } // Ensure that only correct values can get set. switch ($sticky_mode) { case 0: case 1: case 2: $this->db->update($this->tables->topics, array('sticky' => $sticky_mode), array('id' => $topic_id), array('%d'), array('%d')); break; } } function is_topic_sticky($topic_id) { $status = $this->db->get_var("SELECT sticky FROM {$this->tables->topics} WHERE id = {$topic_id};"); if (intval($status) > 0) { return true; } else { return false; } } private $is_topic_closed_cache = array(); function is_topic_closed($topic_id) { if (!isset($this->is_topic_closed_cache[$topic_id])) { $status = $this->db->get_var("SELECT closed FROM {$this->tables->topics} WHERE id = {$topic_id};"); if (intval($status) === 1) { $this->is_topic_closed_cache[$topic_id] = true; } else { $this->is_topic_closed_cache[$topic_id] = false; } } return $this->is_topic_closed_cache[$topic_id]; } // Returns TRUE if the forum is opened or the user has at least moderator rights. function forumIsOpen() { if (!$this->permissions->isModerator('current')) { $closed = intval($this->db->get_var($this->db->prepare("SELECT closed FROM {$this->tables->forums} WHERE id = %d;", $this->current_forum))); if ($closed === 1) { return false; } } return true; } // Builds and returns a requested link. public function get_link($type, $elementID = false, $additionalParameters = false, $appendix = '', $escapeURL = true) { return $this->rewrite->get_link($type, $elementID, $additionalParameters, $appendix, $escapeURL); } // Checks if an element exists and sets all parent IDs based on the given id and its content type. public function setParents($id, $contentType) { // Set possible error messages. $error = array(); $error['post'] = __('Sorry, this post does not exist.', 'asgaros-forum'); $error['topic'] = __('Sorry, this topic does not exist.', 'asgaros-forum'); $error['forum'] = __('Sorry, this forum does not exist.', 'asgaros-forum'); if ($id) { $query = ''; $results = false; // Build the query. switch ($contentType) { case 'post': $query = "SELECT f.parent_id AS current_category, f.id AS current_forum, f.name AS current_forum_name, f.parent_forum AS parent_forum, pf.name AS parent_forum_name, t.id AS current_topic, t.name AS current_topic_name, p.id AS current_post, p.text AS current_description FROM {$this->tables->forums} AS f LEFT JOIN {$this->tables->forums} AS pf ON (pf.id = f.parent_forum) LEFT JOIN {$this->tables->topics} AS t ON (f.id = t.parent_id) LEFT JOIN {$this->tables->posts} AS p ON (t.id = p.parent_id) WHERE p.id = {$id};"; break; case 'topic': $query = "SELECT f.parent_id AS current_category, f.id AS current_forum, f.name AS current_forum_name, f.parent_forum AS parent_forum, pf.name AS parent_forum_name, t.id AS current_topic, t.name AS current_topic_name, (SELECT td.text FROM {$this->tables->posts} AS td WHERE td.parent_id = t.id ORDER BY td.id ASC LIMIT 1) AS current_description FROM {$this->tables->forums} AS f LEFT JOIN {$this->tables->forums} AS pf ON (pf.id = f.parent_forum) LEFT JOIN {$this->tables->topics} AS t ON (f.id = t.parent_id) WHERE t.id = {$id};"; break; case 'forum': $query = "SELECT f.parent_id AS current_category, f.id AS current_forum, f.name AS current_forum_name, f.parent_forum AS parent_forum, pf.name AS parent_forum_name, f.description AS current_description FROM {$this->tables->forums} AS f LEFT JOIN {$this->tables->forums} AS pf ON (pf.id = f.parent_forum) WHERE f.id = {$id};"; break; } $results = $this->db->get_row($query); // When the element exists, set parents and exit function. if ($results) { $this->current_description = ($contentType === 'post' || $contentType === 'topic' || $contentType === 'forum') ? $this->cut_string(str_replace(array("\r", "\n"), '', esc_html(strip_tags($results->current_description))), 155) : false; $this->current_category = ($contentType === 'post' || $contentType === 'topic' || $contentType === 'forum') ? $results->current_category : false; $this->parent_forum = ($contentType === 'post' || $contentType === 'topic' || $contentType === 'forum') ? $results->parent_forum : false; $this->parent_forum_name = ($contentType === 'post' || $contentType === 'topic' || $contentType === 'forum') ? $results->parent_forum_name : false; $this->current_forum = ($contentType === 'post' || $contentType === 'topic' || $contentType === 'forum') ? $results->current_forum : false; $this->current_forum_name = ($contentType === 'post' || $contentType === 'topic' || $contentType === 'forum') ? $results->current_forum_name : false; $this->current_topic = ($contentType === 'post' || $contentType === 'topic') ? $results->current_topic : false; $this->current_topic_name = ($contentType === 'post' || $contentType === 'topic') ? $results->current_topic_name : false; $this->current_post = ($contentType === 'post') ? $results->current_post : false; $this->parents_set = true; return; } } // Assign error message, because when this location is reached, no parents has been set. $this->error = $error[$contentType]; } public function createBlogTopic($new_status, $old_status, $post) { if ($post->post_type == 'post' && $new_status == 'publish' && $old_status != 'publish') { $forumID = $this->options['create_blog_topics_id']; $post_title = apply_filters('asgarosforum_filter_automatic_topic_title', $post->post_title, $post); $post_content = apply_filters('asgarosforum_filter_automatic_topic_content', $post->post_content, $post); if ($this->content->forum_exists($forumID)) { $this->content->insert_topic($forumID, $post_title, $post_content, $post->post_author); } } } // Returns the amount of users. public function count_users() { return $this->db->get_var("SELECT COUNT(u.ID) FROM {$this->db->users} u"); } // Prevents oembed dataparsing for links which points to the own forum. function prevent_oembed_dataparse($return, $data, $url) { $url_check = strpos($url, $this->rewrite->get_link('home')); if ($url_check !== false) { return $url; } return $return; } public function create_file($path, $content) { // Create binding for the file first. $binding = @fopen($path, 'wb'); // Check if the binding could get created. if ($binding) { // Write the content to the file. $writing = @fwrite($binding, $content); // Close the file. fclose($binding); // Clear stat cache so we can set the correct permissions. clearstatcache(); // Get information about the file. $file_stats = @stat(dirname($path)); // Update the permissions of the file. $file_permissions = $file_stats['mode'] & 0007777; $file_permissions = $file_permissions & 0000666; @chmod($path, $file_permissions); // Clear stat cache again so PHP is aware of the new permissions. clearstatcache(); return true; } return false; } public function read_file($path) { // Create binding for the file first. $binding = @fopen($path, 'r'); // Check if the binding could get created. if ($binding) { // Ensure that the file is not empty. $file_size = @filesize($path); if (isset($file_size) && $file_size > 0) { // Read the complete file. $file_data = fread($binding, $file_size); // Close the file. fclose($binding); // Return the file data. return $file_data; } } return false; } public function delete_file($path) { if (file_exists($path)) { unlink($path); } } public function delete_user_form_reassign($current_user, $userids) { // Remove own ID from users which should get deleted. $userids = array_diff($userids, array($current_user->ID)); // Cancel if there are no users to delete. if (empty($userids)) { return; } // Check if users have posts. $users_have_content = false; if ($this->db->get_var("SELECT ID FROM {$this->tables->posts} WHERE author_id IN(".implode(',', $userids).") LIMIT 1;")) { $users_have_content = true; } // Cancel if users have no posts. if ($users_have_content === false) { return; } // Show reassign-options. echo '

'.__('Forum', 'asgaros-forum').'

'; echo '
'; echo '

'; // Count users to delete. $go_delete = count($userids); if ($go_delete === 1) { echo __('What should be done with forum posts owned by this user?', 'asgaros-forum'); } else { echo __('What should be done with forum posts owned by these users?', 'asgaros-forum'); } echo '

'; echo '
    '; echo '
  • '; echo '
  • '; echo '
  • '; echo ' '; wp_dropdown_users(array('name' => 'forum_reassign_user', 'exclude' => $userids, 'show' => 'display_name_with_login')); echo '
'; } public function deleted_user_reassign($id, $reassign) { // Ensure that correct values are passed. if (empty($_POST['forum_reassign'])) { return; } if ($_POST['forum_reassign'] != 'yes') { return; } if (empty($_POST['forum_reassign_user'])) { return; } // Reassign forum posts. $this->db->update($this->tables->posts, array('author_id' => $_POST['forum_reassign_user']), array('author_id' => $id), array('%d'), array('%d')); } // Extract the first URL of an image from a given string. public function extract_image_url($content) { $images = array(); // Check if content is given. if ($content) { // Try to find images. preg_match_all('#https?://[^\s\'\"<>]+\.(?:jpg|jpeg|png|gif)#isu', $content, $found, PREG_SET_ORDER); if (empty($found)) { preg_match_all('#//[^\s\'\"<>]+\.(?:jpg|jpeg|png|gif)#isu', $content, $found, PREG_SET_ORDER); } if (empty($found)) { preg_match_all('#https?://[^\s\'\"<>]+#isu', $content, $found, PREG_SET_ORDER); } if (empty($found)) { preg_match_all('#//[^\s\'\"<>]+#isu', $content, $found, PREG_SET_ORDER); } // If images found, check extensions. if (!empty($found)) { foreach ($found as $match) { $extension = pathinfo($match[0], PATHINFO_EXTENSION); if ($extension) { $check = false; $extension = strtolower($extension); if ($extension == 'jpg' || $extension == 'jpeg' || $extension == 'png' || $extension == 'gif') { $check = true; } if ($check) { $images[] = $match[0]; break; } } } } } if (empty($images)) { return false; } else { return $images[0]; } } // Tries to get the signature for a given user. public function get_signature($user_id) { // Ensure signatures are enabled. if (!$this->options['allow_signatures']) { return false; } // Ensure that the user has the permission to use a signature. if (!$this->permissions->can_use_signature($user_id)) { return false; } // Try to get signature. $signature = get_user_meta($user_id, 'asgarosforum_signature', true); // Prepare signature based on settings. if ($this->options['signatures_html_allowed']) { $signature = strip_tags($signature, $this->options['signatures_html_tags']); } else { $signature = esc_html(strip_tags($signature)); } // Trim it. $signature = trim($signature); // Ensure signature is not empty. if (empty($signature)) { return false; } return $signature; } }