There is a new reply in a forum topic you are subscribed to on %s.
Forum and Topic: ###FORUM###, ###TITLE###
Author: ###AUTHOR###
Reply: ###CONTENT### Visit the reply: ###LINK###
If you don\'t wish to receive notification emails, please unsubscribe in Forum Page > Forum Menu > Subscriptions. There you can edit your global subscription option and unsubscribe from individual forums and topics.
Please don\'t reply to this email.', 'asgaros-forum'), $site_link);
$this->options['mail_template_new_post_message'] = $message;
}
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'])) {
$site_link = '' . get_bloginfo( 'name' ) . '';
$message = sprintf(__('Hello ###USERNAME###,
There is a new topic in a forum you are subscribed to on %s.
Forum and Topic: ###FORUM###, ###TITLE###
Author: ###AUTHOR###
Content: ###CONTENT### Visit the topic: ###LINK###
You will not receive notifications of any replies to this topic unless you globally subscribe to all "New Topics & Posts", or subscribe to this topic.
If you don\'t wish to receive these notification emails, please unsubscribe in Forum Page > Forum Menu > Subscriptions. There you can edit your global subscription option and unsubscribe from individual forums and topics.
Please don\'t reply to this email.', 'asgaros-forum'), $site_link);
$this->options['mail_template_new_topic_message'] = $message;
}
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');
}
if (empty($this->options['title_separator'])) {
$this->options['title_separator'] = '-';
}
}
public function save_options($options) {
update_option('asgarosforum_options', $options);
// Reload options after saving them.
$this->load_options();
}
//======================================================================
// FUNCTIONS FOR PAGE TITLE.
//======================================================================
public function change_wp_title($title, $sep, $seplocation) {
return $this->get_title($title);
}
public function change_document_title_parts($titleParts) {
$title = empty($titleParts['title']) ? '' : $titleParts['title'];
$titleParts['title'] = $this->get_title($title);
return $titleParts;
}
public 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;
}
public function change_document_title_separator($document_title_separator) {
if ($this->executePlugin) {
$document_title_separator = $this->get_title_separator();
}
return $document_title_separator;
}
public function get_title_separator() {
// The default title-separator is based on the forum-settings.
$title_separator = $this->options['title_separator'];
// Allow other plugins to modify the title-separator.
$title_separator = apply_filters('asgarosforum_title_separator', $title_separator);
return $title_separator;
}
public function get_title($title) {
if ($this->executePlugin) {
$metaTitle = $this->getMetaTitle();
if ($metaTitle) {
if (empty($title)) {
$title = $metaTitle;
} else {
$title_separator = $this->get_title_separator();
$title = $metaTitle.' '.$title_separator.' '.$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->add_current_page_to_title($metaTitle);
} else if ($this->current_view === 'topic' && $this->current_topic) {
$metaTitle = $this->add_current_page_to_title($metaTitle);
}
}
return $metaTitle;
}
// Adds the current page to a title.
public function add_current_page_to_title($someString) {
if ($this->current_page > 0) {
$currentPage = $this->current_page + 1;
$title_separator = $this->get_title_separator();
$someString .= ' '.$title_separator.' '.__('Page', 'asgaros-forum').' '.$currentPage;
}
return $someString;
}
public 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'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_move_topic')) {
$this->moveTopic();
}
}
} else if (isset($_GET['delete_topic'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_delete_topic')) {
$this->delete_topic($this->current_topic);
}
}
} else if (isset($_GET['remove_post'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_delete_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'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_sticky_topic')) {
$sticky_mode = 1;
if (!empty($_POST['sticky_topic'])) {
$sticky_mode = (int) $_POST['sticky_topic'];
}
$this->set_sticky($this->current_topic, $sticky_mode);
}
}
} else if (isset($_GET['unsticky_topic'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_unsticky_topic')) {
$this->set_sticky($this->current_topic, 0);
}
}
} else if (isset($_GET['open_topic'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_open_topic')) {
$this->change_status('open');
}
}
} else if (isset($_GET['close_topic'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_close_topic')) {
$this->change_status('closed');
}
}
} else if (isset($_GET['approve_topic'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_approve_topic')) {
$this->approval->approve_topic($this->current_topic);
}
}
} else if (isset($_GET['subscribe_topic'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_subscribe_topic')) {
$topic_id = (!empty($_GET['subscribe_topic'])) ? absint($_GET['subscribe_topic']) : 0;
$this->notifications->subscribe_topic($topic_id);
}
}
} else if (isset($_GET['unsubscribe_topic'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_unsubscribe_topic')) {
$topic_id = (!empty($_GET['unsubscribe_topic'])) ? absint($_GET['unsubscribe_topic']) : 0;
$this->notifications->unsubscribe_topic($topic_id);
}
}
} else if (isset($_GET['subscribe_forum'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_subscribe_forum')) {
$forum_id = (!empty($_GET['subscribe_forum'])) ? absint($_GET['subscribe_forum']) : 0;
$this->notifications->subscribe_forum($forum_id);
}
}
} else if (isset($_GET['unsubscribe_forum'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_unsubscribe_forum')) {
$forum_id = (!empty($_GET['unsubscribe_forum'])) ? absint($_GET['unsubscribe_forum']) : 0;
$this->notifications->unsubscribe_forum($forum_id);
}
}
} else if (isset($_GET['report_add'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_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'])) {
if (!empty($_REQUEST['_wpnonce'])) {
if (wp_verify_nonce(sanitize_key($_REQUEST['_wpnonce']), 'asgaros_forum_report_delete')) {
$this->reports->remove_report(sanitize_key($_GET['report_delete']));
}
}
}
do_action('asgarosforum_prepare_'.$this->current_view);
}
public 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']) {
$show_login = $this->showLoginLink();
$show_register = $this->showRegisterLink();
$notice = '';
if ($show_login) {
$login_link = ''.$show_login['menu_link_text'].'';
if ($show_register) {
$register_link = ''.$show_register['menu_link_text'].'';
$notice = sprintf(esc_html__('Please %s or %s to create posts and topics.', 'asgaros-forum'), $login_link, $register_link);
} else {
$notice = sprintf(esc_html__('Please %s to create posts and topics.', 'asgaros-forum'), $login_link);
}
} else {
$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);
}
}
public 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, false);
wp_localize_script(
'wp-api',
'wpApiSettings',
array(
'root' => esc_url_raw(rest_url()),
'nonce' => wp_create_nonce('wp_rest'),
'topicid' => absint($this->current_topic),
)
);
if ($this->options['enable_spoilers']) {
wp_enqueue_script('asgarosforum-js-spoilers', $this->plugin_url.'js/script-spoilers.js', array('jquery'), $this->version, false);
}
do_action('asgarosforum_enqueue_css_js');
}
// Add certain classes to body-tag.
public function add_body_classes($classes) {
if ($this->executePlugin) {
$classes[] = 'asgaros-forum';
$classes[] = 'asgaros-forum-'.$this->current_view;
}
return $classes;
}
// Gets the pages main title.
public function getMainTitle($setDefaultTitle = true) {
$mainTitle = false;
if ($setDefaultTitle) {
$mainTitle = stripslashes($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;
}
// Holds all notices.
private $notices = array();
// Adds a new notice to the notices array.
public 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.
public function render_notice($notice_message, $notice_link = false, $notice_icon = false, $in_panel = false) {
if ($in_panel) { echo '
';
do_action('asgarosforum_after_topic');
}
// Renders all subforums inside of a category/forum combination.
public function render_subforums($category_id, $forum_id) {
$subforums = $this->get_forums($category_id, $forum_id);
if (!empty($subforums)) {
echo '
';
// Show notice that this topic has no posts.
$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));
}
}
public function showMoveTopic() {
if ($this->permissions->isModerator('current')) {
echo '';
} else {
$this->render_notice(__('You are not allowed to move topics.', 'asgaros-forum'));
}
}
public function get_category_name($category_id) {
$category = get_term($category_id, 'asgarosforum-category');
if ($category) {
return $category->name;
} else {
return false;
}
}
public $topic_counter_cache = null;
public function get_topic_counts() {
// If the cache is not set yet, create it.
if ($this->topic_counter_cache === null) {
// Initialize array.
$this->topic_counter_cache = array();
// 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;");
$topic_counters = apply_filters('asgarosforum_overwrite_topic_counter_cache', $topic_counters);
// Assign topic-counter for each forum.
if (!empty($topic_counters)) {
foreach ($topic_counters as $counter) {
$this->topic_counter_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_counter_cache[$subforum->id])) {
continue;
}
// Re-assign value when the parent-forum has no topics.
if (!isset($this->topic_counter_cache[$subforum->parent_forum])) {
$this->topic_counter_cache[$subforum->parent_forum] = $this->topic_counter_cache[$subforum->id];
continue;
}
// Otherwise add subforum-topics to the counter of the parent forum.
$this->topic_counter_cache[$subforum->parent_forum] = ($this->topic_counter_cache[$subforum->parent_forum] + $this->topic_counter_cache[$subforum->id]);
}
}
}
return $this->topic_counter_cache;
}
public function get_forum_topic_counter($forum_id) {
$counters = $this->get_topic_counts();
if (isset($counters[$forum_id])) {
return (int) $counters[$forum_id];
} else {
return 0;
}
}
public $post_counters_cache = null;
public function get_post_counters() {
// If the cache is not set yet, create it.
if ($this->post_counters_cache === null) {
// Initialize array.
$this->post_counters_cache = array();
// 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;");
$post_counters = apply_filters('asgarosforum_overwrite_post_counter_cache', $post_counters);
// 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;
}
public function get_forum_post_counter($forum_id) {
$counters = $this->get_post_counters();
if (isset($counters[$forum_id])) {
return (int) $counters[$forum_id];
} else {
return 0;
}
}
public 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);
}
}
public function get_subforums($forum_id, $output_type = OBJECT) {
return $this->db->get_results($this->db->prepare("SELECT * FROM {$this->tables->forums} WHERE parent_forum = %d ORDER BY sort ASC;", $forum_id), $output_type);
}
public 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;
}
public 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;
}
public 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();
public 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;
}
}
public function cut_string($string, $length = 33, $at_next_space = false) {
$string_length = 0;
// Get string-length first.
if (function_exists('mb_strlen')) {
$string_length = mb_strlen($string, 'UTF-8');
} else {
$string_length = strlen($string);
}
// Only cut string if it is longer than defined.
if ($string_length > $length) {
// Try to find position of next space if necessary.
if ($at_next_space) {
$space_position = false;
// Get position of space.
if (function_exists('mb_strpos')) {
$space_position = mb_strpos($string, ' ', $length, 'UTF-8');
} else {
$space_position = strpos($string, ' ', $length);
}
if ($space_position) {
$length = $space_position;
} else {
return $string;
}
}
// Return substring.
if (function_exists('mb_substr')) {
return mb_substr($string, 0, $length, 'UTF-8').' …';
} else {
return substr($string, 0, $length).' …';
}
}
return $string;
}
// TODO: Clean up the complete username logic ...
public 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.
*/
public $cacheGetUsername = array();
public 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.
*/
public function renderUsername($user, $custom_name = false) {
// Add filter to change username
$user_name = apply_filters('asgarosforum_filter_username', $user->display_name, $user);
if ($custom_name) {
$user_name = $custom_name;
}
$renderedUserName = $user_name;
// Generate profile link.
$profile_link = $this->profile->getProfileLink($user);
if ($profile_link === false) {
$profile_link = '#';
}
// Highlight the usernames of administrators/moderators.
$username_highlight = 'highlight-default';
if ($this->options['highlight_admin']) {
if ($this->permissions->isAdministrator($user->ID)) {
$username_highlight = "highlight-admin";
} else if ($this->permissions->isModerator($user->ID)) {
$username_highlight = "highlight-moderator";
}
}
// Generate output.
$renderedUserName = ''.$user_name.'';
return $renderedUserName;
}
private $lastpost_forum_cache = null;
public function lastpost_forum_cache() {
if ($this->lastpost_forum_cache === null) {
// Initialize array.
$this->lastpost_forum_cache = array();
// 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;
}
}
$this->lastpost_forum_cache = apply_filters('asgarosforum_overwrite_lastpost_forum_cache', $this->lastpost_forum_cache);
// 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();
public 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];
}
public function render_lastpost_in_forum($forum_id, $compact = false) {
$lastpost = $this->get_lastpost_in_forum($forum_id);
if ($lastpost === false) {
echo ''.esc_html__('No topics yet!', 'asgaros-forum').'';
} else {
$post_link = $this->rewrite->get_post_link($lastpost->id, $lastpost->parent_id);
if ($compact === true) {
echo esc_html__('Last post:', 'asgaros-forum');
echo ' ';
echo ''.esc_html($this->cut_string(stripslashes($lastpost->name), 34)).'';
echo ' · ';
echo ''.esc_html($this->get_activity_timestamp($lastpost->date)).'';
echo ' · ';
echo $this->getUsername($lastpost->author_id);
} else {
// Avatar
if ($this->options['enable_avatars']) {
echo '
';
}
}
}
public 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];
}
public function render_lastpost_in_topic($topic_id, $compact = false) {
$lastpost = $this->get_lastpost_in_topic($topic_id);
// Ensure that a lastpost exists. This is a required check in case a topic is empty due to problems during post-creation.
if (!empty($lastpost)) {
$post_link = $this->rewrite->get_post_link($lastpost->id, $lastpost->parent_id);
if ($compact === true) {
echo esc_html__('Last post:', 'asgaros-forum');
echo ' ';
echo ''.esc_html($this->get_activity_timestamp($lastpost->date)).'';
echo ' · ';
echo $this->getUsername($lastpost->author_id);
} else {
// Avatar
if ($this->options['enable_avatars']) {
echo '
';
}
}
}
public function get_topic_starter($topic_id) {
return $this->db->get_var($this->db->prepare("SELECT author_id FROM {$this->tables->topics} WHERE id = %d;", $topic_id));
}
public 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));
}
}
public function current_time() {
return current_time('Y-m-d H:i:s');
}
// Returns the timestamp of an activity based on the settings (relative or actual timestamp).
public function get_activity_timestamp($timestamp, $force = false) {
$timestamp_mode = ($force === false) ? $this->options['activity_timestamp_format'] : $force;
switch ($timestamp_mode) {
case 'relative':
return sprintf(__('%s ago', 'asgaros-forum'), human_time_diff(strtotime($timestamp), current_time('timestamp')));
break;
case 'actual':
return $this->format_date($timestamp, true);
break;
}
}
public 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));
}
public 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.
public function countTopicsByUser($user_id) {
return $this->db->get_var("SELECT COUNT(*) FROM {$this->tables->topics} WHERE author_id = {$user_id};");
}
public function countPostsByUser($userID) {
return $this->db->get_var("SELECT COUNT(*) FROM {$this->tables->posts} WHERE author_id = {$userID};");
}
public function render_sticky_panel() {
// Cancel if the current user is not at least a moderator.
if (!$this->permissions->isModerator('current')) {
return;
}
echo '
';
$this->breadcrumbs->show_breadcrumbs();
}
public function drawMenuEntries($menu_entries) {
// Ensure that menu-entries are not empty.
if (empty($menu_entries) || !is_array($menu_entries)) return;
foreach ($menu_entries as $menu_entry) {
// Check menu entry.
if (empty($menu_entry)) continue;
if (!isset($menu_entry['menu_new_tab'])) $menu_entry['menu_new_tab'] = false;
if (!isset($menu_entry['menu_url'])) $menu_entry['menu_url'] = '/';
if (!isset($menu_entry['menu_login_status'])) $menu_entry['menu_login_status'] = 0;
if (!isset($menu_entry['menu_link_text'])) $menu_entry['menu_link_text'] = __('Link Text Missing', 'asgaros-forum');
// Check login status.
$login_status = is_user_logged_in();
$menu_login_status = $menu_entry['menu_login_status'];
if ($menu_login_status == 1 && ! $login_status) {
continue;
} else if ($menu_login_status == 2 && $login_status) {
continue;
}
// Check if menu-URL is a slug.
$menu_url = $menu_entry['menu_url'];
if ($menu_url[0] == '/') {
$menu_url = get_home_url().$menu_url;
}
// Check menu class.
$menu_class = (isset($menu_entry['menu_class'])) ? $menu_entry['menu_class'] : 'default-link';
// Check if link has to open in a new tab.
$new_tab = ($menu_entry['menu_new_tab']) ? '_blank' : '_self';
echo ''.esc_html($menu_entry['menu_link_text']).'';
}
}
public function homeLink(){
$home_url = $this->get_link('home');
return array(
'menu_class' => 'home-link',
'menu_link_text' => esc_html__('Forum', 'asgaros-forum'),
'menu_url' => $home_url,
'menu_login_status' => 0,
'menu_new_tab' => false
);
}
public function showLogoutLink() {
if ($this->options['show_logout_button']) {
$logout_url = wp_logout_url($this->get_link('current', false, false, '', false));
return array(
'menu_class' => 'logout-link',
'menu_link_text' => esc_html__('Logout', 'asgaros-forum'),
'menu_url' => $logout_url,
'menu_login_status' => 1,
'menu_new_tab' => false
);
}
}
public function showLoginLink() {
if ($this->options['show_login_button']) {
$login_url = wp_login_url($this->get_link('current', false, false, '', false));
if (!empty($this->options['custom_url_login'])) {
$login_url = $this->options['custom_url_login'];
}
return array(
'menu_class' => 'login-link',
'menu_link_text' => esc_html__('Login', 'asgaros-forum'),
'menu_url' => $login_url,
'menu_login_status' => 2,
'menu_new_tab' => false
);
}
}
public function showRegisterLink() {
if ( $this->options['show_register_button']) {
$register_url = wp_registration_url();
if (!empty($this->options['custom_url_register'])) {
$register_url = $this->options['custom_url_register'];
}
return array(
'menu_class' => 'register-link',
'menu_link_text' => esc_html__('Register', 'asgaros-forum'),
'menu_url' => $register_url,
'menu_login_status' => 2,
'menu_new_tab' => false
);
}
}
public 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_safe_redirect(html_entity_decode($this->get_link('forum', $this->current_forum)));
exit;
}
}
public function moveTopic() {
// Ensure forum-ID is set.
if (empty($_POST['newForumID'])) {
return;
}
$new_forum_id = sanitize_key($_POST['newForumID']);
if ($this->permissions->isModerator('current') && $new_forum_id && $this->content->forum_exists($new_forum_id)) {
$this->db->update($this->tables->topics, array('parent_id' => $new_forum_id), array('id' => $this->current_topic), array('%d'), array('%d'));
$this->db->update($this->tables->posts, array('forum_id' => $new_forum_id), array('parent_id' => $this->current_topic), array('%d'), array('%d'));
wp_safe_redirect(html_entity_decode($this->get_link('topic', $this->current_topic)));
exit;
}
}
public 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);
}
public function change_status($property) {
$user_id = get_current_user_id();
if ($property == 'closed') {
if (!$this->permissions->can_close_topic($user_id, $this->current_topic)) {
return false;
}
$this->db->update($this->tables->topics, array('closed' => 1), array('id' => $this->current_topic), array('%d'), array('%d'));
} else if ($property == 'open') {
if (!$this->permissions->can_open_topic($user_id, $this->current_topic)) {
return false;
}
$this->db->update($this->tables->topics, array('closed' => 0), array('id' => $this->current_topic), array('%d'), array('%d'));
}
}
public function set_sticky($topic_id, $sticky_mode) {
// Ensure that the user is able to pin topics.
if (!$this->permissions->can_pin_topic(get_current_user_id(), $this->current_topic)) {
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;
}
}
public function is_topic_sticky($topic_id) {
$status = $this->db->get_var("SELECT sticky FROM {$this->tables->topics} WHERE id = {$topic_id};");
if ((int) $status > 0) {
return true;
} else {
return false;
}
}
private $is_topic_closed_cache = array();
public 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 ((int) $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.
public function forumIsOpen() {
if (!$this->permissions->isModerator('current')) {
$status = $this->db->get_var($this->db->prepare("SELECT forum_status FROM {$this->tables->forums} WHERE id = %d;", $this->current_forum));
if ($status == 'closed') {
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) {
if ($contentType === 'post' || $contentType === 'topic' || $contentType === 'forum') {
// Generate description.
$description = $results->current_description;
$description = strip_tags($description);
$description = esc_html($description);
$description = str_replace(array("\r", "\n"), '', $description);
$this->current_description = $this->cut_string($description, 155, true);
$this->current_category = $results->current_category;
$this->parent_forum = $results->parent_forum;
$this->parent_forum_name = $results->parent_forum_name;
$this->current_forum = $results->current_forum;
$this->current_forum_name = $results->current_forum_name;
}
$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];
}
// 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.
public 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 or topics.
$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;
}
if ($this->db->get_var("SELECT ID FROM {$this->tables->topics} 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 '
'.esc_html__('Forum', 'asgaros-forum').'
';
echo '';
}
public function deleted_user_reassign($id, $reassign) {
// Ensure that correct values are passed.
if (empty($_POST['forum_reassign'])) {
return;
}
if (!in_array($_POST['forum_reassign'], array('no', 'yes', 'delete'))) {
return;
}
// Reassign forum posts and topics.
if ($_POST['forum_reassign'] == 'yes') {
if (empty($_POST['forum_reassign_user'])) {
return;
}
$author_id = sanitize_key($_POST['forum_reassign_user']);
$this->db->update($this->tables->posts, array('author_id' => $author_id), array('author_id' => $id), array('%d'), array('%d'));
$this->db->update($this->tables->topics, array('author_id' => $author_id), array('author_id' => $id), array('%d'), array('%d'));
}
// Delete forum posts and topics.
if ($_POST['forum_reassign'] == 'delete') {
// First delete topics ...
$topics = $this->db->get_col("SELECT id FROM {$this->tables->topics} WHERE author_id = {$id};");
if (!empty($topics)) {
foreach ($topics as $topic) {
$this->delete_topic($topic, true, false);
}
}
// Then delete posts ...
$posts = $this->db->get_col("SELECT id FROM {$this->tables->posts} WHERE author_id = {$id};");
if (!empty($posts)) {
foreach ($posts as $post) {
$this->remove_post($post, false);
}
}
}
}
// 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);
// Allow filtering the signature.
$signature = apply_filters('asgarosforum_signature', $signature);
// Ensure signature is not empty.
if (empty($signature)) {
return false;
}
return $signature;
}
public function render_reputation_badges($number) {
if ($this->options['enable_reputation']) {
echo '';
if ($number < $this->options['reputation_level_1_posts']) {
echo '';
} else {
echo '';
// Add an additional star for every remaining level.
for ($i = 2; $i <= 5; $i++) {
if ($number >= $this->options['reputation_level_'.$i.'_posts']) {
echo '';
} else {
break;
}
}
}
echo '';
}
}
/*******************************************/
/* Functions for automatic topic creation. */
/*******************************************/
public function post_transition_update($new_status, $old_status, $post) {
// Ensure that the required option is activated.
if ($this->options['create_blog_topics_id'] == 0) {
return;
}
if ($post->post_type == 'post' && $new_status == 'publish' && $old_status != 'publish') {
$forum_id = $this->options['create_blog_topics_id'];
$this->create_blog_topic($forum_id, $post);
}
}
public function create_blog_topic($forum_id, $post_object) {
if ($this->content->forum_exists($forum_id)) {
// Prepare title and content
$post_title = apply_filters('asgarosforum_filter_automatic_topic_title', $post_object->post_title, $post_object);
$post_content = apply_filters('asgarosforum_filter_automatic_topic_content', $post_object->post_content, $post_object);
// Create the new topic
$ids = $this->content->insert_topic($forum_id, $post_title, $post_content, $post_object->post_author);
if ($this->approval->is_topic_approved($ids->topic_id)) {
// Send notifications about new topic.
$this->notifications->notify_about_new_topic($ids->topic_id);
} else {
// Notify siteowner about new unapproved topic.
$this->approval->notify_about_new_unapproved_topic($ids->topic_id);
}
}
}
public function add_topic_meta_box_setup() {
add_action('add_meta_boxes', array($this, 'add_topic_meta_box'), 10, 2);
add_action('save_post', array($this, 'process_topic_meta_box'), 10, 2);
}
public function add_topic_meta_box($post_type, $post) {
if (!current_user_can('publish_post', $post->ID)) {
return;
}
$post_types = apply_filters('asgarosforum_filter_meta_post_type', array('post', 'page'));
add_meta_box(
'asgaros-forum-topic-meta-box',
__('Create Forum Topic', 'asgaros-forum'),
array($this, 'add_topic_meta_box_content'),
$post_types,
'side',
'low'
);
}
public function add_topic_meta_box_content($post) {
echo '';
echo ' ';
echo '';
}
public function process_topic_meta_box($post_id, $post) {
if (!current_user_can('publish_post', $post_id)) {
return;
}
$forum_id = !empty($_POST['add_topic_in_forum']) ? sanitize_key($_POST['add_topic_in_forum']) : 0;
if ($forum_id > 0) {
$this->create_blog_topic($forum_id, $post);
}
}
public function has_error() {
if (!empty($this->error)) {
return true;
}
return false;
}
public function render_error() {
echo '