PluginProbe
Forumax – AI Powered Advanced Community Forum Plugin / 2.4.4
Forumax – AI Powered Advanced Community Forum Plugin v2.4.4
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 / lib / bbpress / includes / common / shortcodes.php

shortcodes.php in Forumax – AI Powered Advanced Community Forum Plugin 2.4.4, at lib/bbpress/includes/common/shortcodes.php

859 lines 21.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * bbPress Shortcodes
5 *
6 * @package bbPress
7 * @subpackage Shortcodes
8 */
9
10 // Exit if accessed directly
11 defined( 'ABSPATH' ) || exit;
12
13 if ( ! class_exists( 'BBP_Shortcodes' ) ) :
14 /**
15 * bbPress Shortcode Class
16 *
17 * @since 2.0.0 bbPress (r3031)
18 */
19 class BBP_Shortcodes {
20
21 /** Vars ******************************************************************/
22
23 /**
24 * @var array Shortcode => function
25 */
26 public $codes = array();
27
28 /** Functions *************************************************************/
29
30 /**
31 * Add the register_shortcodes action to bbp_init
32 *
33 * @since 2.0.0 bbPress (r3031)
34 *
35 */
36 public function __construct() {
37 $this->setup_globals();
38 $this->add_shortcodes();
39 }
40
41 /**
42 * Shortcode globals
43 *
44 * @since 2.0.0 bbPress (r3143)
45 *
46 * @access private
47 */
48 private function setup_globals() {
49
50 // Setup the shortcodes
51 $this->codes = apply_filters( 'bbp_shortcodes', array(
52
53 /** Forums ********************************************************/
54
55 'bbp-forum-index' => array( $this, 'display_forum_index' ), // Forum Index
56 'bbp-forum-form' => array( $this, 'display_forum_form' ), // Topic form
57 'bbp-single-forum' => array( $this, 'display_forum' ), // Specific forum - pass an 'id' attribute
58
59 /** Topics ********************************************************/
60
61 'bbp-topic-index' => array( $this, 'display_topic_index' ), // Topic index
62 'bbp-topic-form' => array( $this, 'display_topic_form' ), // Topic form
63 'bbp-single-topic' => array( $this, 'display_topic' ), // Specific topic - pass an 'id' attribute
64
65 /** Topic Tags ****************************************************/
66
67 'bbp-topic-tags' => array( $this, 'display_topic_tags' ), // All topic tags in a cloud
68 'bbp-single-tag' => array( $this, 'display_topics_of_tag' ), // Topics of Tag
69
70 /** Replies *******************************************************/
71
72 'bbp-reply-form' => array( $this, 'display_reply_form' ), // Reply form
73 'bbp-single-reply' => array( $this, 'display_reply' ), // Specific reply - pass an 'id' attribute
74
75 /** Views *********************************************************/
76
77 'bbp-single-view' => array( $this, 'display_view' ), // Single view
78
79 /** Search ********************************************************/
80
81 'bbp-search-form' => array( $this, 'display_search_form' ), // Search form
82 'bbp-search' => array( $this, 'display_search' ), // Search
83
84 /** Account *******************************************************/
85
86 'bbp-login' => array( $this, 'display_login' ), // Login
87 'bbp-register' => array( $this, 'display_register' ), // Register
88 'bbp-lost-pass' => array( $this, 'display_lost_pass' ), // Lost Password
89
90 /** Others *******************************************************/
91
92 'bbp-stats' => array( $this, 'display_stats' ), // Stats
93 ) );
94 }
95
96 /**
97 * Register the bbPress shortcodes
98 *
99 * @since 2.0.0 bbPress (r3031)
100 */
101 private function add_shortcodes() {
102 foreach ( (array) $this->codes as $code => $function ) {
103 add_shortcode( $code, $function );
104 }
105 }
106
107 /**
108 * Unset some globals in the $bbp object that hold query related info
109 *
110 * @since 2.0.0 bbPress (r3034)
111 */
112 private function unset_globals() {
113 $bbp = bbpress();
114
115 // Unset global queries
116 $bbp->forum_query = new WP_Query();
117 $bbp->topic_query = new WP_Query();
118 $bbp->reply_query = new WP_Query();
119 $bbp->search_query = new WP_Query();
120
121 // Unset global ID's
122 $bbp->current_view_id = 0;
123 $bbp->current_forum_id = 0;
124 $bbp->current_topic_id = 0;
125 $bbp->current_reply_id = 0;
126 $bbp->current_topic_tag_id = 0;
127
128 // Reset the post data
129 wp_reset_postdata();
130 }
131
132 /** Output Buffers ********************************************************/
133
134 /**
135 * Start an output buffer.
136 *
137 * This is used to put the contents of the shortcode into a variable rather
138 * than outputting the HTML at run-time. This allows shortcodes to appear
139 * in the correct location in the_content() instead of when it's created.
140 *
141 * @since 2.0.0 bbPress (r3079)
142 *
143 * @param string $query_name
144 */
145 private function start( $query_name = '' ) {
146
147 // Set query name
148 bbp_set_query_name( $query_name );
149
150 // Start output buffer
151 ob_start();
152 }
153
154 /**
155 * Return the contents of the output buffer and flush its contents.
156 *
157 * @since 2.0.0 bbPress (r3079)
158 *
159 * @return string Contents of output buffer.
160 */
161 private function end() {
162
163 // Unset globals
164 $this->unset_globals();
165
166 // Get the query name, for filter
167 $query_name = bbp_get_query_name();
168
169 // Reset the query name
170 bbp_reset_query_name();
171
172 // Return and flush the output buffer
173 $output = ob_get_clean();
174
175 // Filter & return
176 return apply_filters( 'bbp_display_shortcode', $output, $query_name );
177 }
178
179 /** Forum shortcodes ******************************************************/
180
181 /**
182 * Display an index of all visible root level forums in an output buffer
183 * and return to ensure that post/page contents are displayed first.
184 *
185 * @since 2.0.0 bbPress (r3031)
186 *
187 * @return string
188 */
189 public function display_forum_index() {
190
191 // Unset globals
192 $this->unset_globals();
193
194 // Start output buffer
195 $this->start( 'bbp_forum_archive' );
196
197 bbp_get_template_part( 'content', 'archive-forum' );
198
199 // Return contents of output buffer
200 return $this->end();
201 }
202
203 /**
204 * Display the contents of a specific forum ID in an output buffer
205 * and return to ensure that post/page contents are displayed first.
206 *
207 * @since 2.0.0 bbPress (r3031)
208 *
209 * @param array $attr
210 * @param string $content
211 * @return string
212 */
213 public function display_forum( $attr, $content = '' ) {
214
215 // Sanity check required info
216 if ( ! empty( $content ) || ( empty( $attr['id'] ) || ! is_numeric( $attr['id'] ) ) ) {
217 return $content;
218 }
219
220 // Set passed attribute to $forum_id for clarity
221 $forum_id = bbpress()->current_forum_id = $attr['id'];
222
223 // Bail if ID passed is not a forum
224 if ( ! bbp_is_forum( $forum_id ) ) {
225 return $content;
226 }
227
228 // Start output buffer
229 $this->start( 'bbp_single_forum' );
230
231 // Check forum caps
232 if ( bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) {
233 bbp_get_template_part( 'content', 'single-forum' );
234
235 // Forum is private and user does not have caps
236 } elseif ( bbp_is_forum_private( $forum_id, false ) ) {
237 bbp_get_template_part( 'feedback', 'no-access' );
238 }
239
240 // Return contents of output buffer
241 return $this->end();
242 }
243
244 /**
245 * Display the forum form in an output buffer and return to ensure
246 * post/page contents are displayed first.
247 *
248 * @since 2.1.0 bbPress (r3566)
249 */
250 public function display_forum_form() {
251
252 // Start output buffer
253 $this->start( 'bbp_forum_form' );
254
255 // Output templates
256 bbp_get_template_part( 'form', 'forum' );
257
258 // Return contents of output buffer
259 return $this->end();
260 }
261
262 /** Topic shortcodes ******************************************************/
263
264 /**
265 * Display an index of all visible root level topics in an output buffer
266 * and return to ensure that post/page contents are displayed first.
267 *
268 * @since 2.0.0 bbPress (r3031)
269 *
270 * @return string
271 */
272 public function display_topic_index() {
273
274 // Unset globals
275 $this->unset_globals();
276
277 // Filter the query
278 if ( ! bbp_is_topic_archive() ) {
279 add_filter( 'bbp_before_has_topics_parse_args', array( $this, 'display_topic_index_query' ) );
280 }
281
282 // Start output buffer
283 $this->start( 'bbp_topic_archive' );
284
285 // Output template
286 bbp_get_template_part( 'content', 'archive-topic' );
287
288 // Return contents of output buffer
289 return $this->end();
290 }
291
292 /**
293 * Display the contents of a specific topic ID in an output buffer
294 * and return to ensure that post/page contents are displayed first.
295 *
296 * @since 2.0.0 bbPress (r3031)
297 *
298 * @param array $attr
299 * @param string $content
300 * @return string
301 */
302 public function display_topic( $attr, $content = '' ) {
303
304 // Sanity check required info
305 if ( ! empty( $content ) || ( empty( $attr['id'] ) || ! is_numeric( $attr['id'] ) ) ) {
306 return $content;
307 }
308
309 // Unset globals
310 $this->unset_globals();
311
312 // Set passed attribute to $forum_id for clarity
313 $topic_id = bbpress()->current_topic_id = $attr['id'];
314 $forum_id = bbp_get_topic_forum_id( $topic_id );
315
316 // Bail if ID passed is not a topic
317 if ( ! bbp_is_topic( $topic_id ) ) {
318 return $content;
319 }
320
321 // Reset the queries if not in theme compat
322 if ( ! bbp_is_theme_compat_active() ) {
323
324 $bbp = bbpress();
325
326 // Reset necessary forum_query attributes for topics loop to function
327 $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
328 $bbp->forum_query->in_the_loop = true;
329 $bbp->forum_query->post = get_post( $forum_id );
330
331 // Reset necessary topic_query attributes for topics loop to function
332 $bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
333 $bbp->topic_query->in_the_loop = true;
334 $bbp->topic_query->post = get_post( $topic_id );
335 }
336
337 // Start output buffer
338 $this->start( 'bbp_single_topic' );
339
340 // Check forum caps
341 if ( bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) {
342 bbp_get_template_part( 'content', 'single-topic' );
343
344 // Forum is private and user does not have caps
345 } elseif ( bbp_is_forum_private( $forum_id, false ) ) {
346 bbp_get_template_part( 'feedback', 'no-access' );
347 }
348
349 // Return contents of output buffer
350 return $this->end();
351 }
352
353 /**
354 * Display the topic form in an output buffer and return to ensure
355 * post/page contents are displayed first.
356 *
357 * Supports 'forum_id' attribute to display the topic form for a particular
358 * forum. This currently has styling issues from not being wrapped in
359 * <div id="bbpress-forums" class="bbpress-wrapper"></div> which will need to be sorted out later.
360 *
361 * @since 2.0.0 bbPress (r3031)
362 *
363 * @param array $attr
364 * @param string $content
365 * @return string
366 */
367 public function display_topic_form( $attr = array(), $content = '' ) {
368
369 // Sanity check supplied info
370 if ( ! empty( $content ) || ( ! empty( $attr['forum_id'] ) && ( ! is_numeric( $attr['forum_id'] ) || ! bbp_is_forum( $attr['forum_id'] ) ) ) ) {
371 return $content;
372 }
373
374 // Unset globals
375 $this->unset_globals();
376
377 // If forum id is set, use the 'bbp_single_forum' query name
378 if ( ! empty( $attr['forum_id'] ) ) {
379
380 // Set the global current_forum_id for future requests
381 bbpress()->current_forum_id = $forum_id = bbp_get_forum_id( $attr['forum_id'] );
382
383 // Start output buffer
384 $this->start( 'bbp_single_forum' );
385
386 // No forum id was passed
387 } else {
388
389 // Set the $forum_id variable to satisfy checks below
390 $forum_id = 0;
391
392 // Start output buffer
393 $this->start( 'bbp_topic_form' );
394 }
395
396 // If the forum id is set, check forum caps else display normal topic form
397 if ( empty( $forum_id ) || bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) {
398 bbp_get_template_part( 'form', 'topic' );
399
400 // Forum is private and user does not have caps
401 } elseif ( bbp_is_forum_private( $forum_id, false ) ) {
402 bbp_get_template_part( 'feedback', 'no-access' );
403 }
404
405 // Return contents of output buffer
406 return $this->end();
407 }
408
409 /** Replies ***************************************************************/
410
411 /**
412 * Display the contents of a specific reply ID in an output buffer
413 * and return to ensure that post/page contents are displayed first.
414 *
415 * @since 2.0.0 bbPress (r3031)
416 *
417 * @param array $attr
418 * @param string $content
419 * @return string
420 */
421 public function display_reply( $attr, $content = '' ) {
422
423 // Sanity check required info
424 if ( ! empty( $content ) || ( empty( $attr['id'] ) || ! is_numeric( $attr['id'] ) ) ) {
425 return $content;
426 }
427
428 // Unset globals
429 $this->unset_globals();
430
431 // Set passed attribute to $reply_id for clarity
432 $reply_id = bbpress()->current_reply_id = $attr['id'];
433 $forum_id = bbp_get_reply_forum_id( $reply_id );
434
435 // Bail if ID passed is not a reply
436 if ( ! bbp_is_reply( $reply_id ) ) {
437 return $content;
438 }
439
440 // Reset the queries if not in theme compat
441 if ( ! bbp_is_theme_compat_active() ) {
442
443 $bbp = bbpress();
444
445 // Reset necessary forum_query attributes for reply loop to function
446 $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
447 $bbp->forum_query->in_the_loop = true;
448 $bbp->forum_query->post = get_post( $forum_id );
449
450 // Reset necessary reply_query attributes for reply loop to function
451 $bbp->reply_query->query_vars['post_type'] = bbp_get_reply_post_type();
452 $bbp->reply_query->in_the_loop = true;
453 $bbp->reply_query->post = get_post( $reply_id );
454 }
455
456 // Start output buffer
457 $this->start( 'bbp_single_reply' );
458
459 // Check forum caps
460 if ( bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) {
461 bbp_get_template_part( 'content', 'single-reply' );
462
463 // Forum is private and user does not have caps
464 } elseif ( bbp_is_forum_private( $forum_id, false ) ) {
465 bbp_get_template_part( 'feedback', 'no-access' );
466 }
467
468 // Return contents of output buffer
469 return $this->end();
470 }
471
472 /**
473 * Display the reply form in an output buffer and return to ensure
474 * post/page contents are displayed first.
475 *
476 * @since 2.0.0 bbPress (r3031)
477 */
478 public function display_reply_form() {
479
480 // Start output buffer
481 $this->start( 'bbp_reply_form' );
482
483 // Output templates
484 bbp_get_template_part( 'form', 'reply' );
485
486 // Return contents of output buffer
487 return $this->end();
488 }
489
490 /** Topic Tags ************************************************************/
491
492 /**
493 * Display a tag cloud of all topic tags in an output buffer and return to
494 * ensure that post/page contents are displayed first.
495 *
496 * @since 2.0.0 bbPress (r3110)
497 *
498 * @return string
499 */
500 public function display_topic_tags() {
501
502 // Unset globals
503 $this->unset_globals();
504
505 // Start output buffer
506 $this->start( 'bbp_topic_tags' );
507
508 // Output the topic tags
509 wp_tag_cloud( array(
510 'smallest' => 9,
511 'largest' => 38,
512 'number' => 80,
513 'taxonomy' => bbp_get_topic_tag_tax_id()
514 ) );
515
516 // Return contents of output buffer
517 return $this->end();
518 }
519
520 /**
521 * Display the contents of a specific topic tag in an output buffer
522 * and return to ensure that post/page contents are displayed first.
523 *
524 * @since 2.0.0 bbPress (r3110)
525 *
526 * @param array $attr
527 * @param string $content
528 * @return string
529 */
530 public function display_topics_of_tag( $attr, $content = '' ) {
531
532 // Sanity check required info
533 if ( ! empty( $content ) || ( empty( $attr['id'] ) || ! is_numeric( $attr['id'] ) ) ) {
534 return $content;
535 }
536
537 // Unset globals
538 $this->unset_globals();
539
540 // Filter the query
541 if ( ! bbp_is_topic_tag() ) {
542 add_filter( 'bbp_before_has_topics_parse_args', array( $this, 'display_topics_of_tag_query' ) );
543 }
544
545 // Start output buffer
546 $this->start( 'bbp_topic_tag' );
547
548 // Set passed attribute to $ag_id for clarity
549 bbpress()->current_topic_tag_id = $tag_id = $attr['id'];
550
551 // Output template
552 bbp_get_template_part( 'content', 'archive-topic' );
553
554 // Return contents of output buffer
555 return $this->end();
556 }
557
558 /**
559 * Display the contents of a specific topic tag in an output buffer
560 * and return to ensure that post/page contents are displayed first.
561 *
562 * @since 2.0.0 bbPress (r3346)
563 *
564 * @return string
565 */
566 public function display_topic_tag_form() {
567
568 // Unset globals
569 $this->unset_globals();
570
571 // Start output buffer
572 $this->start( 'bbp_topic_tag_edit' );
573
574 // Output template
575 bbp_get_template_part( 'content', 'topic-tag-edit' );
576
577 // Return contents of output buffer
578 return $this->end();
579 }
580
581 /** Views *****************************************************************/
582
583 /**
584 * Display the contents of a specific view in an output buffer and return to
585 * ensure that post/page contents are displayed first.
586 *
587 * @since 2.0.0 bbPress (r3031)
588 *
589 * @param array $attr
590 * @param string $content
591 * @return string
592 */
593 public function display_view( $attr, $content = '' ) {
594
595 // Sanity check required info
596 if ( empty( $attr['id'] ) ) {
597 return $content;
598 }
599
600 // Set passed attribute to $view_id for clarity
601 $view_id = $attr['id'];
602
603 // Start output buffer
604 $this->start( 'bbp_single_view' );
605
606 // Unset globals
607 $this->unset_globals();
608
609 // Set the current view ID
610 bbpress()->current_view_id = $view_id;
611
612 // Load the view
613 bbp_view_query( $view_id );
614
615 // Output template
616 bbp_get_template_part( 'content', 'single-view' );
617
618 // Return contents of output buffer
619 return $this->end();
620 }
621
622 /** Search ****************************************************************/
623
624 /**
625 * Display the search form in an output buffer and return to ensure
626 * post/page contents are displayed first.
627 *
628 * @since 2.3.0 bbPress (r4585)
629 */
630 public function display_search_form() {
631
632 // Bail if search is disabled
633 if ( ! bbp_allow_search() ) {
634 return;
635 }
636
637 // Start output buffer
638 $this->start( 'bbp_search_form' );
639
640 // Output templates
641 bbp_get_template_part( 'form', 'search' );
642
643 // Return contents of output buffer
644 return $this->end();
645 }
646
647 /**
648 * Display the contents of search results in an output buffer and return to
649 * ensure that post/page contents are displayed first.
650 *
651 * @since 2.3.0 bbPress (r4579)
652 *
653 * @param array $attr
654 * @param string $content
655 */
656 public function display_search( $attr, $content = '' ) {
657
658 // Sanity check required info
659 if ( ! empty( $content ) ) {
660 return $content;
661 }
662
663 // Bail if search is disabled
664 if ( ! bbp_allow_search() ) {
665 return;
666 }
667
668 // Trim search attribute if it's set
669 if ( isset( $attr['search'] ) ) {
670 $attr['search'] = trim( $attr['search'] );
671 }
672
673 // Set passed attribute to $search_terms for clarity
674 $search_terms = empty( $attr['search'] )
675 ? bbp_get_search_terms()
676 : $attr['search'];
677
678 // Get the rewrite ID (one time, to avoid repeated calls)
679 $rewrite_id = bbp_get_search_rewrite_id();
680
681 // Unset globals
682 $this->unset_globals();
683
684 // Set terms for query
685 set_query_var( $rewrite_id, $search_terms );
686
687 // Start output buffer
688 $this->start( $rewrite_id );
689
690 // Output template
691 bbp_get_template_part( 'content', 'search' );
692
693 // Return contents of output buffer
694 return $this->end();
695 }
696
697 /** Account ***************************************************************/
698
699 /**
700 * Display a login form
701 *
702 * @since 2.0.0 bbPress (r3302)
703 *
704 * @return string
705 */
706 public function display_login() {
707
708 // Unset globals
709 $this->unset_globals();
710
711 // Start output buffer
712 $this->start( 'bbp_login' );
713
714 // Output templates
715 if ( ! is_user_logged_in() ) {
716 bbp_get_template_part( 'form', 'user-login' );
717 } else {
718 bbp_get_template_part( 'feedback', 'logged-in' );
719 }
720
721 // Return contents of output buffer
722 return $this->end();
723 }
724
725 /**
726 * Display a register form
727 *
728 * @since 2.0.0 bbPress (r3302)
729 *
730 * @return string
731 */
732 public function display_register() {
733
734 // Unset globals
735 $this->unset_globals();
736
737 // Start output buffer
738 $this->start( 'bbp_register' );
739
740 // Output templates
741 if ( ! is_user_logged_in() ) {
742 bbp_get_template_part( 'form', 'user-register' );
743 } else {
744 bbp_get_template_part( 'feedback', 'logged-in' );
745 }
746
747 // Return contents of output buffer
748 return $this->end();
749 }
750
751 /**
752 * Display a lost password form
753 *
754 * @since 2.0.0 bbPress (r3302)
755 *
756 * @return string
757 */
758 public function display_lost_pass() {
759
760 // Unset globals
761 $this->unset_globals();
762
763 // Start output buffer
764 $this->start( 'bbp_lost_pass' );
765
766 // Output templates
767 if ( ! is_user_logged_in() ) {
768 bbp_get_template_part( 'form', 'user-lost-pass' );
769 } else {
770 bbp_get_template_part( 'feedback', 'logged-in' );
771 }
772
773 // Return contents of output buffer
774 return $this->end();
775 }
776
777 /** Other *****************************************************************/
778
779 /**
780 * Display forum statistics
781 *
782 * @since 2.3.0 bbPress (r4509)
783 *
784 * @return string
785 */
786 public function display_stats() {
787
788 // Unset globals
789 $this->unset_globals();
790
791 // Start output buffer
792 $this->start();
793
794 // Output statistics
795 bbp_get_template_part( 'content', 'statistics' );
796
797 // Return contents of output buffer
798 return $this->end();
799 }
800
801 /**
802 * Display a breadcrumb
803 *
804 * @since 2.0.0 bbPress (r3302)
805 *
806 * @return string
807 */
808 public function display_breadcrumb() {
809
810 // Unset globals
811 $this->unset_globals();
812
813 // Start output buffer
814 $this->start();
815
816 // Output breadcrumb
817 bbp_breadcrumb();
818
819 // Return contents of output buffer
820 return $this->end();
821 }
822
823 /** Query Filters *********************************************************/
824
825 /**
826 * Filter the query for the topic index
827 *
828 * @since 2.1.0 bbPress (r3637)
829 *
830 * @param array $args
831 * @return array
832 */
833 public function display_topic_index_query( $args = array() ) {
834 $args['author'] = 0;
835 $args['show_stickies'] = true;
836 $args['order'] = 'DESC';
837 return $args;
838 }
839
840 /**
841 * Filter the query for topic tags
842 *
843 * @since 2.1.0 bbPress (r3637)
844 *
845 * @param array $args
846 * @return array
847 */
848 public function display_topics_of_tag_query( $args = array() ) {
849 $args['tax_query'] = array( array(
850 'taxonomy' => bbp_get_topic_tag_tax_id(),
851 'field' => 'id',
852 'terms' => bbpress()->current_topic_tag_id
853 ) );
854
855 return $args;
856 }
857 }
858 endif;
859