PluginProbe
bbPress / 2.6.6
bbPress v2.6.6
trunk 2.0 2.0-beta-1 2.0-beta-2b 2.0-beta-3 2.0-beta-3b 2.0-rc-2 2.0-rc-3 2.0-rc-4 2.0-rc-5 2.0.1 2.0.2 2.0.3 2.1 2.1-beta-1 2.1-rc1 2.1-rc2 2.1-rc3 2.1-rc4 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.2.2 All 71 releases
bbpress / includes / common / widgets.php

widgets.php in bbPress 2.6.6, at includes/common/widgets.php

1,242 lines 36.5 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__( '(bbPress) 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