| @@ -1,8 +1,8 @@ | ||
| 1 | 1 | <?php |
| 2 | 2 | namespace features; |
| 3 | 3 | |
| 4 | -class bbp_solved_topic { | |
| 4 | +class forumax_solve_topic { | |
| 5 | 5 | |
| 6 | 6 | /** |
| 7 | 7 | * The capability required to view private posts. |
| 8 | 8 | * |
| @@ -41,13 +41,37 @@ | ||
| 41 | 41 | |
| 42 | 42 | add_filter( 'bbp_theme_before_topic_title', [ $this, 'solved_badge' ], 999, 2 ); |
| 43 | 43 | add_filter( 'bbp_topic_admin_links', [ $this, 'add_topic_admin_link' ], 10, 2 ); |
| 44 | 44 | |
| 45 | + add_action( 'template_redirect', [ $this, 'handle_solve_action' ] ); | |
| 46 | + | |
| 45 | 47 | // add a class name indicating the read status |
| 46 | 48 | add_filter( 'post_class', [ $this, 'reply_post_class' ] ); |
| 47 | 49 | } |
| 48 | 50 | |
| 49 | 51 | /** |
| 52 | + * Handle the solve/unsolve action via GET request | |
| 53 | + * | |
| 54 | + * @since 2.2.0 | |
| 55 | + */ | |
| 56 | + public function handle_solve_action() { | |
| 57 | + $topic_id = bbp_get_topic_id(); | |
| 58 | + | |
| 59 | + if ( isset( $_GET['solve_topic'] ) ) { | |
| 60 | + // Verify nonce | |
| 61 | + if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'forumax_solve_topic_' . $topic_id ) ) { | |
| 62 | + wp_die( esc_html__( 'Security check failed.', 'forumax' ) ); | |
| 63 | + } | |
| 64 | + $this->solve_topic( $topic_id ); | |
| 65 | + } elseif ( isset( $_GET['unsolve_topic'] ) ) { | |
| 66 | + if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'forumax_unsolve_topic_' . $topic_id ) ) { | |
| 67 | + wp_die( esc_html__( 'Security check failed.', 'forumax' ) ); | |
| 68 | + } | |
| 69 | + $this->unsolve_topic( $topic_id ); | |
| 70 | + } | |
| 71 | + } | |
| 72 | + | |
| 73 | + /** | |
| 50 | 74 | * Admin links |
| 51 | 75 | */ |
| 52 | 76 | public function add_topic_admin_link( $links, $topic_id ) { |
| 53 | 77 | |
| @@ -52,20 +76,18 @@ | ||
| 52 | 76 | public function add_topic_admin_link( $links, $topic_id ) { |
| 53 | 77 | |
| 54 | 78 | $topic_author = bbp_get_topic_author_id( bbp_get_topic_id() ); |
| 55 | 79 | if ( ( current_user_can( $this->capability ) ) || ( $topic_author == get_current_user_id() ) ) { |
| 56 | - if ( isset( $_GET['unsolve_topic'] ) ) { | |
| 57 | - $this->unsolve_topic( bbp_get_topic_id() ); | |
| 58 | - $links['solved'] = '<a href="' . bbp_get_topic_permalink() . '?solve_topic">' . esc_html__( 'Mark as solved', 'bbp-core' ) . '</a>'; | |
| 59 | - } elseif ( isset( $_GET['solve_topic'] ) ) { | |
| 60 | - $this->solve_topic( bbp_get_topic_id() ); | |
| 61 | - $links['unsolved'] = '<a href="' . bbp_get_topic_permalink() . '?unsolve_topic">' . esc_html__( 'Mark as unsolved', 'bbp-core' ) . '</a>'; | |
| 80 | + if ( $this->is_solved( bbp_get_topic_id() ) ) { | |
| 81 | + $links['unsolved'] = '<a href="' . wp_nonce_url( | |
| 82 | + add_query_arg( 'unsolve_topic', '1', bbp_get_topic_permalink() ), | |
| 83 | + 'forumax_unsolve_topic_' . bbp_get_topic_id() | |
| 84 | + ) . '">' . esc_html__( 'Mark as unsolved', 'forumax' ) . '</a>'; | |
| 62 | 85 | } else { |
| 63 | - if ( $this->is_solved( bbp_get_topic_id() ) ) { | |
| 64 | - $links['unsolved'] = '<a href="' . bbp_get_topic_permalink() . '?unsolve_topic">' . esc_html__( 'Mark as unsolved', 'bbp-core' ) . '</a>'; | |
| 65 | - } else { | |
| 66 | - $links['solved'] = '<a href="' . bbp_get_topic_permalink() . '?solve_topic">' . esc_html__( 'Mark as solved', 'bbp-core' ) . '</a>'; | |
| 67 | - } | |
| 86 | + $links['solved'] = '<a href="' . wp_nonce_url( | |
| 87 | + add_query_arg( 'solve_topic', '1', bbp_get_topic_permalink() ), | |
| 88 | + 'forumax_solve_topic_' . bbp_get_topic_id() | |
| 89 | + ) . '">' . esc_html__( 'Mark as solved', 'forumax' ) . '</a>'; | |
| 68 | 90 | } |
| 69 | 91 | } |
| 70 | 92 | return $links; |
| 71 | 93 | } |
| @@ -73,12 +95,13 @@ | ||
| 73 | 95 | public function solve_topic( $topic_id = 0 ) { |
| 74 | 96 | $topic_author = bbp_get_topic_author_id( $topic_id ); |
| 75 | 97 | if ( ( current_user_can( $this->capability ) ) || ( $topic_author == get_current_user_id() ) ) { |
| 76 | 98 | update_post_meta( $topic_id, '_bbp_topic_is_solved', '1' ); |
| 77 | - $redirect = remove_query_arg( [ 'solve_topic' ] ); | |
| 99 | + $redirect = remove_query_arg( [ 'solve_topic', '_wpnonce' ] ); | |
| 78 | 100 | wp_safe_redirect( $redirect ); |
| 101 | + exit; | |
| 79 | 102 | } else { |
| 80 | - wp_die( esc_html__( 'You do not have the permission to do that!', 'bbp-core' ) ); | |
| 103 | + wp_die( esc_html__( 'You do not have the permission to do that!', 'forumax' ) ); | |
| 81 | 104 | } |
| 82 | 105 | |
| 83 | 106 | } |
| 84 | 107 | |
| @@ -85,12 +108,13 @@ | ||
| 85 | 108 | public function unsolve_topic( $topic_id = 0 ) { |
| 86 | 109 | $topic_author = bbp_get_topic_author_id( $topic_id ); |
| 87 | 110 | if ( ( current_user_can( $this->capability ) ) || ( $topic_author == get_current_user_id() ) ) { |
| 88 | 111 | delete_post_meta( $topic_id, '_bbp_topic_is_solved' ); |
| 89 | - $redirect = remove_query_arg( [ 'unsolve_topic' ] ); | |
| 112 | + $redirect = remove_query_arg( [ 'unsolve_topic', '_wpnonce' ] ); | |
| 90 | 113 | wp_safe_redirect( $redirect ); |
| 114 | + exit; | |
| 91 | 115 | } else { |
| 92 | - wp_die( esc_html__( 'You do not have the permission to do that!', 'bbp-core' ) ); | |
| 116 | + wp_die( esc_html__( 'You do not have the permission to do that!', 'forumax' ) ); | |
| 93 | 117 | } |
| 94 | 118 | } |
| 95 | 119 | |
| 96 | 120 | /** |
| @@ -101,9 +125,9 @@ | ||
| 101 | 125 | * |
| 102 | 126 | * @return void |
| 103 | 127 | */ |
| 104 | 128 | public function filter_capability() { |
| 105 | - $this->capability = apply_filters( 'bbp_solved_topic_capability', $this->capability ); | |
| 129 | + $this->capability = apply_filters( 'forumax_solve_topic_capability', $this->capability ); | |
| 106 | 130 | } |
| 107 | 131 | |
| 108 | 132 | /** |
| 109 | 133 | * Solved topic badge |
| @@ -133,9 +157,9 @@ | ||
| 133 | 157 | if ( ( ! $has_best_answer ) || ( $is_best_answer ) ) { |
| 134 | 158 | ?> |
| 135 | 159 | <p> |
| 136 | 160 | <input name="bbp_best_answer" id="bbp_best_answer" type="checkbox"<?php checked( '1', $is_best_answer ); ?> value="1" tabindex="<?php bbp_tab_index(); ?>" /> |
| 137 | - <label for="bbp_best_answer"><?php esc_html_e( 'Set this reply as Best Answer.', 'bbp-core' ); ?></label> | |
| 161 | + <label for="bbp_best_answer"><?php esc_html_e( 'Set this reply as Best Answer.', 'forumax' ); ?></label> | |
| 138 | 162 | </p> |
| 139 | 163 | <?php |
| 140 | 164 | } |
| 141 | 165 | } |
| @@ -152,10 +176,10 @@ | ||
| 152 | 176 | $topic_author = bbp_get_topic_author_id( bbp_get_topic_id() ); |
| 153 | 177 | if ( bbp_is_topic_edit() && ( ( current_user_can( $this->capability ) ) || ( $topic_author == get_current_user_id() ) ) ) { |
| 154 | 178 | ?> |
| 155 | 179 | <p> |
| 156 | - <input name="bbp_solved_topic" id="bbp_solved_topic" type="checkbox"<?php checked( '1', $this->is_solved( bbp_get_topic_id() ) ); ?> value="1" tabindex="<?php bbp_tab_index(); ?>" /> | |
| 157 | - <label for="bbp_solved_topic"><?php esc_html_e( 'Set this post as solved.', 'bbp-core' ); ?></label> | |
| 180 | + <input name="forumax_solve_topic" id="forumax_solve_topic" type="checkbox"<?php checked( '1', $this->is_solved( bbp_get_topic_id() ) ); ?> value="1" tabindex="<?php bbp_tab_index(); ?>" /> | |
| 181 | + <label for="forumax_solve_topic"><?php esc_html_e( 'Set this post as solved.', 'forumax' ); ?></label> | |
| 158 | 182 | </p> |
| 159 | 183 | <?php |
| 160 | 184 | } |
| 161 | 185 | |
| @@ -201,9 +225,9 @@ | ||
| 201 | 225 | * @return void |
| 202 | 226 | */ |
| 203 | 227 | public function update_topic( $topic_id = 0, $is_edit = false ) { |
| 204 | 228 | |
| 205 | - if ( isset( $_POST['bbp_solved_topic'] ) ) { | |
| 229 | + if ( isset( $_POST['forumax_solve_topic'] ) ) { | |
| 206 | 230 | update_post_meta( $topic_id, '_bbp_topic_is_solved', '1' ); |
| 207 | 231 | } else { |
| 208 | 232 | delete_post_meta( $topic_id, '_bbp_topic_is_solved' ); |
| 209 | 233 | } |
| @@ -338,9 +362,9 @@ | ||
| 338 | 362 | |
| 339 | 363 | $topic_id = bbp_get_topic_id(); |
| 340 | 364 | |
| 341 | 365 | if ( $this->is_best_answer( $reply_id ) ) { |
| 342 | - $content = '<div class="solved-topic-bar" id="best-answer"><span class="badge"><i class="icon_check"></i> ' . esc_html__( 'Best Answer', 'bbp-core' ) . '</span></div>' . $content; | |
| 366 | + $content = '<div class="solved-topic-bar" id="best-answer"><span class="badge"><i class="icon_check"></i> ' . esc_html__( 'Best Answer', 'forumax' ) . '</span></div>' . $content; | |
| 343 | 367 | } |
| 344 | 368 | |
| 345 | 369 | return $content; |
| 346 | 370 | } |
| @@ -371,9 +395,9 @@ | ||
| 371 | 395 | $close = '</div>'; |
| 372 | 396 | } |
| 373 | 397 | |
| 374 | 398 | if ( $this->is_solved( $topic_id ) ) { |
| 375 | - $resolved = '<span class="accepted-ans-mark badge"><i class="icon_check_alt"></i> ' . esc_html__( 'Resolved', 'bbp-core' ) . '</span>'; | |
| 399 | + $resolved = '<span class="accepted-ans-mark badge"><i class="icon_check_alt"></i> ' . esc_html__( 'Resolved', 'forumax' ) . '</span>'; | |
| 376 | 400 | } |
| 377 | 401 | |
| 378 | 402 | $content = $content . $open . $resolved . $has_best_answer . $close; |
| 379 | 403 | |
| @@ -411,9 +435,9 @@ | ||
| 411 | 435 | } |
| 412 | 436 | } |
| 413 | 437 | |
| 414 | 438 | // Instantiate the class. |
| 415 | -$GLOBALS['bbp_solved_topic'] = new bbp_solved_topic(); | |
| 439 | +$GLOBALS['forumax_solve_topic'] = new forumax_solve_topic(); | |
| 416 | 440 | |
| 417 | -function bbp_solved_topic(): bbp_solved_topic { | |
| 418 | - return new bbp_solved_topic(); | |
| 441 | +function forumax_solve_topic(): forumax_solve_topic { | |
| 442 | + return new forumax_solve_topic(); | |
| 419 | 443 | } |