'default', 'custom_color' => '#256db3', 'custom_accent_color' => '#054d98', 'custom_text_color' => '#444444', 'custom_text_color_light' => '#888888', 'custom_link_color' => '#256db3', 'custom_background_color' => '#ffffff', 'custom_background_color_alt' => '#fafafa', 'custom_border_color' => '#eeeeee', 'custom_read_indicator_color' => '#a2a2a2', 'custom_unread_indicator_color' => '#256db3', 'custom_font' => 'Verdana, Tahoma, sans-serif', 'custom_font_size' => '13px', 'custom_css' => '' ); public function __construct($object) { $this->asgarosforum = $object; add_action('init', array($this, 'initialize')); } public function initialize() { $this->themes_root = trailingslashit(WP_CONTENT_DIR.'/'.$this->theme_path); $this->find_themes(); $this->load_options(); add_filter('mce_css', array($this, 'add_editor_css')); add_action('wp_enqueue_scripts', array($this, 'add_css'), 20); add_action('wp_head', array($this, 'set_header'), 1); } public function load_options() { // Load options. $this->options = array_merge($this->options_default, get_option('asgarosforum_appearance', array())); // Set the used theme. if (empty($this->themes[$this->options['theme']])) { $this->current_theme = $this->default_theme; } else { $this->current_theme = $this->options['theme']; } } public function save_options($options) { update_option('asgarosforum_appearance', $options); // Reload options after saving them. $this->load_options(); } // Find available themes. private function find_themes() { // Always ensure that the default theme is available. $this->themes[$this->default_theme] = array( 'name' => __('Default Theme', 'asgaros-forum'), 'url' => $this->asgarosforum->plugin_url.$this->skin_path ); // Create themes directory if it doesnt exist. if (!is_dir($this->themes_root)) { wp_mkdir_p($this->themes_root); } else { // Check the themes directory for more themes. $themes = glob($this->themes_root.'*'); if (is_array($themes) && !empty($themes)) { foreach ($themes as $themepath) { // Ensure that only themes appears which contains all necessary files. if (is_dir($themepath) && is_file($themepath.'/style.css') && is_file($themepath.'/widgets.css')) { $trimmed = preg_filter('/^.*\//', '', $themepath, 1); $this->themes[$trimmed] = array( 'name' => $trimmed, 'url' => content_url($this->theme_path.'/'.$trimmed) ); } } } } } // Get all available themes. public function get_themes() { return $this->themes; } // Get the current theme. public function get_current_theme() { return $this->current_theme; } // Returns the URL to the path of the selected theme. public function get_current_theme_url() { return $this->themes[$this->get_current_theme()]['url']; } // Check if current theme is the default theme. public function is_default_theme() { return ($this->get_current_theme() === $this->default_theme) ? true : false; } public function set_header() { // SEO stuff. if ($this->asgarosforum->executePlugin) { echo ''.PHP_EOL; $link = ($this->asgarosforum->current_page > 0) ? $this->asgarosforum->get_link('current') : esc_url(remove_query_arg('part', $this->asgarosforum->get_link('current', false, false, '', false))); $title = ($this->asgarosforum->getMetaTitle()) ? $this->asgarosforum->getMetaTitle() : get_the_title(); // By default use the page title as description. $description = $title; // In forum overview use the forum description if available. $forum_description = stripslashes($this->asgarosforum->options['forum_description']); if ($this->asgarosforum->current_view === 'overview' && !empty($forum_description)) { $description = $forum_description; } else if ($this->asgarosforum->current_description && $this->asgarosforum->error === false) { $description = $this->asgarosforum->current_description; } // Prevent indexing of some views, when there is an error or for other configurations. $prevent_indexing = false; $blocked_views_for_searchengines = array('addtopic', 'movetopic', 'addpost', 'editpost', 'search'); if (in_array($this->asgarosforum->current_view, $blocked_views_for_searchengines)) { $prevent_indexing = true; } if ($this->asgarosforum->error !== false) { $prevent_indexing = true; } $profile_views = array('profile', 'history'); if ($this->asgarosforum->options['hide_profiles_from_guests'] && in_array($this->asgarosforum->current_view, $profile_views)) { $prevent_indexing = true; } if ($prevent_indexing) { echo ''.PHP_EOL; } // Create meta-tags. echo ''.PHP_EOL; echo ''.PHP_EOL; echo ''.PHP_EOL; echo ''.PHP_EOL; echo ''.PHP_EOL; echo ''.PHP_EOL; // Try to set og:image-tag when we are in a topic. A check for the element-ID // is required to prevent an error in case that this topic does not exist. if ($this->asgarosforum->current_view === 'topic' && $this->asgarosforum->current_element) { $first_post = $this->asgarosforum->content->get_first_post($this->asgarosforum->current_element); if ($first_post) { $image_url = $this->asgarosforum->extract_image_url($first_post->text); if ($image_url) { echo ''.PHP_EOL; } } } echo ''.PHP_EOL; echo ''.PHP_EOL; do_action('asgarosforum_wp_head'); echo ''.PHP_EOL; } } public function add_css() { if ($this->asgarosforum->executePlugin) { // Set path to custom CSS file. $custom_css_path = $this->asgarosforum->plugin_path.'skin/custom.css'; // Only run custom CSS logic when we are in the default theme and the default appearance settings have been changed. if ($this->is_default_theme() && $this->options != $this->options_default) { // Load the custom CSS definitions with the adjusted values first. $custom_css = $this->generate_custom_css(); // Only continue when our custom CSS is not empty. if (!empty($custom_css)) { // Flag to decide if we need to load the custom CSS inline. $inline = false; // Generate hash of the custom CSS. $hash_new = md5($custom_css); // Check if a custom CSS file exists. if (file_exists($custom_css_path) && filesize($custom_css_path)) { // Try to read the current custom CSS file. $current_css = $this->asgarosforum->read_file($custom_css_path); // If we were not able to read the file, we have to load the CSS inline. if (!$current_css) { $inline = true; } else { // Generate hash of the current CSS. $hash_current = md5($current_css); // If the hash values are different, we have to update our custom CSS file. if ($hash_new != $hash_current) { $file_check = $this->asgarosforum->create_file($custom_css_path, $custom_css); // If we were not able to update the file, we have to load the CSS inline. if (!$file_check) { $inline = true; } } } } else { // The file does not exists so try to create it. $file_check = $this->asgarosforum->create_file($custom_css_path, $custom_css); // If we were not able to create the file, we have to load the CSS inline. if (!$file_check) { $inline = true; } } // Load CSS (inline or as a file). if ($inline) { // Remove special characters from inline CSS. $custom_css = preg_replace('|[\r\n\t]+|', '', $custom_css); // Load CSS inline. wp_add_inline_style('af-style', $custom_css); } else { // Load CSS as file. wp_enqueue_style('af-custom-color', $this->get_current_theme_url().'/custom.css', array(), $this->asgarosforum->version); } } } else { // Otherwise try to delete the custom CSS file. $this->asgarosforum->delete_file($custom_css_path); } } } // Add a custom stylesheet to the TinyMCE editor. public function add_editor_css($mce_css) { if (!empty($mce_css)) { $mce_css .= ','; } $mce_css .= $this->get_current_theme_url().'/editor.css?ver='.$this->asgarosforum->version; return $mce_css; } // Generates the custom CSS based on the appearance settings. public function generate_custom_css() { $custom_css = ''; if ($this->options['custom_color'] != $this->options_default['custom_color'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_color'])) { $custom_css .= '#af-wrapper #forum-profile .display-name,'.PHP_EOL; $custom_css .= '#af-wrapper .post-author .topic-author,'.PHP_EOL; $custom_css .= '#af-wrapper input[type="checkbox"]:checked:before {'.PHP_EOL; $custom_css .= 'color: '.$this->options['custom_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; $custom_css .= '#af-wrapper .button-normal,'.PHP_EOL; $custom_css .= '#af-wrapper .title-element,'.PHP_EOL; $custom_css .= '#af-wrapper #forum-header,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-header .background-avatar,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-navigation,'.PHP_EOL; $custom_css .= '#af-wrapper input[type="radio"]:checked:before {'.PHP_EOL; $custom_css .= 'background-color: '.$this->options['custom_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; $custom_css .= '#af-wrapper .button-neutral {'.PHP_EOL; $custom_css .= 'background-color: '.$this->options['custom_color'].'B0 !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; $custom_css .= '#af-wrapper .post-author .topic-author {'.PHP_EOL; $custom_css .= 'background-color: '.$this->options['custom_color'].'40 !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; $custom_css .= '#af-wrapper input[type="radio"]:focus,'.PHP_EOL; $custom_css .= '#af-wrapper input[type="checkbox"]:focus,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-header {'.PHP_EOL; $custom_css .= 'border-color: '.$this->options['custom_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_accent_color'] != $this->options_default['custom_accent_color'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_accent_color'])) { $custom_css .= '#af-wrapper .title-element,'.PHP_EOL; $custom_css .= '#af-wrapper #forum-navigation a,'.PHP_EOL; $custom_css .= '#af-wrapper #forum-navigation-mobile a {'.PHP_EOL; $custom_css .= 'border-color: '.$this->options['custom_accent_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; $custom_css .= '#af-wrapper .button-normal:hover,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-navigation a.active {'.PHP_EOL; $custom_css .= 'background-color: '.$this->options['custom_accent_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; $custom_css .= '#af-wrapper .button-neutral:hover {'.PHP_EOL; $custom_css .= 'background-color: '.$this->options['custom_accent_color'].'B0 !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_text_color'] != $this->options_default['custom_text_color'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_text_color'])) { $custom_css .= '#af-wrapper,'.PHP_EOL; $custom_css .= '#af-wrapper #forum-breadcrumbs a:hover,'.PHP_EOL; $custom_css .= '#af-wrapper .main-title {'.PHP_EOL; $custom_css .= 'color: '.$this->options['custom_text_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_text_color_light'] != $this->options_default['custom_text_color_light'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_text_color_light'])) { $custom_css .= '#af-wrapper .main-title:before,'.PHP_EOL; $custom_css .= '#af-wrapper .editor-row-uploads .upload-hints,'.PHP_EOL; $custom_css .= '#af-wrapper .forum-stats,'.PHP_EOL; $custom_css .= '#af-wrapper .topic-stats,'.PHP_EOL; $custom_css .= '#af-wrapper .action-panel-description,'.PHP_EOL; $custom_css .= '#af-wrapper #forum-breadcrumbs,'.PHP_EOL; $custom_css .= '#af-wrapper #forum-breadcrumbs a,'.PHP_EOL; $custom_css .= '#af-wrapper .forum-post-date,'.PHP_EOL; $custom_css .= '#af-wrapper .forum-post-date a,'.PHP_EOL; $custom_css .= '#af-wrapper .post-footer,'.PHP_EOL; $custom_css .= '#af-wrapper .post-footer a,'.PHP_EOL; $custom_css .= '#af-wrapper .signature,'.PHP_EOL; $custom_css .= '#af-wrapper span.mention-nice-name,'.PHP_EOL; $custom_css .= '#af-wrapper .post-reactions .reaction,'.PHP_EOL; $custom_css .= '#af-wrapper #poll-results .poll-result-numbers,'.PHP_EOL; $custom_css .= '#af-wrapper #poll-results .poll-result-total,'.PHP_EOL; $custom_css .= '#af-wrapper #poll-warning,'.PHP_EOL; $custom_css .= '#af-wrapper .topic-icon:before,'.PHP_EOL; $custom_css .= '#af-wrapper .report-link,'.PHP_EOL; $custom_css .= '#af-wrapper .report-content:before,'.PHP_EOL; $custom_css .= '#af-wrapper input::placeholder,'.PHP_EOL; $custom_css .= '#af-wrapper .activity-time,'.PHP_EOL; $custom_css .= '#af-wrapper .unread-time {'.PHP_EOL; $custom_css .= 'color: '.$this->options['custom_text_color_light'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_link_color'] != $this->options_default['custom_link_color'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_link_color'])) { $custom_css .= '#af-wrapper a:not(a.button),'.PHP_EOL; $custom_css .= '#af-wrapper .forum-post-menu a,'.PHP_EOL; $custom_css .= '#af-wrapper #bottom-navigation {'.PHP_EOL; $custom_css .= 'color: '.$this->options['custom_link_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_background_color'] != $this->options_default['custom_background_color'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_background_color'])) { $custom_css .= '#af-wrapper .content-container,'.PHP_EOL; $custom_css .= '#af-wrapper .report-element,'.PHP_EOL; $custom_css .= '#af-wrapper #statistics,'.PHP_EOL; $custom_css .= '#af-wrapper .post-wrapper,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-header .background-contrast,'.PHP_EOL; $custom_css .= '#af-wrapper #poll-results .poll-result-bar,'.PHP_EOL; $custom_css .= '#af-wrapper #memberslist-filter {'.PHP_EOL; $custom_css .= 'background-color: '.$this->options['custom_background_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_background_color_alt'] != $this->options_default['custom_background_color_alt'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_background_color_alt'])) { $custom_css .= '#af-wrapper .content-element:nth-child(even),'.PHP_EOL; $custom_css .= '#af-wrapper .topic-sticky,'.PHP_EOL; $custom_css .= '#af-wrapper .topic-sticky .topic-poster,'.PHP_EOL; $custom_css .= '#af-wrapper .forum-post-header-container,'.PHP_EOL; $custom_css .= '#af-wrapper .editor-element,'.PHP_EOL; $custom_css .= '#af-wrapper #statistics-online-users,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-layer,'.PHP_EOL; $custom_css .= '#af-wrapper .spoiler .spoiler-head,'.PHP_EOL; $custom_css .= '#af-wrapper .report-content,'.PHP_EOL; $custom_css .= '#af-wrapper #poll-panel,'.PHP_EOL; $custom_css .= '#af-wrapper .post-reactions-summary .reaction-names,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-content {'.PHP_EOL; $custom_css .= 'background-color: '.$this->options['custom_background_color_alt'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_border_color'] != $this->options_default['custom_border_color'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_border_color'])) { $custom_css .= '#af-wrapper input,'.PHP_EOL; $custom_css .= '#af-wrapper .forum-post-header-container,'.PHP_EOL; $custom_css .= '#af-wrapper .forum-poster,'.PHP_EOL; $custom_css .= '#af-wrapper .topic-poster,'.PHP_EOL; $custom_css .= '#af-wrapper .member-last-seen,'.PHP_EOL; $custom_css .= '#af-wrapper .editor-element,'.PHP_EOL; $custom_css .= '#af-wrapper .content-container,'.PHP_EOL; $custom_css .= '#af-wrapper .forum-post-header,'.PHP_EOL; $custom_css .= '#af-wrapper #statistics-body,'.PHP_EOL; $custom_css .= '#af-wrapper .statistics-element,'.PHP_EOL; $custom_css .= '#af-wrapper #statistics-online-users,'.PHP_EOL; $custom_css .= '#af-wrapper .editor-row,'.PHP_EOL; $custom_css .= '#af-wrapper .editor-row-subject,'.PHP_EOL; $custom_css .= '#af-wrapper .signature,'.PHP_EOL; $custom_css .= '#af-wrapper .forum-subforums,'.PHP_EOL; $custom_css .= '#af-wrapper .uploaded-file img,'.PHP_EOL; $custom_css .= '#af-wrapper .action-panel-option,'.PHP_EOL; $custom_css .= '#af-wrapper .topic-sticky .topic-poster,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-layer,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-layer .pages-and-menu:first-of-type,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-content,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-content .profile-row,'.PHP_EOL; $custom_css .= '#af-wrapper .history-element,'.PHP_EOL; $custom_css .= '#af-wrapper #memberslist-filter,'.PHP_EOL; $custom_css .= '#af-wrapper .content-element,'.PHP_EOL; $custom_css .= '#af-wrapper .ad-forum,'.PHP_EOL; $custom_css .= '#af-wrapper .ad-topic,'.PHP_EOL; $custom_css .= '#af-wrapper .spoiler,'.PHP_EOL; $custom_css .= '#af-wrapper .spoiler .spoiler-body,'.PHP_EOL; $custom_css .= '#af-wrapper .report-element,'.PHP_EOL; $custom_css .= '#af-wrapper .report-source,'.PHP_EOL; $custom_css .= '#af-wrapper .report-content,'.PHP_EOL; $custom_css .= '#af-wrapper .report-actions,'.PHP_EOL; $custom_css .= '#af-wrapper #profile-content .profile-section-header,'.PHP_EOL; $custom_css .= '#af-wrapper #poll-options,'.PHP_EOL; $custom_css .= '#af-wrapper #poll-panel,'.PHP_EOL; $custom_css .= '#af-wrapper #poll-panel #poll-headline,'.PHP_EOL; $custom_css .= '#af-wrapper #poll-results .poll-result-bar,'.PHP_EOL; $custom_css .= '#af-wrapper .post-reactions-summary .reaction-names,'.PHP_EOL; $custom_css .= '#af-wrapper #usergroups-filter {'.PHP_EOL; $custom_css .= 'border-color: '.$this->options['custom_border_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; $custom_css .= '#af-wrapper .post-element {'.PHP_EOL; $custom_css .= 'box-shadow: #fff 0px 0px 0px 0px, '.$this->options['custom_border_color'].' 0px 0px 0px 1px, #0000 0px 0px 0px 0px !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_read_indicator_color'] != $this->options_default['custom_read_indicator_color'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_read_indicator_color'])) { $custom_css .= '#af-wrapper .read {'.PHP_EOL; $custom_css .= 'color: '.$this->options['custom_read_indicator_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; $custom_css .= '#af-wrapper #read-unread .read {'.PHP_EOL; $custom_css .= 'background-color: '.$this->options['custom_read_indicator_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_unread_indicator_color'] != $this->options_default['custom_unread_indicator_color'] && preg_match('/#([a-fA-F0-9]{3}){1,2}\b/', $this->options['custom_unread_indicator_color'])) { $custom_css .= '#af-wrapper .unread {'.PHP_EOL; $custom_css .= 'color: '.$this->options['custom_unread_indicator_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; $custom_css .= '#af-wrapper #read-unread .unread {'.PHP_EOL; $custom_css .= 'background-color: '.$this->options['custom_unread_indicator_color'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_font'] != $this->options_default['custom_font']) { $custom_css .= '#af-wrapper {'.PHP_EOL; $custom_css .= 'font-family: '.$this->options['custom_font'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_font_size'] != $this->options_default['custom_font_size']) { $custom_css .= '#af-wrapper {'.PHP_EOL; $custom_css .= 'font-size: '.$this->options['custom_font_size'].' !important;'.PHP_EOL; $custom_css .= '}'.PHP_EOL; } if ($this->options['custom_css'] != $this->options_default['custom_css']) { $custom_css .= $this->options['custom_css']; } return $custom_css; } }