PluginProbe
Forumax – AI Powered Advanced Community Forum Plugin / 2.0.0
Forumax – AI Powered Advanced Community Forum Plugin v2.0.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 2.0.0 2.1.0 All 29 releases
bbp-core / vendor / bbpress / includes / common / widgets.php

widgets.php in Forumax – AI Powered Advanced Community Forum Plugin 2.0.0, at vendor/bbpress/includes/common/widgets.php

1,242 lines 37.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * bbPress Widgets
5 *
6 * Contains the forum list, topic list, reply list and login form widgets.
7 *
8 * @package bbPress
9 * @subpackage Widgets
10 */
11
12 // Exit if accessed directly
13 defined( 'ABSPATH' ) || exit;
14
15 /**
16 * bbPress Login Widget
17 *
18 * Adds a widget which displays the login form
19 *
20 * @since 2.0.0 bbPress (r2827)
21 */
22 class BBP_Login_Widget extends WP_Widget {
23
24 /**
25 * bbPress Login Widget
26 *
27 * Registers the login widget
28 *
29 * @since 2.0.0 bbPress (r2827)
30 */
31 public function __construct() {
32 $widget_ops = apply_filters( 'bbp_login_widget_options', array(
33 'classname' => 'bbp_widget_login',
34 'description' => esc_html__( 'A simple login form with optional links to sign-up and lost password pages.', 'bbpress' ),
35 'customize_selective_refresh' => true
36 ) );
37
38 parent::__construct( false, esc_html__( '(bbPress) Login Widget', 'bbpress' ), $widget_ops );
39 }
40
41 /**
42 * Register the widget
43 *
44 * @since 2.0.0 bbPress (r3389)
45 */
46 public static function register_widget() {
47 register_widget( 'BBP_Login_Widget' );
48 }
49
50 /**
51 * Displays the output, the login form
52 *
53 * @since 2.0.0 bbPress (r2827)
54 *
55 * @param array $args Arguments
56 * @param array $instance Instance
57 */
58 public function widget( $args = array(), $instance = array() ) {
59
60 // Get widget settings
61 $settings = $this->parse_settings( $instance );
62
63 // Typical WordPress filter
64 $settings['title'] = apply_filters( 'widget_title', $settings['title'], $instance, $this->id_base );
65
66 // bbPress filters
67 $settings['title'] = apply_filters( 'bbp_login_widget_title', $settings['title'], $instance, $this->id_base );
68 $settings['register'] = apply_filters( 'bbp_login_widget_register', $settings['register'], $instance, $this->id_base );
69 $settings['lostpass'] = apply_filters( 'bbp_login_widget_lostpass', $settings['lostpass'], $instance, $this->id_base );
70
71 echo $args['before_widget'];
72
73 if ( ! empty( $settings['title'] ) ) {
74 echo $args['before_title'] . $settings['title'] . $args['after_title'];
75 }
76
77 if ( ! is_user_logged_in() ) : ?>
78
79 <form method="post" action="<?php bbp_wp_login_action( array( 'context' => 'login_post' ) ); ?>" class="bbp-login-form">
80 <fieldset class="bbp-form">
81 <legend><?php esc_html_e( 'Log In', 'bbpress' ); ?></legend>
82
83 <div class="bbp-username">
84 <label for="user_login"><?php esc_html_e( 'Username', 'bbpress' ); ?>: </label>
85 <input type="text" name="log" value="<?php bbp_sanitize_val( 'user_login', 'text' ); ?>" size="20" maxlength="100" id="user_login" autocomplete="off" />
86 </div>
87
88 <div class="bbp-password">
89 <label for="user_pass"><?php esc_html_e( 'Password', 'bbpress' ); ?>: </label>
90 <input type="password" name="pwd" value="<?php bbp_sanitize_val( 'user_pass', 'password' ); ?>" size="20" id="user_pass" autocomplete="off" />
91 </div>
92
93 <div class="bbp-remember-me">
94 <input type="checkbox" name="rememberme" value="forever" <?php checked( bbp_get_sanitize_val( 'rememberme', 'checkbox' ) ); ?> id="rememberme" />
95 <label for="rememberme"><?php esc_html_e( 'Keep me signed in', 'bbpress' ); ?></label>
96 </div>
97
98 <?php do_action( 'login_form' ); ?>
99
100 <div class="bbp-submit-wrapper">
101
102 <button type="submit" name="user-submit" id="user-submit" class="button submit user-submit"><?php esc_html_e( 'Log In', 'bbpress' ); ?></button>
103
104 <?php bbp_user_login_fields(); ?>
105
106 </div>
107
108 <?php if ( ! empty( $settings['register'] ) || ! empty( $settings['lostpass'] ) ) : ?>
109
110 <div class="bbp-login-links">
111
112 <?php if ( ! empty( $settings['register'] ) ) : ?>
113
114 <a href="<?php echo esc_url( $settings['register'] ); ?>" title="<?php esc_attr_e( 'Register', 'bbpress' ); ?>" class="bbp-register-link"><?php esc_html_e( 'Register', 'bbpress' ); ?></a>
115
116 <?php endif; ?>
117
118 <?php if ( ! empty( $settings['lostpass'] ) ) : ?>
119
120 <a href="<?php echo esc_url( $settings['lostpass'] ); ?>" title="<?php esc_attr_e( 'Lost Password', 'bbpress' ); ?>" class="bbp-lostpass-link"><?php esc_html_e( 'Lost Password', 'bbpress' ); ?></a>
121
122 <?php endif; ?>
123
124 </div>
125
126 <?php endif; ?>
127
128 </fieldset>
129 </form>
130
131 <?php else : ?>
132
133 <div class="bbp-logged-in">
134 <a href="<?php bbp_user_profile_url( bbp_get_current_user_id() ); ?>" class="submit user-submit"><?php echo get_avatar( bbp_get_current_user_id(), '40' ); ?></a>
135 <h4><?php bbp_user_profile_link( bbp_get_current_user_id() ); ?></h4>
136
137 <?php bbp_logout_link(); ?>
138 </div>
139
140 <?php endif;
141
142 echo $args['after_widget'];
143 }
144
145 /**
146 * Update the login widget options
147 *
148 * @since 2.0.0 bbPress (r2827)
149 *
150 * @param array $new_instance The new instance options
151 * @param array $old_instance The old instance options
152 */
153 public function update( $new_instance, $old_instance ) {
154 $instance = $old_instance;
155 $instance['title'] = strip_tags( $new_instance['title'] );
156 $instance['register'] = esc_url_raw( $new_instance['register'] );
157 $instance['lostpass'] = esc_url_raw( $new_instance['lostpass'] );
158
159 return $instance;
160 }
161
162 /**
163 * Output the login widget options form
164 *
165 * @since 2.0.0 bbPress (r2827)
166 *
167 * @param $instance Instance
168 */
169 public function form( $instance = array() ) {
170
171 // Get widget settings
172 $settings = $this->parse_settings( $instance ); ?>
173
174 <p>
175 <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php esc_html_e( 'Title:', 'bbpress' ); ?>
176 <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $settings['title'] ); ?>" /></label>
177 </p>
178
179 <p>
180 <label for="<?php echo $this->get_field_id( 'register' ); ?>"><?php esc_html_e( 'Register URI:', 'bbpress' ); ?>
181 <input class="widefat" id="<?php echo $this->get_field_id( 'register' ); ?>" name="<?php echo $this->get_field_name( 'register' ); ?>" type="text" value="<?php echo esc_url( $settings['register'] ); ?>" /></label>
182 </p>
183
184 <p>
185 <label for="<?php echo $this->get_field_id( 'lostpass' ); ?>"><?php esc_html_e( 'Lost Password URI:', 'bbpress' ); ?>
186 <input class="widefat" id="<?php echo $this->get_field_id( 'lostpass' ); ?>" name="<?php echo $this->get_field_name( 'lostpass' ); ?>" type="text" value="<?php echo esc_url( $settings['lostpass'] ); ?>" /></label>
187 </p>
188
189 <?php
190 }
191
192 /**
193 * Merge the widget settings into defaults array.
194 *
195 * @since 2.3.0 bbPress (r4802)
196 *
197 * @param $instance Instance
198 */
199 public function parse_settings( $instance = array() ) {
200 return bbp_parse_args( $instance, array(
201 'title' => '',
202 'register' => '',
203 'lostpass' => ''
204 ), 'login_widget_settings' );
205 }
206 }
207
208 /**
209 * bbPress Views Widget
210 *
211 * Adds a widget which displays the view list
212 *
213 * @since 2.0.0 bbPress (r3020)
214 */
215 class BBP_Views_Widget extends WP_Widget {
216
217 /**
218 * bbPress View Widget
219 *
220 * Registers the view widget
221 *
222 * @since 2.0.0 bbPress (r3020)
223 */
224 public function __construct() {
225 $widget_ops = apply_filters( 'bbp_views_widget_options', array(
226 'classname' => 'widget_display_views',
227 'description' => esc_html__( 'A list of registered optional topic views.', 'bbpress' ),
228 'customize_selective_refresh' => true
229 ) );
230
231 parent::__construct( false, esc_html__( '(bbPress) Topic Views List', 'bbpress' ), $widget_ops );
232 }
233
234 /**
235 * Register the widget
236 *
237 * @since 2.0.0 bbPress (r3389)
238 */
239 public static function register_widget() {
240 register_widget( 'BBP_Views_Widget' );
241 }
242
243 /**
244 * Displays the output, the view list
245 *
246 * @since 2.0.0 bbPress (r3020)
247 *
248 * @param array $args Arguments
249 * @param array $instance Instance
250 */
251 public function widget( $args = array(), $instance = array() ) {
252
253 // Only output widget contents if views exist
254 if ( ! bbp_get_views() ) {
255 return;
256 }
257
258 // Get widget settings
259 $settings = $this->parse_settings( $instance );
260
261 // Typical WordPress filter
262 $settings['title'] = apply_filters( 'widget_title', $settings['title'], $instance, $this->id_base );
263
264 // bbPress filter
265 $settings['title'] = apply_filters( 'bbp_view_widget_title', $settings['title'], $instance, $this->id_base );
266
267 // Start an output buffer
268 ob_start();
269
270 echo $args['before_widget'];
271
272 if ( ! empty( $settings['title'] ) ) {
273 echo $args['before_title'] . $settings['title'] . $args['after_title'];
274 } ?>
275
276 <ul class="bbp-views-widget">
277
278 <?php foreach ( array_keys( bbp_get_views() ) as $view ) : ?>
279
280 <li><a class="bbp-view-title" href="<?php bbp_view_url( $view ); ?>"><?php bbp_view_title( $view ); ?></a></li>
281
282 <?php endforeach; ?>
283
284 </ul>
285
286 <?php echo $args['after_widget'];
287
288 // Output the current buffer
289 echo ob_get_clean();
290 }
291
292 /**
293 * Update the view widget options
294 *
295 * @since 2.0.0 bbPress (r3020)
296 *
297 * @param array $new_instance The new instance options
298 * @param array $old_instance The old instance options
299 */
300 public function update( $new_instance = array(), $old_instance = array() ) {
301 $instance = $old_instance;
302 $instance['title'] = strip_tags( $new_instance['title'] );
303
304 return $instance;
305 }
306
307 /**
308 * Output the view widget options form
309 *
310 * @since 2.0.0 bbPress (r3020)
311 *
312 * @param $instance Instance
313 */
314 public function form( $instance = array() ) {
315
316 // Get widget settings
317 $settings = $this->parse_settings( $instance ); ?>
318
319 <p>
320 <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php esc_html_e( 'Title:', 'bbpress' ); ?>
321 <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $settings['title'] ); ?>" />
322 </label>
323 </p>
324
325 <?php
326 }
327
328 /**
329 * Merge the widget settings into defaults array.
330 *
331 * @since 2.3.0 bbPress (r4802)
332 *
333 * @param $instance Instance
334 */
335 public function parse_settings( $instance = array() ) {
336 return bbp_parse_args( $instance, array(
337 'title' => ''
338 ), 'view_widget_settings' );
339 }
340 }
341
342 /**
343 * bbPress Search Widget
344 *
345 * Adds a widget which displays the forum search form
346 *
347 * @since 2.3.0 bbPress (r4579)
348 */
349 class BBP_Search_Widget extends WP_Widget {
350
351 /**
352 * bbPress Search Widget
353 *
354 * Registers the search widget
355 *
356 * @since 2.3.0 bbPress (r4579)
357 */
358 public function __construct() {
359 $widget_ops = apply_filters( 'bbp_search_widget_options', array(
360 'classname' => 'widget_display_search',
361 'description' => esc_html__( 'The bbPress forum search form.', 'bbpress' ),
362 'customize_selective_refresh' => true
363 ) );
364
365 parent::__construct( false, esc_html__( '(bbPress) Forum Search Form', 'bbpress' ), $widget_ops );
366 }
367
368 /**
369 * Register the widget
370 *
371 * @since 2.3.0 bbPress (r4579)
372 */
373 public static function register_widget() {
374 register_widget( 'BBP_Search_Widget' );
375 }
376
377 /**
378 * Displays the output, the search form
379 *
380 * @since 2.3.0 bbPress (r4579)
381 */
382 public function widget( $args, $instance ) {
383
384 // Bail if search is disabled
385 if ( ! bbp_allow_search() ) {
386 return;
387 }
388
389 // Get widget settings
390 $settings = $this->parse_settings( $instance );
391
392 // Typical WordPress filter
393 $settings['title'] = apply_filters( 'widget_title', $settings['title'], $instance, $this->id_base );
394
395 // bbPress filter
396 $settings['title'] = apply_filters( 'bbp_search_widget_title', $settings['title'], $instance, $this->id_base );
397
398 echo $args['before_widget'];
399
400 if ( ! empty( $settings['title'] ) ) {
401 echo $args['before_title'] . $settings['title'] . $args['after_title'];
402 }
403
404 bbp_get_template_part( 'form', 'search' );
405
406 echo $args['after_widget'];
407 }
408
409 /**
410 * Update the widget options
411 *
412 * @since 2.3.0 bbPress (r4579)
413 *
414 * @param array $new_instance The new instance options
415 * @param array $old_instance The old instance options
416 */
417 public function update( $new_instance, $old_instance ) {
418 $instance = $old_instance;
419 $instance['title'] = strip_tags( $new_instance['title'] );
420
421 return $instance;
422 }
423
424 /**
425 * Output the search widget options form
426 *
427 * @since 2.3.0 bbPress (r4579)
428 *
429 * @param $instance Instance
430 */
431 public function form( $instance ) {
432
433 // Get widget settings
434 $settings = $this->parse_settings( $instance ); ?>
435
436 <p>
437 <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php esc_html_e( 'Title:', 'bbpress' ); ?>
438 <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $settings['title'] ); ?>" />
439 </label>
440 </p>
441
442 <?php
443 }
444
445 /**
446 * Merge the widget settings into defaults array.
447 *
448 * @since 2.3.0 bbPress (r4802)
449 *
450 * @param $instance Instance
451 */
452 public function parse_settings( $instance = array() ) {
453 return bbp_parse_args( $instance, array(
454 'title' => esc_html__( 'Search Forums', 'bbpress' )
455 ), 'search_widget_settings' );
456 }
457 }
458
459 /**
460 * bbPress Forum Widget
461 *
462 * Adds a widget which displays the forum list
463 *
464 * @since 2.0.0 bbPress (r2653)
465 */
466 class BBP_Forums_Widget extends WP_Widget {
467
468 /**
469 * bbPress Forum Widget
470 *
471 * Registers the forum widget
472 *
473 * @since 2.0.0 bbPress (r2653)
474 */
475 public function __construct() {
476 $widget_ops = apply_filters( 'bbp_forums_widget_options', array(
477 'classname' => 'widget_display_forums',
478 'description' => esc_html__( 'A list of forums with an option to set the parent.', 'bbpress' ),
479 'customize_selective_refresh' => true
480 ) );
481
482 parent::__construct( false, esc_html__( '(Forumax) Forums List', 'bbpress' ), $widget_ops );
483 }
484
485 /**
486 * Register the widget
487 *
488 * @since 2.0.0 bbPress (r3389)
489 */
490 public static function register_widget() {
491 register_widget( 'BBP_Forums_Widget' );
492 }
493
494 /**
495 * Displays the output, the forum list
496 *
497 * @since 2.0.0 bbPress (r2653)
498 *
499 * @param array $args Arguments
500 * @param array $instance Instance
501 */
502 public function widget( $args, $instance ) {
503
504 // Get widget settings
505 $settings = $this->parse_settings( $instance );
506
507 // Typical WordPress filter
508 $settings['title'] = apply_filters( 'widget_title', $settings['title'], $instance, $this->id_base );
509
510 // bbPress filter
511 $settings['title'] = apply_filters( 'bbp_forum_widget_title', $settings['title'], $instance, $this->id_base );
512
513 // Note: private and hidden forums will be excluded via the
514 // bbp_pre_get_posts_normalize_forum_visibility action and function.
515 $widget_query = new WP_Query( array(
516
517 // What and how
518 'post_type' => bbp_get_forum_post_type(),
519 'post_status' => bbp_get_public_status_id(),
520 'post_parent' => $settings['parent_forum'],
521 'posts_per_page' => (int) get_option( '_bbp_forums_per_page', 50 ),
522
523 // Order
524 'orderby' => 'menu_order title',
525 'order' => 'ASC',
526
527 // Performance
528 'ignore_sticky_posts' => true,
529 'no_found_rows' => true,
530 'update_post_term_cache' => false,
531 'update_post_meta_cache' => false
532 ) );
533
534 // Bail if no posts
535 if ( ! $widget_query->have_posts() ) {
536 return;
537 }
538
539 echo $args['before_widget'];
540
541 if ( ! empty( $settings['title'] ) ) {
542 echo $args['before_title'] . $settings['title'] . $args['after_title'];
543 } ?>
544
545 <ul class="bbp-forums-widget">
546
547 <?php while ( $widget_query->have_posts() ) : $widget_query->the_post(); ?>
548
549 <li <?php echo ( bbp_get_forum_id() === $widget_query->post->ID ? ' class="bbp-forum-widget-current-forum"' : '' ); ?>>
550 <a class="bbp-forum-title" href="<?php bbp_forum_permalink( $widget_query->post->ID ); ?>">
551 <?php bbp_forum_title( $widget_query->post->ID ); ?>
552 </a>
553 </li>
554
555 <?php endwhile; ?>
556
557 </ul>
558
559 <?php echo $args['after_widget'];
560
561 // Reset the $post global
562 wp_reset_postdata();
563 }
564
565 /**
566 * Update the forum widget options
567 *
568 * @since 2.0.0 bbPress (r2653)
569 *
570 * @param array $new_instance The new instance options
571 * @param array $old_instance The old instance options
572 */
573 public function update( $new_instance, $old_instance ) {
574 $instance = $old_instance;
575 $instance['title'] = strip_tags( $new_instance['title'] );
576 $instance['parent_forum'] = sanitize_text_field( $new_instance['parent_forum'] );
577
578 // Force to any
579 if ( ! empty( $instance['parent_forum'] ) && ! is_numeric( $instance['parent_forum'] ) ) {
580 $instance['parent_forum'] = 'any';
581 }
582
583 return $instance;
584 }
585
586 /**
587 * Output the forum widget options form
588 *
589 * @since 2.0.0 bbPress (r2653)
590 *
591 * @param $instance Instance
592 */
593 public function form( $instance ) {
594
595 // Get widget settings
596 $settings = $this->parse_settings( $instance ); ?>
597
598 <p>
599 <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php esc_html_e( 'Title:', 'bbpress' ); ?>
600 <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $settings['title'] ); ?>" />
601 </label>
602 </p>
603
604 <p>
605 <label for="<?php echo $this->get_field_id( 'parent_forum' ); ?>"><?php esc_html_e( 'Parent Forum ID:', 'bbpress' ); ?>
606 <input class="widefat" id="<?php echo $this->get_field_id( 'parent_forum' ); ?>" name="<?php echo $this->get_field_name( 'parent_forum' ); ?>" type="text" value="<?php echo esc_attr( $settings['parent_forum'] ); ?>" />
607 </label>
608
609 <br />
610
611 <small><?php esc_html_e( '"0" to show only root - "any" to show all', 'bbpress' ); ?></small>
612 </p>
613
614 <?php
615 }
616
617 /**
618 * Merge the widget settings into defaults array.
619 *
620 * @since 2.3.0 bbPress (r4802)
621 *
622 * @param $instance Instance
623 */
624 public function parse_settings( $instance = array() ) {
625 return bbp_parse_args( $instance, array(
626 'title' => esc_html__( 'Forums', 'bbpress' ),
627 'parent_forum' => 0
628 ), 'forum_widget_settings' );
629 }
630 }
631
632 /**
633 * bbPress Topic Widget
634 *
635 * Adds a widget which displays the topic list
636 *
637 * @since 2.0.0 bbPress (r2653)
638 */
639 class BBP_Topics_Widget extends WP_Widget {
640
641 /**
642 * bbPress Topic Widget
643 *
644 * Registers the topic widget
645 *
646 * @since 2.0.0 bbPress (r2653)
647 */
648 public function __construct() {
649 $widget_ops = apply_filters( 'bbp_topics_widget_options', array(
650 'classname' => 'widget_display_topics',
651 'description' => esc_html__( 'A list of recent topics, sorted by: newness, popularity, or recent replies.', 'bbpress' ),
652 'customize_selective_refresh' => true
653 ) );
654
655 parent::__construct( false, esc_html__( '(bbPress) Recent Topics', 'bbpress' ), $widget_ops );
656 }
657
658 /**
659 * Register the widget
660 *
661 * @since 2.0.0 bbPress (r3389)
662 */
663 public static function register_widget() {
664 register_widget( 'BBP_Topics_Widget' );
665 }
666
667 /**
668 * Displays the output, the topic list
669 *
670 * @since 2.0.0 bbPress (r2653)
671 *
672 * @param array $args
673 * @param array $instance
674 */
675 public function widget( $args = array(), $instance = array() ) {
676
677 // Get widget settings
678 $settings = $this->parse_settings( $instance );
679
680 // Typical WordPress filter
681 $settings['title'] = apply_filters( 'widget_title', $settings['title'], $instance, $this->id_base );
682
683 // bbPress filter
684 $settings['title'] = apply_filters( 'bbp_topic_widget_title', $settings['title'], $instance, $this->id_base );
685
686 // How do we want to order our results?
687 switch ( $settings['order_by'] ) {
688
689 // Order by most recent replies
690 case 'freshness' :
691 $topics_query = array(
692
693 // What and how
694 'post_type' => bbp_get_topic_post_type(),
695 'post_status' => bbp_get_public_topic_statuses(),
696 'post_parent' => $settings['parent_forum'],
697 'posts_per_page' => (int) $settings['max_shown'],
698 'meta_query' => array( array(
699 'key' => '_bbp_last_active_time',
700 'type' => 'DATETIME'
701 ) ),
702
703 // Ordering
704 'orderby' => 'meta_value',
705 'order' => 'DESC',
706
707 // Performance
708 'ignore_sticky_posts' => true,
709 'no_found_rows' => true,
710 'update_post_term_cache' => false,
711 'update_post_meta_cache' => false
712 );
713 break;
714
715 // Order by total number of replies
716 case 'popular' :
717 $topics_query = array(
718
719 // What and how
720 'post_type' => bbp_get_topic_post_type(),
721 'post_status' => bbp_get_public_topic_statuses(),
722 'post_parent' => $settings['parent_forum'],
723 'posts_per_page' => (int) $settings['max_shown'],
724 'meta_query' => array( array(
725 'key' => '_bbp_reply_count',
726 'type' => 'NUMERIC'
727 ) ),
728
729 // Ordering
730 'orderby' => 'meta_value_num',
731 'order' => 'DESC',
732
733 // Performance
734 'ignore_sticky_posts' => true,
735 'no_found_rows' => true,
736 'update_post_term_cache' => false,
737 'update_post_meta_cache' => false
738 );
739 break;
740
741 // Order by which topic was created most recently
742 case 'newness' :
743 default :
744 $topics_query = array(
745
746 // What and how
747 'post_type' => bbp_get_topic_post_type(),
748 'post_status' => bbp_get_public_topic_statuses(),
749 'post_parent' => $settings['parent_forum'],
750 'posts_per_page' => (int) $settings['max_shown'],
751
752 // Ordering
753 'orderby' => 'date',
754 'order' => 'DESC',
755
756 // Performance
757 'ignore_sticky_posts' => true,
758 'no_found_rows' => true,
759 'update_post_term_cache' => false,
760 'update_post_meta_cache' => false
761 );
762 break;
763 }
764
765 // Note: private and hidden forums will be excluded via the
766 // bbp_pre_get_posts_normalize_forum_visibility action and function.
767 $widget_query = new WP_Query( $topics_query );
768
769 // Bail if no topics are found
770 if ( ! $widget_query->have_posts() ) {
771 return;
772 }
773
774 // Start an output buffer
775 ob_start();
776
777 echo $args['before_widget'];
778
779 if ( ! empty( $settings['title'] ) ) {
780 echo $args['before_title'] . $settings['title'] . $args['after_title'];
781 } ?>
782
783 <ul class="bbp-topics-widget <?php echo esc_attr( $settings['order_by'] ); ?>">
784
785 <?php while ( $widget_query->have_posts() ) :
786
787 $widget_query->the_post();
788 $topic_id = bbp_get_topic_id( $widget_query->post->ID );
789 $author_link = '';
790
791 // Maybe get the topic author
792 if ( ! empty( $settings['show_user'] ) ) :
793 $author_link = bbp_get_topic_author_link( array( 'post_id' => $topic_id, 'type' => 'both', 'size' => 14 ) );
794 endif; ?>
795
796 <li>
797 <a class="bbp-forum-title" href="<?php bbp_topic_permalink( $topic_id ); ?>"><?php bbp_topic_title( $topic_id ); ?></a>
798
799 <?php if ( ! empty( $author_link ) ) : ?>
800
801 <?php printf( esc_html_x( 'by %1$s', 'widgets', 'bbpress' ), '<span class="topic-author">' . $author_link . '</span>' ); ?>
802
803 <?php endif; ?>
804
805 <?php if ( ! empty( $settings['show_date'] ) ) : ?>
806
807 <div><?php bbp_topic_last_active_time( $topic_id ); ?></div>
808
809 <?php endif; ?>
810
811 </li>
812
813 <?php endwhile; ?>
814
815 </ul>
816
817 <?php echo $args['after_widget'];
818
819 // Reset the $post global
820 wp_reset_postdata();
821
822 // Output the current buffer
823 echo ob_get_clean();
824 }
825
826 /**
827 * Update the topic widget options
828 *
829 * @since 2.0.0 bbPress (r2653)
830 *
831 * @param array $new_instance The new instance options
832 * @param array $old_instance The old instance options
833 */
834 public function update( $new_instance = array(), $old_instance = array() ) {
835 $instance = $old_instance;
836 $instance['title'] = strip_tags( $new_instance['title'] );
837 $instance['order_by'] = strip_tags( $new_instance['order_by'] );
838 $instance['parent_forum'] = sanitize_text_field( $new_instance['parent_forum'] );
839 $instance['max_shown'] = (int) $new_instance['max_shown'];
840
841 // Date
842 $instance['show_date'] = isset( $new_instance['show_date'] )
843 ? (bool) $new_instance['show_date']
844 : false;
845
846 // Author
847 $instance['show_user'] = isset( $new_instance['show_user'] )
848 ? (bool) $new_instance['show_user']
849 : false;
850
851 // Force to any
852 if ( ! empty( $instance['parent_forum'] ) && ! is_numeric( $instance['parent_forum'] ) ) {
853 $instance['parent_forum'] = 'any';
854 }
855
856 return $instance;
857 }
858
859 /**
860 * Output the topic widget options form
861 *
862 * @since 2.0.0 bbPress (r2653)
863 *
864 * @param $instance Instance
865 */
866 public function form( $instance = array() ) {
867
868 // Get widget settings
869 $settings = $this->parse_settings( $instance ); ?>
870
871 <p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php esc_html_e( 'Title:', 'bbpress' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $settings['title'] ); ?>" /></label></p>
872 <p><label for="<?php echo $this->get_field_id( 'max_shown' ); ?>"><?php esc_html_e( 'Maximum topics to show:', 'bbpress' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'max_shown' ); ?>" name="<?php echo $this->get_field_name( 'max_shown' ); ?>" type="text" value="<?php echo esc_attr( $settings['max_shown'] ); ?>" /></label></p>
873
874 <p>
875 <label for="<?php echo $this->get_field_id( 'parent_forum' ); ?>"><?php esc_html_e( 'Parent Forum ID:', 'bbpress' ); ?>
876 <input class="widefat" id="<?php echo $this->get_field_id( 'parent_forum' ); ?>" name="<?php echo $this->get_field_name( 'parent_forum' ); ?>" type="text" value="<?php echo esc_attr( $settings['parent_forum'] ); ?>" />
877 </label>
878
879 <br />
880
881 <small><?php esc_html_e( '"0" to show only root - "any" to show all', 'bbpress' ); ?></small>
882 </p>
883
884 <p><label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php esc_html_e( 'Show post date:', 'bbpress' ); ?> <input type="checkbox" id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" <?php checked( true, $settings['show_date'] ); ?> value="1" /></label></p>
885 <p><label for="<?php echo $this->get_field_id( 'show_user' ); ?>"><?php esc_html_e( 'Show topic author:', 'bbpress' ); ?> <input type="checkbox" id="<?php echo $this->get_field_id( 'show_user' ); ?>" name="<?php echo $this->get_field_name( 'show_user' ); ?>" <?php checked( true, $settings['show_user'] ); ?> value="1" /></label></p>
886
887 <p>
888 <label for="<?php echo $this->get_field_id( 'order_by' ); ?>"><?php esc_html_e( 'Order By:', 'bbpress' ); ?></label>
889 <select name="<?php echo $this->get_field_name( 'order_by' ); ?>" id="<?php echo $this->get_field_id( 'order_by' ); ?>">
890 <option <?php selected( $settings['order_by'], 'newness' ); ?> value="newness"><?php esc_html_e( 'Newest Topics', 'bbpress' ); ?></option>
891 <option <?php selected( $settings['order_by'], 'popular' ); ?> value="popular"><?php esc_html_e( 'Popular Topics', 'bbpress' ); ?></option>
892 <option <?php selected( $settings['order_by'], 'freshness' ); ?> value="freshness"><?php esc_html_e( 'Topics With Recent Replies', 'bbpress' ); ?></option>
893 </select>
894 </p>
895
896 <?php
897 }
898
899 /**
900 * Merge the widget settings into defaults array.
901 *
902 * @since 2.3.0 bbPress (r4802)
903 *
904 * @param $instance Instance
905 */
906 public function parse_settings( $instance = array() ) {
907 return bbp_parse_args( $instance, array(
908 'title' => esc_html__( 'Recent Topics', 'bbpress' ),
909 'max_shown' => 5,
910 'show_date' => false,
911 'show_user' => false,
912 'parent_forum' => 'any',
913 'order_by' => false
914 ), 'topic_widget_settings' );
915 }
916 }
917
918 /**
919 * bbPress Statistics Widget
920 *
921 * Adds a widget which displays the forum statistics
922 *
923 * @since 2.3.0 bbPress (r4509)
924 */
925 class BBP_Stats_Widget extends WP_Widget {
926
927 /**
928 * bbPress Statistics Widget
929 *
930 * Registers the statistics widget
931 *
932 * @since 2.3.0 bbPress (r4509)
933 */
934 public function __construct() {
935 $widget_ops = apply_filters( 'bbp_stats_widget_options', array(
936 'classname' => 'widget_display_stats',
937 'description' => esc_html__( 'Some statistics from your forum.', 'bbpress' ),
938 'customize_selective_refresh' => true
939 ) );
940
941 parent::__construct( false, esc_html__( '(bbPress) Statistics', 'bbpress' ), $widget_ops );
942 }
943
944 /**
945 * Register the widget
946 *
947 * @since 2.3.0 bbPress (r4509)
948 */
949 public static function register_widget() {
950 register_widget( 'BBP_Stats_Widget' );
951 }
952
953 /**
954 * Displays the output, the statistics
955 *
956 * @since 2.3.0 bbPress (r4509)
957 *
958 * @param array $args Arguments
959 * @param array $instance Instance
960 */
961 public function widget( $args = array(), $instance = array() ) {
962
963 // Get widget settings
964 $settings = $this->parse_settings( $instance );
965
966 // Typical WordPress filter
967 $settings['title'] = apply_filters( 'widget_title', $settings['title'], $instance, $this->id_base );
968
969 // bbPress widget title filter
970 $settings['title'] = apply_filters( 'bbp_stats_widget_title', $settings['title'], $instance, $this->id_base );
971
972 echo $args['before_widget'];
973
974 if ( ! empty( $settings['title'] ) ) {
975 echo $args['before_title'] . $settings['title'] . $args['after_title'];
976 }
977
978 bbp_get_template_part( 'content', 'statistics' );
979
980 echo $args['after_widget'];
981 }
982
983 /**
984 * Update the statistics widget options
985 *
986 * @since 2.3.0 bbPress (r4509)
987 *
988 * @param array $new_instance The new instance options
989 * @param array $old_instance The old instance options
990 *
991 * @return array
992 */
993 public function update( $new_instance, $old_instance ) {
994 $instance = $old_instance;
995 $instance['title'] = strip_tags( $new_instance['title'] );
996
997 return $instance;
998 }
999
1000 /**
1001 * Output the statistics widget options form
1002 *
1003 * @since 2.3.0 bbPress (r4509)
1004 *
1005 * @param $instance
1006 *
1007 * @return string|void
1008 */
1009 public function form( $instance ) {
1010
1011 // Get widget settings
1012 $settings = $this->parse_settings( $instance ); ?>
1013
1014 <p>
1015 <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php esc_html_e( 'Title:', 'bbpress' ); ?>
1016 <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $settings['title'] ); ?>"/>
1017 </label>
1018 </p>
1019
1020 <?php
1021 }
1022
1023 /**
1024 * Merge the widget settings into defaults array.
1025 *
1026 * @since 2.3.0 bbPress (r4802)
1027 *
1028 * @param $instance Instance
1029 */
1030 public function parse_settings( $instance = array() ) {
1031 return bbp_parse_args( $instance, array(
1032 'title' => esc_html__( 'Forum Statistics', 'bbpress' )
1033 ), 'stats_widget_settings' );
1034 }
1035 }
1036
1037 /**
1038 * bbPress Replies Widget
1039 *
1040 * Adds a widget which displays the replies list
1041 *
1042 * @since 2.0.0 bbPress (r2653)
1043 */
1044 class BBP_Replies_Widget extends WP_Widget {
1045
1046 /**
1047 * bbPress Replies Widget
1048 *
1049 * Registers the replies widget
1050 *
1051 * @since 2.0.0 bbPress (r2653)
1052 */
1053 public function __construct() {
1054 $widget_ops = apply_filters( 'bbp_replies_widget_options', array(
1055 'classname' => 'widget_display_replies',
1056 'description' => esc_html__( 'A list of the most recent replies.', 'bbpress' ),
1057 'customize_selective_refresh' => true
1058 ) );
1059
1060 parent::__construct( false, esc_html__( '(bbPress) Recent Replies', 'bbpress' ), $widget_ops );
1061 }
1062
1063 /**
1064 * Register the widget
1065 *
1066 * @since 2.0.0 bbPress (r3389)
1067 */
1068 public static function register_widget() {
1069 register_widget( 'BBP_Replies_Widget' );
1070 }
1071
1072 /**
1073 * Displays the output, the replies list
1074 *
1075 * @since 2.0.0 bbPress (r2653)
1076 *
1077 * @param array $args
1078 * @param array $instance
1079 */
1080 public function widget( $args, $instance ) {
1081
1082 // Get widget settings
1083 $settings = $this->parse_settings( $instance );
1084
1085 // Typical WordPress filter
1086 $settings['title'] = apply_filters( 'widget_title', $settings['title'], $instance, $this->id_base );
1087
1088 // bbPress filter
1089 $settings['title'] = apply_filters( 'bbp_replies_widget_title', $settings['title'], $instance, $this->id_base );
1090
1091 // Note: private and hidden forums will be excluded via the
1092 // bbp_pre_get_posts_normalize_forum_visibility action and function.
1093 $widget_query = new WP_Query( array(
1094
1095 // What and when
1096 'post_type' => bbp_get_reply_post_type(),
1097 'post_status' => bbp_get_public_reply_statuses(),
1098 'posts_per_page' => (int) $settings['max_shown'],
1099
1100 // Performance
1101 'ignore_sticky_posts' => true,
1102 'no_found_rows' => true,
1103 'update_post_term_cache' => false,
1104 'update_post_meta_cache' => false
1105 ) );
1106
1107 // Bail if no replies
1108 if ( ! $widget_query->have_posts() ) {
1109 return;
1110 }
1111
1112 // Start an output buffer
1113 ob_start();
1114
1115 echo $args['before_widget'];
1116
1117 if ( ! empty( $settings['title'] ) ) {
1118 echo $args['before_title'] . $settings['title'] . $args['after_title'];
1119 } ?>
1120
1121 <ul class="bbp-replies-widget">
1122
1123 <?php while ( $widget_query->have_posts() ) : $widget_query->the_post(); ?>
1124
1125 <li>
1126
1127 <?php
1128
1129 // Verify the reply ID
1130 $reply_id = bbp_get_reply_id( $widget_query->post->ID );
1131 $reply_link = '<a class="bbp-reply-topic-title" href="' . esc_url( bbp_get_reply_url( $reply_id ) ) . '" title="' . esc_attr( bbp_get_reply_excerpt( $reply_id, 50 ) ) . '">' . esc_html( bbp_get_reply_topic_title( $reply_id ) ) . '</a>';
1132 $time = get_the_time( 'U', $reply_id );
1133 $show_date = '<time datetime="' . gmdate( 'Y-m-d H:i:s', $time ) . '">' . esc_html( bbp_get_time_since( $time ) ) . '</time>';
1134
1135 // Only query user if showing them
1136 if ( ! empty( $settings['show_user'] ) ) :
1137 $author_link = bbp_get_reply_author_link( array( 'post_id' => $reply_id, 'type' => 'both', 'size' => 14 ) );
1138 else :
1139 $author_link = false;
1140 endif;
1141
1142 // Reply author, link, and timestamp
1143 if ( ! empty( $settings['show_date'] ) && ! empty( $author_link ) ) :
1144
1145 // translators: 1: reply author, 2: reply link, 3: reply timestamp
1146 printf( esc_html_x( '%1$s on %2$s %3$s', 'widgets', 'bbpress' ), $author_link, $reply_link, $show_date );
1147
1148 // Reply link and timestamp
1149 elseif ( ! empty( $settings['show_date'] ) ) :
1150 echo $reply_link . ' ' . $show_date;
1151
1152 // Reply author and title
1153 elseif ( ! empty( $author_link ) ) :
1154
1155 // translators: 1: reply author, 2: reply link
1156 printf( esc_html_x( '%1$s on %2$s', 'widgets', 'bbpress' ), $author_link, $reply_link );
1157
1158 // Only the reply title
1159 else :
1160 echo $reply_link;
1161 endif;
1162
1163 ?>
1164
1165 </li>
1166
1167 <?php endwhile; ?>
1168
1169 </ul>
1170
1171 <?php echo $args['after_widget'];
1172
1173 // Reset the $post global
1174 wp_reset_postdata();
1175
1176 // Output the current buffer
1177 echo ob_get_clean();
1178 }
1179
1180 /**
1181 * Update the reply widget options
1182 *
1183 * @since 2.0.0 bbPress (r2653)
1184 *
1185 * @param array $new_instance The new instance options
1186 * @param array $old_instance The old instance options
1187 */
1188 public function update( $new_instance = array(), $old_instance = array() ) {
1189 $instance = $old_instance;
1190 $instance['title'] = strip_tags( $new_instance['title'] );
1191 $instance['max_shown'] = (int) $new_instance['max_shown'];
1192
1193 // Date
1194 $instance['show_date'] = isset( $new_instance['show_date'] )
1195 ? (bool) $new_instance['show_date']
1196 : false;
1197
1198 // Author
1199 $instance['show_user'] = isset( $new_instance['show_user'] )
1200 ? (bool) $new_instance['show_user']
1201 : false;
1202
1203 return $instance;
1204 }
1205
1206 /**
1207 * Output the reply widget options form
1208 *
1209 * @since 2.0.0 bbPress (r2653)
1210 *
1211 * @param $instance Instance
1212 */
1213 public function form( $instance = array() ) {
1214
1215 // Get widget settings
1216 $settings = $this->parse_settings( $instance ); ?>
1217
1218 <p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php esc_html_e( 'Title:', 'bbpress' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $settings['title'] ); ?>" /></label></p>
1219 <p><label for="<?php echo $this->get_field_id( 'max_shown' ); ?>"><?php esc_html_e( 'Maximum replies to show:', 'bbpress' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'max_shown' ); ?>" name="<?php echo $this->get_field_name( 'max_shown' ); ?>" type="text" value="<?php echo esc_attr( $settings['max_shown'] ); ?>" /></label></p>
1220 <p><label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php esc_html_e( 'Show post date:', 'bbpress' ); ?> <input type="checkbox" id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" <?php checked( true, $settings['show_date'] ); ?> value="1" /></label></p>
1221 <p><label for="<?php echo $this->get_field_id( 'show_user' ); ?>"><?php esc_html_e( 'Show reply author:', 'bbpress' ); ?> <input type="checkbox" id="<?php echo $this->get_field_id( 'show_user' ); ?>" name="<?php echo $this->get_field_name( 'show_user' ); ?>" <?php checked( true, $settings['show_user'] ); ?> value="1" /></label></p>
1222
1223 <?php
1224 }
1225
1226 /**
1227 * Merge the widget settings into defaults array.
1228 *
1229 * @since 2.3.0 bbPress (r4802)
1230 *
1231 * @param $instance Instance
1232 */
1233 public function parse_settings( $instance = array() ) {
1234 return bbp_parse_args( $instance, array(
1235 'title' => esc_html__( 'Recent Replies', 'bbpress' ),
1236 'max_shown' => 5,
1237 'show_date' => false,
1238 'show_user' => false
1239 ), 'replies_widget_settings' );
1240 }
1241 }
1242