PluginProbe
Forumax – AI Powered Advanced Community Forum Plugin / 2.5.1
Forumax – AI Powered Advanced Community Forum Plugin v2.5.1
2.5.1 2.5.0 2.4.4 2.4.3 2.4.2 2.4.1 2.4.0 trunk 1.0.8 1.1.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 All 31 releases
← All changes | includes/features/bbp_voting/frontend.php +74 -66 1.4.1 → 2.5.1 View file →
@@ -3,10 +3,10 @@
3 3 exit; // Exit if accessed directly.
4 4 }
5 5
6 6 // Vote Buttons and Score hooks.
7 -add_action( 'bbp_theme_after_topic_author_details', 'bbp_voting_buttons' ); // ✅ New Hook
8 -add_action( 'bbp_theme_after_reply_author_details', 'bbp_voting_buttons' );
7 +add_action( 'bbp_theme_after_topic_content', 'bbp_voting_buttons' );
8 +add_action( 'forumax_reply_avatar_voting', 'bbp_voting_buttons' );
9 9 add_action( 'bbp_voting_cpt', 'bbp_voting_buttons', 10, 1 );
10 10
11 11 function bbp_voting_buttons( $post_obj = false ) {
12 12 // Don't show voting buttons on user profile pages
@@ -19,53 +19,65 @@
19 19 $reply_post_type = bbp_get_reply_post_type();
20 20 $this_post_type = '';
21 21 $post = null;
22 22
23 - // Get post object based on context
24 - if ( $current_action === 'bbp_voting_cpt' ) {
25 - if ( ! $post_obj ) return;
23 + // Prefer explicitly passed post object (custom hooks/CPT usage).
24 + if ( $post_obj instanceof WP_Post ) {
26 25 $post = $post_obj;
27 - } else {
26 + $this_post_type = get_post_type( $post->ID );
27 + }
28 +
29 + // Fallback to action-based context detection.
30 + if ( empty( $post ) ) {
31 + if ( $current_action === 'bbp_voting_cpt' ) {
32 + if ( ! $post_obj ) return;
33 + $post = $post_obj;
34 + $this_post_type = get_post_type( $post->ID );
35 + } else {
28 36 // Determine post type from current action
29 37 if ( in_array( $current_action, [
30 38 'bbp_theme_before_topic_title',
31 39 'bbp_template_before_lead_topic',
32 - 'bbp_theme_after_topic_author_details'
40 + 'bbp_theme_after_topic_author_details',
41 + 'bbp_theme_after_topic_content',
33 42 ] ) ) {
34 43 $this_post_type = $topic_post_type;
35 44 $post = bbpress()->topic_query->post;
36 45 } elseif ( in_array( $current_action, [
37 46 'bbp_theme_before_reply_content',
38 - 'bbp_theme_after_reply_author_details'
47 + 'bbp_theme_after_reply_author_details',
48 + 'forumax_reply_avatar_voting',
49 + 'bbp_theme_after_reply_content',
39 50 ] ) ) {
40 51 $this_post_type = bbp_voting_get_current_post_type();
41 52 $post = bbpress()->reply_query->post;
42 53 }
54 + }
55 + }
43 56
44 - // Exit if unknown context or no post
45 - if ( empty( $this_post_type ) || empty( $post ) ) return;
57 + // Exit if unknown context or no post
58 + if ( empty( $this_post_type ) || empty( $post ) ) return;
46 59
47 - // Check forum settings
48 - $forum_id = ($this_post_type === $topic_post_type)
49 - ? bbp_get_topic_forum_id( $post->ID )
50 - : bbp_get_reply_forum_id( $post->ID );
60 + // Check forum settings
61 + $forum_id = ($this_post_type === $topic_post_type)
62 + ? bbp_get_topic_forum_id( $post->ID )
63 + : bbp_get_reply_forum_id( $post->ID );
51 64
52 - // Check if voting is allowed on this forum
53 - if ( ! apply_filters( 'bbp_voting_allowed_on_forum', true, $forum_id ) ) return;
65 + // Check if voting is allowed on this forum
66 + if ( ! apply_filters( 'bbp_voting_allowed_on_forum', true, $forum_id ) ) return;
54 67
55 - // Get post-specific settings
56 - $post_setting = ($this_post_type === $topic_post_type)
57 - ? get_post_meta( $forum_id, 'bbp_voting_forum_enable_topics', true )
58 - : get_post_meta( $forum_id, 'bbp_voting_forum_enable_replies', true );
68 + // Get post-specific settings
69 + $post_setting = ($this_post_type === $topic_post_type)
70 + ? get_post_meta( $forum_id, 'bbp_voting_forum_enable_topics', true )
71 + : get_post_meta( $forum_id, 'bbp_voting_forum_enable_replies', true );
59 72
60 - $broad_disable = ($this_post_type === $topic_post_type)
61 - ? bbpc_get_opt( 'is_voting_disabled_topics', 0 )
62 - : bbpc_get_opt( 'is_voting_disabled_replies', 0 );
73 + $broad_disable = ($this_post_type === $topic_post_type)
74 + ? forumax_get_opt( 'is_voting_disabled_topics', 0 )
75 + : forumax_get_opt( 'is_voting_disabled_replies', 0 );
63 76
64 - // Check if voting is disabled
65 - if ( ! empty( $post_setting ) && $post_setting === 'false' ) return;
66 - if ( empty( $post_setting ) && $broad_disable === '0' ) return;
67 - }
77 + // Check if voting is disabled
78 + if ( ! empty( $post_setting ) && $post_setting === 'false' ) return;
79 + if ( empty( $post_setting ) && $broad_disable === '0' ) return;
68 80
69 81 $post_id = $post->ID;
70 82
71 83 $score = (int) get_post_meta( $post_id, 'bbp_voting_score', true );
@@ -80,19 +92,28 @@
80 92 }
81 93
82 94 $voting_log = get_post_meta( $post_id, 'bbp_voting_log', true );
83 95 $voting_log = is_array( $voting_log ) ? $voting_log : [];
84 - $client_ip = $_SERVER['REMOTE_ADDR'];
85 - $identifier = is_user_logged_in() ? get_current_user_id() : $client_ip;
86 - $existing_vote = $voting_log[ $identifier ] ?? 0;
96 + // Match the identifier the AJAX handler stores (hashed IP for visitors),
97 + // falling back to legacy raw-IP entries saved before 2.3.1.
98 + $existing_vote = 0;
99 + if ( is_user_logged_in() ) {
100 + $existing_vote = $voting_log[ get_current_user_id() ] ?? 0;
101 + } elseif ( ! empty( $voting_log ) ) {
102 + $existing_vote = $voting_log[ forumax_get_hashed_ip() ] ?? 0;
103 + if ( ! $existing_vote ) {
104 + $raw_ip = forumax_get_raw_ip();
105 + $existing_vote = $raw_ip ? ( $voting_log[ $raw_ip ] ?? 0 ) : 0;
106 + }
107 + }
87 108
88 109 // Check if admin can bypass voting restrictions
89 110 $admin_bypass = current_user_can( 'administrator' ) &&
90 - bbpc_get_opt( 'is_admin_can_vote_unlimited', false );
111 + forumax_get_opt( 'is_admin_can_vote_unlimited', false );
91 112
92 113 // Determine if this is view-only mode
93 114 $view_only = ! is_user_logged_in() &&
94 - bbpc_get_opt( 'is_disabled_voting_for_non_logged_users', false );
115 + forumax_get_opt( 'is_disabled_voting_for_non_logged_users', false );
95 116
96 117 // Additional view-only checks for regular context (not CPT)
97 118 if ( ! $view_only && $current_action !== 'bbp_voting_cpt' ) {
98 119 // Check if topic is closed and voting on closed topics is disabled
@@ -99,29 +120,26 @@
99 120 $topic_id = ( $this_post_type === $topic_post_type ) ?
100 121 $post_id : bbp_get_reply_topic_id( $post_id );
101 122
102 123 if ( get_post_status( $topic_id ) === 'closed' &&
103 - bbpc_get_opt( 'is_disabled_voting_closed_topics', false ) ) {
124 + forumax_get_opt( 'is_disabled_voting_closed_topics', false ) ) {
104 125 $view_only = true;
105 126 }
106 127
107 128 // Check if voting on own posts is disabled
108 129 if ( ! $view_only &&
109 - bbpc_get_opt( 'is_disabled_voting_own_topic_reply', false ) &&
130 + forumax_get_opt( 'is_disabled_voting_own_topic_reply', false ) &&
110 131 $post->post_author == get_current_user_id() ) {
111 132 $view_only = true;
112 133 }
113 134 }
114 135
115 - $disable_down = bbpc_get_opt( 'is_down_votes_disabled', 0 );
116 - $vote_number_display = bbpc_get_opt( 'vote_numbers_display', 'hover' );
136 + $disable_down = forumax_get_opt( 'is_down_votes_disabled', 0 );
137 + $vote_number_display = forumax_get_opt( 'vote_numbers_display', 'hover' );
117 138 $display_vote_nums = 'num-' . $vote_number_display;
118 139
119 140 // Determine if floating style should be applied
120 - $float = in_array( $current_action, [
121 - 'bbp_theme_before_reply_content',
122 - 'bbp_voting_cpt'
123 - ] );
141 + $float = ( $current_action === 'bbp_voting_cpt' );
124 142
125 143 // Build CSS classes for the voting container
126 144 $vote_classes = [
127 145 'bbp-voting',
@@ -143,11 +161,11 @@
143 161 // Start building HTML
144 162 $html = '<div class="' . implode(' ', $vote_classes) . '">';
145 163
146 164 // Add label if enabled
147 - $is_label = bbpc_get_opt( 'is_label', true );
165 + $is_label = forumax_get_opt( 'is_label', true );
148 166 if ( $is_label ) {
149 - $upvote_label = bbpc_get_opt( 'upvote_label' );
167 + $upvote_label = forumax_get_opt( 'upvote_label' );
150 168 if ( $upvote_label ) {
151 169 $html .= '<div class="bbp-voting-label helpful">' . esc_html( $upvote_label ) . '</div>';
152 170 }
153 171 }
@@ -173,10 +191,11 @@
173 191 esc_attr( $post_id ),
174 192 esc_html( $plusups )
175 193 );
176 194
195 +
177 196 // Downvote form (if enabled)
178 - if ( $disable_down === '1' ) {
197 + if ( $disable_down == 1 ) {
179 198 $html .= sprintf(
180 199 '<form name="amp-form%1$s" method="post" action-xhr="%2$s" target="_top" on="submit-success: AMP.setState({\'votedown%1$s\': %3$s})">
181 200 <input type="hidden" name="action" value="bbpress_post_vote_link_clicked">
182 201 <input type="hidden" name="post_id" value="%4$s" />
@@ -199,9 +218,9 @@
199 218 $post_id . ', 1); return false;">Up</a>';
200 219
201 220 $html .= '<div class="score">' . $score . '</div>';
202 221
203 - if ( $disable_down === '1' ) {
222 + if ( $disable_down == 1 ) {
204 223 $html .= '<a class="vote down ' . esc_attr( $display_vote_nums ) . '" data-votes="' .
205 224 ( $downs ? $downs : '' ) . '" onclick="bbpress_post_vote_link_clicked(' .
206 225 $post_id . ', -1); return false;">Down</a>';
207 226 }
@@ -206,10 +225,10 @@
206 225 $post_id . ', -1); return false;">Down</a>';
207 226 }
208 227 }
209 228
210 - if ( $disable_down === '1' && $is_label ) {
211 - $downvote_label = bbpc_get_opt( 'downvote_label' );
229 + if ( $disable_down == 1 && $is_label ) {
230 + $downvote_label = forumax_get_opt( 'downvote_label' );
212 231 if ( $downvote_label ) {
213 232 $html .= '<div class="bbp-voting-label not-helpful">' . esc_html( $downvote_label ) . '</div>';
214 233 }
215 234 }
@@ -219,11 +238,11 @@
219 238 $html = apply_filters( 'bbp_voting_after_reply_voting_buttons', $html, $post_id );
220 239 }
221 240
222 241 // Close the voting container
223 - $html .= '</div><span style="display:none;">::</span>';
242 + $html .= '</div>';
224 243
225 - echo wp_kses_post( $html );
244 + echo $html;
226 245 }
227 246
228 247
229 248 // Sort by Votes
@@ -241,14 +260,14 @@
241 260 switch ( $current_filter ) {
242 261 case 'bbp_has_topics_query':
243 262 $this_post_type = $forum_post_type;
244 263 $post_setting = get_post_meta( $forum_id, 'sort_bbpress_topics_by_votes_on_forum', true );
245 - $broad_enable = bbpc_get_opt( 'is_sort_topic_by_votes', 0 );
264 + $broad_enable = forumax_get_opt( 'is_sort_topic_by_votes', false );
246 265 break;
247 266 case 'bbp_has_replies_query':
248 267 $this_post_type = $topic_post_type;
249 268 $post_setting = get_post_meta( $forum_id, 'sort_bbpress_replies_by_votes_on_forum', true );
250 - $broad_enable = bbpc_get_opt( 'is_sort_reply_by_votes', 0 );
269 + $broad_enable = forumax_get_opt( 'is_sort_reply_by_votes', false );
251 270 break;
252 271 default:
253 272 return $args;
254 273 }
@@ -286,23 +305,12 @@
286 305
287 306 // Get the meta key to sort by
288 307 $sort_meta_key = apply_filters( 'bbp_voting_sort_meta_key', 'bbp_voting_score' );
289 308
290 - // Find and fill any posts missing the sort meta key
291 - $missing_meta_query = [
292 - 'meta_query' => [
293 - [
294 - 'key' => $sort_meta_key,
295 - 'compare' => 'NOT EXISTS',
296 - 'value' => '',
297 - ],
298 - ],
299 - ];
300 -
301 - $query = new WP_Query( array_merge( $args, $missing_meta_query ) );
302 - foreach ( $query->posts as $post ) {
303 - $default_value = apply_filters( 'bbp_voting_sort_meta_key_default_value', '0', $post->ID );
304 - update_post_meta( $post->ID, $sort_meta_key, $default_value );
309 + // The default key is backfilled once site-wide and on save (see
310 + // forumax_backfill_voting_score_meta_once()), not per page view.
311 + if ( 'bbp_voting_score' !== $sort_meta_key ) {
312 + forumax_backfill_voting_sort_meta( $sort_meta_key, $args );
305 313 }
306 314
307 315 // Clear existing sort parameters
308 316 $args = array_diff_key( $args, array_flip( ['meta_key', 'meta_type', 'orderby', 'order'] ) );
@@ -342,8 +350,8 @@
342 350 }
343 351
344 352 add_action( 'init', 'bbp_voting_lead_topic' );
345 353 function bbp_voting_lead_topic() {
346 - if ( bbpc_get_opt( 'is_lead_topic_broken', false ) ) {
354 + if ( forumax_get_opt( 'is_lead_topic_broken', false ) ) {
347 355 add_filter( 'bbp_show_lead_topic', '__return_true' );
348 356 }
349 357 }