';
echo '' . __('Admin Note:', 'bbpress-support-toolkit') . ' ';
echo esc_html($admin_note);
echo '';
}
}
public function add_admin_note_metabox() {
add_meta_box(
'bbps_admin_note',
__('Admin Note', 'bbpress-support-toolkit'),
array($this, 'admin_note_metabox_callback'),
array('topic', 'reply'),
'side',
'high'
);
}
public function admin_note_metabox_callback($post) {
wp_nonce_field('bbps_admin_note_nonce', 'bbps_admin_note_nonce');
$admin_note = get_post_meta($post->ID, '_bbps_admin_note', true);
echo '';
echo '
' . __('This note is only visible to administrators and moderators.', 'bbpress-support-toolkit') . '
';
}
public function save_admin_note($post_id) {
if (!isset($_POST['bbps_admin_note_nonce']) || !wp_verify_nonce($_POST['bbps_admin_note_nonce'], 'bbps_admin_note_nonce')) {
return;
}
if (!current_user_can('moderate_forums')) {
return;
}
if (isset($_POST['bbps_admin_note'])) {
update_post_meta($post_id, '_bbps_admin_note', sanitize_textarea_field($_POST['bbps_admin_note']));
}
}
public function enqueue_styles() {
$is_single_topic_or_reply = false;
if (function_exists('bbp_is_single_topic') && function_exists('bbp_is_single_reply')) {
$is_single_topic_or_reply = bbp_is_single_topic() || bbp_is_single_reply();
}
if ($is_single_topic_or_reply) {
wp_enqueue_style('bbps-advanced-features', plugin_dir_url(__FILE__) . '../assets/advanced-features.css', array(), '1.0.0');
}
}
}
/**
* Live Preview Feature
*/
class BBPS_Live_Preview {
public function __construct() {
if (get_option('bbps_enable_live_preview', 0)) {
add_action('init', array($this, 'init'));
}
}
public function init() {
add_action('bbp_theme_after_reply_form_content', array($this, 'add_preview_button'));
add_action('bbp_theme_after_topic_form_content', array($this, 'add_preview_button'));
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
add_action('wp_ajax_bbps_preview_content', array($this, 'ajax_preview_content'));
add_action('wp_ajax_nopriv_bbps_preview_content', array($this, 'ajax_preview_content'));
}
public function add_preview_button() {
echo '';
echo '
';
echo '
';
echo '
';
}
public function enqueue_scripts() {
// Check if bbPress functions exist and if we're on a bbPress page
$is_bbpress_page = false;
if (function_exists('bbp_is_topic_edit') && function_exists('bbp_is_reply_edit')) {
$is_bbpress_page = bbp_is_topic_edit() || bbp_is_reply_edit();
}
if (function_exists('bbp_is_topic_edit') && function_exists('bbp_is_reply_edit')) {
$is_bbpress_page = $is_bbpress_page || bbp_is_topic_edit() || bbp_is_reply_edit();
}
// Fallback: check if we're on any bbPress related page
if (!$is_bbpress_page && function_exists('bbp_is_bbpress')) {
$is_bbpress_page = bbp_is_bbpress();
}
if ($is_bbpress_page) {
wp_enqueue_script('bbps-combined', plugin_dir_url(__FILE__) . '../assets/bbps-combined.js', array('jquery'), '1.0.0', true);
wp_localize_script('bbps-combined', 'bbps_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('bbps_preview_nonce')
));
}
}
public function ajax_preview_content() {
if (!wp_verify_nonce($_POST['nonce'], 'bbps_preview_nonce')) {
wp_die(__('Security check failed', 'bbpress-support-toolkit'));
}
$content = wp_kses_post($_POST['content']);
$preview = apply_filters('the_content', $content);
wp_send_json_success($preview);
}
}
/**
* Mark as Read Feature
*/
class BBPS_Mark_As_Read {
public function __construct() {
if (get_option('bbps_enable_mark_as_read', 0)) {
add_action('init', array($this, 'init'));
}
}
public function init() {
add_action('bbp_template_after_single_topic', array($this, 'add_mark_read_link'));
add_action('wp_ajax_bbps_mark_read', array($this, 'ajax_mark_read'));
add_action('wp_ajax_nopriv_bbps_mark_read', array($this, 'ajax_mark_read'));
add_filter('bbp_get_topic_class', array($this, 'add_read_status_class'), 10, 2);
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
}
public function add_mark_read_link() {
if (!is_user_logged_in()) {
return;
}
$topic_id = function_exists('bbp_get_topic_id') ? bbp_get_topic_id() : 0;
$user_id = get_current_user_id();
$is_read = $this->is_topic_read($topic_id, $user_id);
$text = $is_read ? __('Mark as Unread', 'bbpress-support-toolkit') : __('Mark as Read', 'bbpress-support-toolkit');
$action = $is_read ? 'unread' : 'read';
echo '';
}
public function is_topic_read($topic_id, $user_id) {
$read_topics = get_user_meta($user_id, '_bbps_read_topics', true);
return is_array($read_topics) && in_array($topic_id, $read_topics);
}
public function ajax_mark_read() {
if (!is_user_logged_in()) {
wp_die(__('Please log in', 'bbpress-support-toolkit'));
}
$topic_id = intval($_POST['topic_id']);
$action = sanitize_text_field($_POST['action']);
$user_id = get_current_user_id();
$read_topics = get_user_meta($user_id, '_bbps_read_topics', true);
if (!is_array($read_topics)) {
$read_topics = array();
}
if ($action === 'read') {
if (!in_array($topic_id, $read_topics)) {
$read_topics[] = $topic_id;
}
} else {
$read_topics = array_diff($read_topics, array($topic_id));
}
update_user_meta($user_id, '_bbps_read_topics', $read_topics);
wp_send_json_success(array(
'action' => $action,
'new_text' => $action === 'read' ? __('Mark as Unread', 'bbpress-support-toolkit') : __('Mark as Read', 'bbpress-support-toolkit'),
'new_action' => $action === 'read' ? 'unread' : 'read'
));
}
public function add_read_status_class($classes, $topic_id) {
if (is_user_logged_in() && $this->is_topic_read($topic_id, get_current_user_id())) {
$classes[] = 'bbps-topic-read';
} else {
$classes[] = 'bbps-topic-unread';
}
return $classes;
}
public function enqueue_scripts() {
$is_single_topic = function_exists('bbp_is_single_topic') && bbp_is_single_topic();
if ($is_single_topic) {
wp_enqueue_script('bbps-combined', plugin_dir_url(__FILE__) . '../assets/bbps-combined.js', array('jquery'), '1.0.0', true);
wp_localize_script('bbps-combined', 'bbps_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('bbps_nonce'),
'strings' => array(
'mark_read' => __('Mark as Read', 'bbpress-support-toolkit'),
'mark_unread' => __('Mark as Unread', 'bbpress-support-toolkit'),
'error' => __('An error occurred', 'bbpress-support-toolkit')
)
));
}
}
}
/**
* Report Content Feature
*/
class BBPS_Report_Content {
public function __construct() {
if (get_option('bbps_enable_report_content', 0)) {
add_action('init', array($this, 'init'));
}
}
public function init() {
add_action('bbp_template_after_single_topic', array($this, 'add_report_link'));
add_action('bbp_template_after_single_reply', array($this, 'add_report_link'));
add_action('wp_ajax_bbps_report_content', array($this, 'ajax_report_content'));
add_action('wp_ajax_nopriv_bbps_report_content', array($this, 'ajax_report_content'));
add_action('init', array($this, 'register_post_status'));
}
public function register_post_status() {
register_post_status('reported', array(
'label' => __('Reported', 'bbpress-support-toolkit'),
'public' => false,
'exclude_from_search' => true,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Reported (%s)', 'Reported (%s)', 'bbpress-support-toolkit')
));
}
public function add_report_link() {
if (!is_user_logged_in()) {
return;
}
$post_id = get_the_ID();
echo '';
}
public function ajax_report_content() {
if (!is_user_logged_in()) {
wp_die(__('Please log in', 'bbpress-support-toolkit'));
}
$post_id = intval($_POST['post_id']);
$reason = sanitize_textarea_field($_POST['reason']);
// Mark post as reported
wp_update_post(array(
'ID' => $post_id,
'post_status' => 'reported'
));
// Save report reason
update_post_meta($post_id, '_bbps_report_reason', $reason);
update_post_meta($post_id, '_bbps_reported_by', get_current_user_id());
update_post_meta($post_id, '_bbps_reported_date', current_time('mysql'));
wp_send_json_success(__('Content reported successfully.', 'bbpress-support-toolkit'));
}
}
/**
* Canned Replies Feature
* Note: Functionality moved to enhanced-features.php to avoid duplication
*/
class BBPS_Canned_Replies {
public function __construct() {
// Functionality moved to enhanced-features.php
// This prevents duplicate registration
}
}
/**
* Topic Lock Feature
*/
class BBPS_Topic_Lock {
public function __construct() {
if (get_option('bbps_enable_topic_lock', 0)) {
add_action('init', array($this, 'init'));
}
}
public function init() {
add_action('bbp_template_before_single_topic', array($this, 'check_topic_lock'));
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
add_action('wp_ajax_bbps_topic_lock', array($this, 'ajax_topic_lock'));
add_action('wp_ajax_nopriv_bbps_topic_lock', array($this, 'ajax_topic_lock'));
}
public function check_topic_lock() {
if (!current_user_can('moderate_forums')) {
return;
}
$topic_id = function_exists('bbp_get_topic_id') ? bbp_get_topic_id() : 0;
$current_user_id = get_current_user_id();
// Check if topic is locked by another user
$lock_info = get_transient('bbps_topic_lock_' . $topic_id);
if ($lock_info && $lock_info['user_id'] != $current_user_id) {
$user_info = get_userdata($lock_info['user_id']);
echo '';
echo '';
printf(
__('Warning: %s is currently viewing this topic (since %s)', 'bbpress-support-toolkit'),
esc_html($user_info->display_name),
esc_html(human_time_diff($lock_info['timestamp']))
);
echo '
';
}
// Set lock for current user
set_transient('bbps_topic_lock_' . $topic_id, array(
'user_id' => $current_user_id,
'timestamp' => time()
), 300); // 5 minutes
}
public function enqueue_scripts() {
$is_single_topic = function_exists('bbp_is_single_topic') && bbp_is_single_topic();
if ($is_single_topic && current_user_can('moderate_forums')) {
wp_enqueue_script('bbps-combined', plugin_dir_url(__FILE__) . '../assets/bbps-combined.js', array('jquery'), '1.0.0', true);
$topic_id = function_exists('bbp_get_topic_id') ? bbp_get_topic_id() : 0;
wp_localize_script('bbps-combined', 'bbps_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'topic_id' => $topic_id,
'user_id' => get_current_user_id()
));
}
}
public function ajax_topic_lock() {
$topic_id = intval($_POST['topic_id']);
$user_id = get_current_user_id();
if (!current_user_can('moderate_forums')) {
wp_send_json_error(__('Permission denied', 'bbpress-support-toolkit'));
}
// Update lock
set_transient('bbps_topic_lock_' . $topic_id, array(
'user_id' => $user_id,
'timestamp' => time()
), 300);
wp_send_json_success();
}
}
// Initialize all features
new BBPS_Admin_Notes();
// BBPS_Live_Preview functionality moved to enhanced-features.php to avoid duplication
// new BBPS_Live_Preview();
new BBPS_Mark_As_Read();
new BBPS_Report_Content();
// BBPS_Canned_Replies functionality moved to enhanced-features.php
new BBPS_Topic_Lock();