PluginProbe
Forumax – AI Powered Advanced Community Forum Plugin / trunk
Forumax – AI Powered Advanced Community Forum Plugin vtrunk
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 / core / template-functions.php

template-functions.php in Forumax – AI Powered Advanced Community Forum Plugin trunk, at lib/bbpress/includes/core/template-functions.php

739 lines 22.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 Template Functions
5 *
6 * This file contains functions necessary to mirror the WordPress core template
7 * loading process. Many of those functions are not filterable, and even then
8 * would not be robust enough to predict where bbPress templates might exist.
9 *
10 * @package bbPress
11 * @subpackage TemplateFunctions
12 */
13
14 // Exit if accessed directly
15 defined( 'ABSPATH' ) || exit;
16
17 /**
18 * Adds bbPress theme support to any active WordPress theme
19 *
20 * @since 2.0.0 bbPress (r3032)
21 *
22 * @param string $slug
23 * @param string $name Optional. Default null
24 */
25 function bbp_get_template_part( $slug, $name = null ) {
26
27 // Execute code for this part
28 do_action( 'get_template_part_' . $slug, $slug, $name );
29
30 // Setup possible parts
31 $templates = array();
32 if ( isset( $name ) ) {
33 $templates[] = $slug . '-' . $name . '.php';
34 }
35 $templates[] = $slug . '.php';
36
37 // Allow template parst to be filtered
38 $templates = apply_filters( 'bbp_get_template_part', $templates, $slug, $name );
39
40 // Return the part that is found
41 return bbp_locate_template( $templates, true, false );
42 }
43
44 /**
45 * Retrieve the name of the highest priority template file that exists.
46 *
47 * Searches in the child theme before parent theme so that themes which
48 * inherit from a parent theme can just overload one file. If the template is
49 * not found in either of those, it looks in the theme-compat folder last.
50 *
51 * @since 2.1.0 bbPress (r3618)
52 *
53 * @param string|array $template_names Template file(s) to search for, in order.
54 * @param bool $load If true the template file will be loaded if it is found.
55 * @param bool $require_once Whether to require_once or require. Default true.
56 * Has no effect if $load is false.
57 * @return string The template filename if one is located.
58 */
59 function bbp_locate_template( $template_names, $load = false, $require_once = true ) {
60
61 // No file found yet
62 $located = false;
63 $template_locations = bbp_get_template_stack();
64
65 // Try to find a template file
66 foreach ( (array) $template_names as $template_name ) {
67
68 // Continue if template is empty
69 if ( empty( $template_name ) ) {
70 continue;
71 }
72
73 // Trim off any slashes from the template name
74 $template_name = ltrim( $template_name, '/' );
75
76 // Loop through template stack
77 foreach ( (array) $template_locations as $template_location ) {
78
79 // Continue if $template_location is empty
80 if ( empty( $template_location ) ) {
81 continue;
82 }
83
84 // Check child theme first
85 if ( file_exists( trailingslashit( $template_location ) . $template_name ) ) {
86 $located = trailingslashit( $template_location ) . $template_name;
87 break 2;
88 }
89 }
90 }
91
92 /**
93 * This action exists only to follow the standard bbPress coding convention,
94 * and should not be used to short-circuit any part of the template locator.
95 *
96 * If you want to override a specific template part, please either filter
97 * 'bbp_get_template_part' or add a new location to the template stack.
98 */
99 do_action( 'bbp_locate_template', $located, $template_name, $template_names, $template_locations, $load, $require_once );
100
101 // Maybe load the template if one was located
102 if ( ( defined( 'WP_USE_THEMES' ) && WP_USE_THEMES ) && ( true === $load ) && ! empty( $located ) ) {
103 load_template( $located, $require_once );
104 }
105
106 return $located;
107 }
108
109 /**
110 * Locate an enqueueable file on the server. Used before being enqueued.
111 *
112 * If SCRIPT_DEBUG is set and the file includes a .min suffix, this function
113 * will automatically attempt to locate a non-minified version of that file.
114 *
115 * If SCRIPT_DEBUG is not set and the file exclude a .min suffix, this function
116 * will automatically attempt to locate a minified version of that file.
117 *
118 * See: https://bbpress.trac.wordpress.org/ticket/3218
119 *
120 * @since 2.6.0
121 *
122 * @param string $file
123 *
124 * @return boolean
125 */
126 function bbp_locate_enqueueable( $file = '' ) {
127
128 // Bail if no file to locate
129 if ( empty( $file ) ) {
130 return false;
131 }
132
133 // Add file to files array
134 $files = array( $file );
135
136 // Get the file variant (minified or not, but opposite of $file)
137 $file_is_min = ( false !== strpos( $file, '.min' ) );
138 $file_variant = ( false === $file_is_min )
139 ? str_replace( array( '.css', '.js' ), array( '.min.css', '.min.js' ), $file )
140 : str_replace( '.min', '', $file );
141
142 // Are we debugging?
143 $script_debug = bbp_doing_script_debug();
144
145 // Debugging, so prefer unminified files
146 if ( true === $script_debug ) {
147 if ( true === $file_is_min ) {
148 array_unshift( $files, $file_variant );
149 } else {
150 array_push( $files, $file_variant );
151 }
152
153 // Not debugging, so prefer minified files
154 } elseif ( false === $script_debug ) {
155 if ( true === $file_is_min ) {
156 array_push( $files, $file_variant );
157 } else {
158 array_unshift( $files, $file_variant );
159 }
160 }
161
162 // Return first found file location in the stack
163 return bbp_locate_template( $files, false, false );
164 }
165
166 /**
167 * Convert an enqueueable file path to a URL
168 *
169 * @since 2.6.0
170 * @param string $file
171 *
172 * @return string
173 */
174 function bbp_urlize_enqueueable( $file = '' ) {
175
176 // Get DIR and URL
177 $content_dir = constant( 'WP_CONTENT_DIR' );
178 $content_url = content_url();
179
180 // IIS (Windows) here
181 // Replace back slashes with forward slash
182 if ( false !== strpos( $file, '\\' ) ) {
183 $file = str_replace( '\\', '/', $file );
184 $content_dir = str_replace( '\\', '/', $content_dir );
185 }
186
187 // Return path to file relative to site URL
188 return str_replace( $content_dir, $content_url, $file );
189 }
190
191 /**
192 * Enqueue a script from the highest priority location in the template stack.
193 *
194 * Registers the style if file provided (does NOT overwrite) and enqueues.
195 *
196 * @since 2.5.0 bbPress (r5180)
197 *
198 * @param string $handle Name of the stylesheet.
199 * @param string|bool $file Relative path to stylesheet. Example: '/css/mystyle.css'.
200 * @param array $deps An array of registered style handles this stylesheet depends on. Default empty array.
201 * @param string|bool $ver String specifying the stylesheet version number, if it has one. This parameter is used
202 * to ensure that the correct version is sent to the client regardless of caching, and so
203 * should be included if a version number is available and makes sense for the stylesheet.
204 * @param string $media Optional. The media for which this stylesheet has been defined.
205 * Default 'all'. Accepts 'all', 'aural', 'braille', 'handheld', 'projection', 'print',
206 * 'screen', 'tty', or 'tv'.
207 *
208 * @return mixed The style filename if one is located. False if not.
209 */
210 function bbp_enqueue_style( $handle = '', $file = '', $deps = array(), $ver = false, $media = 'all' ) {
211
212 // Attempt to locate an enqueueable
213 $located = bbp_locate_enqueueable( $file );
214
215 // Enqueue if located
216 if ( ! empty( $located ) ) {
217
218 // Make sure there is always a version
219 if ( empty( $ver ) ) {
220 $ver = bbp_get_asset_version();
221 }
222
223 // Make path to file relative to site URL
224 $located = bbp_urlize_enqueueable( $located );
225
226 // Register the style
227 wp_register_style( $handle, $located, $deps, $ver, $media );
228
229 // Enqueue the style
230 wp_enqueue_style( $handle );
231 }
232
233 return $located;
234 }
235
236 /**
237 * Enqueue a script from the highest priority location in the template stack.
238 *
239 * Registers the style if file provided (does NOT overwrite) and enqueues.
240 *
241 * @since 2.5.0 bbPress (r5180)
242 *
243 * @param string $handle Name of the script.
244 * @param string|bool $file Relative path to the script. Example: '/js/myscript.js'.
245 * @param array $deps An array of registered handles this script depends on. Default empty array.
246 * @param string|bool $ver Optional. String specifying the script version number, if it has one. This parameter
247 * is used to ensure that the correct version is sent to the client regardless of caching,
248 * and so should be included if a version number is available and makes sense for the script.
249 * @param bool $in_footer Optional. Whether to enqueue the script before </head> or before </body>.
250 * Default 'false'. Accepts 'false' or 'true'.
251 *
252 * @return mixed The script filename if one is located. False if not.
253 */
254 function bbp_enqueue_script( $handle = '', $file = '', $deps = array(), $ver = false, $in_footer = false ) {
255
256 // Attempt to locate an enqueueable
257 $located = bbp_locate_enqueueable( $file );
258
259 // Enqueue if located
260 if ( ! empty( $located ) ) {
261
262 // Make sure there is always a version
263 if ( empty( $ver ) ) {
264 $ver = bbp_get_asset_version();
265 }
266
267 // Make path to file relative to site URL
268 $located = bbp_urlize_enqueueable( $located );
269
270 // Register the style
271 wp_register_script( $handle, $located, $deps, $ver, $in_footer );
272
273 // Enqueue the style
274 wp_enqueue_script( $handle );
275 }
276
277 return $located;
278 }
279
280 /**
281 * This is really cool. This function registers a new template stack location,
282 * using WordPress's built in filters API.
283 *
284 * This allows for templates to live in places beyond just the parent/child
285 * relationship, to allow for custom template locations. Used in conjunction
286 * with bbp_locate_template(), this allows for easy template overrides.
287 *
288 * @since 2.2.0 bbPress (r4323)
289 *
290 * @param string $location_callback Callback function that returns the
291 * @param int $priority
292 */
293 function bbp_register_template_stack( $location_callback = '', $priority = 10 ) {
294
295 // Bail if no location, or function/method is not callable
296 if ( empty( $location_callback ) || ! is_callable( $location_callback ) ) {
297 return false;
298 }
299
300 // Add location callback to template stack
301 return add_filter( 'bbp_template_stack', $location_callback, (int) $priority );
302 }
303
304 /**
305 * Deregisters a previously registered template stack location.
306 *
307 * @since 2.3.0 bbPress (r4652)
308 *
309 * @param string $location_callback Callback function that returns the
310 * @param int $priority
311 * @return bool Whether stack was removed
312 */
313 function bbp_deregister_template_stack( $location_callback = '', $priority = 10 ) {
314
315 // Bail if no location, or function/method is not callable
316 if ( empty( $location_callback ) || ! is_callable( $location_callback ) ) {
317 return false;
318 }
319
320 // Remove location callback to template stack
321 return remove_filter( 'bbp_template_stack', $location_callback, (int) $priority );
322 }
323
324 /**
325 * Call the functions added to the 'bbp_template_stack' filter hook, and return
326 * an array of the template locations.
327 *
328 * @since 2.2.0 bbPress (r4323)
329 * @since 2.6.0 bbPress (r5944) Added support for `WP_Hook`
330 *
331 * @global array $wp_filter Stores all of the filters
332 * @global array $merged_filters Merges the filter hooks using this function.
333 * @global array $wp_current_filter stores the list of current filters with the current one last
334 *
335 * @return array The filtered value after all hooked functions are applied to it.
336 */
337 function bbp_get_template_stack() {
338 global $wp_filter, $merged_filters, $wp_current_filter;
339
340 // Setup some default variables
341 $tag = 'bbp_template_stack';
342 $args = $stack = array();
343
344 // Add 'bbp_template_stack' to the current filter array
345 $wp_current_filter[] = $tag;
346
347 // Bail if no stack setup
348 if ( empty( $wp_filter[ $tag ] ) ) {
349 return array();
350 }
351
352 // Check if WP_Hook class exists, see #WP17817
353 if ( class_exists( 'WP_Hook' ) ) {
354 $filter = $wp_filter[ $tag ]->callbacks;
355 } else {
356 $filter = &$wp_filter[ $tag ];
357
358 // Sort
359 if ( ! isset( $merged_filters[ $tag ] ) ) {
360 ksort( $filter );
361 $merged_filters[ $tag ] = true;
362 }
363 }
364
365 // Ensure we're always at the beginning of the filter array
366 reset( $filter );
367
368 // Loop through 'bbp_template_stack' filters, and call callback functions
369 do {
370 foreach ( (array) current( $filter ) as $the_ ) {
371 if ( ! is_null( $the_['function'] ) ) {
372 $args[1] = $stack;
373 $stack[] = call_user_func_array( $the_['function'], array_slice( $args, 1, (int) $the_['accepted_args'] ) );
374 }
375 }
376 } while ( next( $filter ) !== false );
377
378 // Remove 'bbp_template_stack' from the current filter array
379 array_pop( $wp_current_filter );
380
381 // Remove empties and duplicates
382 $stack = array_unique( array_filter( $stack ) );
383
384 // Filter & return
385 return (array) apply_filters( 'bbp_get_template_stack', $stack ) ;
386 }
387
388 /**
389 * Get a template part in an output buffer, and return it
390 *
391 * @since 2.4.0 bbPress (r5043)
392 *
393 * @param string $slug
394 * @param string $name
395 * @return string
396 */
397 function bbp_buffer_template_part( $slug, $name = null, $echo = true ) {
398 ob_start();
399
400 bbp_get_template_part( $slug, $name );
401
402 // Get the output buffer contents
403 $output = ob_get_clean();
404
405 // Echo or return the output buffer contents
406 if ( true === $echo ) {
407 echo $output;
408 } else {
409 return $output;
410 }
411 }
412
413 /**
414 * Retrieve path to a template
415 *
416 * Used to quickly retrieve the path of a template without including the file
417 * extension. It will also check the parent theme and theme-compat theme with
418 * the use of {@link bbp_locate_template()}. Allows for more generic template
419 * locations without the use of the other get_*_template() functions.
420 *
421 * @since 2.1.0 bbPress (r3629)
422 *
423 * @param string $type Filename without extension.
424 * @param array $templates An optional list of template candidates
425 * @return string Full path to file.
426 */
427 function bbp_get_query_template( $type, $templates = array() ) {
428 $type = preg_replace( '|[^a-z0-9-]+|', '', $type );
429
430 // Fallback template
431 if ( empty( $templates ) ) {
432 $templates = array( "{$type}.php" );
433 }
434
435 // Filter possible templates
436 $templates = apply_filters( "bbp_get_{$type}_template", $templates );
437
438 // Stash the possible templates for this query, for later use
439 bbp_set_theme_compat_templates( $templates );
440
441 // Try to locate a template in the stack
442 $template = bbp_locate_template( $templates );
443
444 // Stash the located template for this query, for later use
445 bbp_set_theme_compat_template( $template );
446
447 // Filter & return
448 return apply_filters( "bbp_{$type}_template", $template, $templates );
449 }
450
451 /**
452 * Get the possible subdirectories to check for templates in
453 *
454 * @since 2.1.0 bbPress (r3738)
455 *
456 * @param array $templates Templates we are looking for
457 * @return array Possible subdirectories to look in
458 */
459 function bbp_get_template_locations( $templates = array() ) {
460 $locations = array(
461 'bbpress',
462 'forums',
463 ''
464 );
465
466 // Filter & return
467 return apply_filters( 'bbp_get_template_locations', $locations, $templates );
468 }
469
470 /**
471 * Add template locations to template files being searched for
472 *
473 * @since 2.1.0 bbPress (r3738)
474 *
475 * @param array $stacks
476 * @return array()
477 */
478 function bbp_add_template_stack_locations( $stacks = array() ) {
479 $retval = array();
480
481 // Get alternate locations
482 $locations = bbp_get_template_locations();
483
484 // Loop through locations and stacks and combine
485 foreach ( (array) $stacks as $stack ) {
486 foreach ( (array) $locations as $custom_location ) {
487 $retval[] = untrailingslashit( trailingslashit( $stack ) . $custom_location );
488 }
489 }
490
491 // Filter & return
492 return (array) apply_filters( 'bbp_add_template_stack_locations', array_unique( $retval ), $stacks );
493 }
494
495 /**
496 * Add checks for bbPress conditions to parse_query action
497 *
498 * If it's a user page, WP_Query::bbp_is_single_user is set to true.
499 *
500 * If it's a user edit page, WP_Query::bbp_is_single_user_edit is set to true
501 * and the the 'wp-admin/includes/user.php' file is included.
502 *
503 * In addition, on user/user edit pages, WP_Query::home is set to false & query
504 * vars 'bbp_user_id' with the displayed user id is added.
505 *
506 * In 2.6.0, the 'author_name' variable is no longer set when viewing a single
507 * user, because of is_author() weirdness. If this removal causes problems, it
508 * may come back in a future release.
509 *
510 * If it's a forum edit, WP_Query::bbp_is_forum_edit is set to true
511 * If it's a topic edit, WP_Query::bbp_is_topic_edit is set to true
512 * If it's a reply edit, WP_Query::bbp_is_reply_edit is set to true.
513 *
514 * If it's a view page, WP_Query::bbp_is_view is set to true
515 * If it's a search page, WP_Query::bbp_is_search is set to true
516 *
517 * @since 2.0.0 bbPress (r2688)
518 *
519 * @param WP_Query $posts_query
520 */
521 function bbp_parse_query( $posts_query ) {
522
523 // Bail if $posts_query is not the main loop
524 if ( ! $posts_query->is_main_query() ) {
525 return;
526 }
527
528 // Bail if filters are suppressed on this query
529 if ( true === $posts_query->get( 'suppress_filters' ) ) {
530 return;
531 }
532
533 // Bail if in admin
534 if ( is_admin() ) {
535 return;
536 }
537
538 // Get query variables (default to null if not set)
539 $bbp_view = $posts_query->get( bbp_get_view_rewrite_id(), null );
540 $bbp_user = $posts_query->get( bbp_get_user_rewrite_id(), null );
541 $is_edit = $posts_query->get( bbp_get_edit_rewrite_id(), null );
542 $is_search = $posts_query->get( bbp_get_search_rewrite_id(), null );
543
544 // It is a user page - We'll also check if it is user edit
545 if ( ! is_null( $bbp_user ) ) {
546
547 /** Find User *********************************************************/
548
549 // Setup the default user variable
550 $the_user = false;
551
552 // If using pretty permalinks, always use slug
553 if ( get_option( 'permalink_structure' ) ) {
554 $the_user = get_user_by( 'slug', $bbp_user );
555
556 // If not using pretty permalinks, always use numeric ID
557 } elseif ( is_numeric( $bbp_user ) ) {
558 $the_user = get_user_by( 'id', $bbp_user );
559 }
560
561 // 404 and bail if user does not have a profile
562 if ( empty( $the_user->ID ) || ! bbp_user_has_profile( $the_user->ID ) ) {
563 $posts_query->bbp_is_404 = true;
564 return;
565 }
566
567 /** User Exists *******************************************************/
568
569 $is_favs = $posts_query->get( bbp_get_user_favorites_rewrite_id() );
570 $is_subs = $posts_query->get( bbp_get_user_subscriptions_rewrite_id() );
571 $is_topics = $posts_query->get( bbp_get_user_topics_rewrite_id() );
572 $is_replies = $posts_query->get( bbp_get_user_replies_rewrite_id() );
573 $is_engagements = $posts_query->get( bbp_get_user_engagements_rewrite_id() );
574
575 // View or edit?
576 if ( ! is_null( $is_edit ) ) {
577
578 // We are editing a profile
579 $posts_query->bbp_is_single_user_edit = true;
580
581 // Load the core WordPress contact methods
582 if ( ! function_exists( '_wp_get_user_contactmethods' ) ) {
583 require_once ABSPATH . 'wp-includes/registration.php';
584 }
585
586 // Load the edit_user functions
587 if ( ! function_exists( 'edit_user' ) ) {
588 require_once ABSPATH . 'wp-admin/includes/user.php';
589 }
590
591 // Load the grant/revoke super admin functions
592 if ( is_multisite() && ! function_exists( 'revoke_super_admin' ) ) {
593 require_once ABSPATH . 'wp-admin/includes/ms.php';
594 }
595
596 // Editing a user
597 $posts_query->bbp_is_edit = true;
598
599 // User favorites
600 } elseif ( ! empty( $is_favs ) ) {
601 $posts_query->bbp_is_single_user_favs = true;
602
603 // User subscriptions
604 } elseif ( ! empty( $is_subs ) ) {
605 $posts_query->bbp_is_single_user_subs = true;
606
607 // User topics
608 } elseif ( ! empty( $is_topics ) ) {
609 $posts_query->bbp_is_single_user_topics = true;
610
611 // User topics
612 } elseif ( ! empty( $is_replies ) ) {
613 $posts_query->bbp_is_single_user_replies = true;
614
615 // User engagements
616 } elseif ( ! empty( $is_engagements ) ) {
617 $posts_query->bbp_is_single_user_engagements = true;
618
619 // User profile
620 } else {
621 $posts_query->bbp_is_single_user_profile = true;
622 }
623
624 // Make sure 404 is not set
625 $posts_query->is_404 = false;
626
627 // Correct is_home variable
628 $posts_query->is_home = false;
629
630 // Looking at a single user
631 $posts_query->bbp_is_single_user = true;
632
633 // User found so don't 404 yet
634 $posts_query->bbp_is_404 = false;
635
636 // User is looking at their own profile
637 if ( bbp_get_current_user_id() === $the_user->ID ) {
638 $posts_query->bbp_is_single_user_home = true;
639 }
640
641 // Set bbp_user_id for future reference
642 $posts_query->set( 'bbp_user_id', $the_user->ID );
643
644 // Set the displayed user global to this user
645 bbpress()->displayed_user = $the_user;
646
647 // View Page
648 } elseif ( ! is_null( $bbp_view ) ) {
649
650 // Check if the view exists by checking if there are query args are set
651 $view_args = bbp_get_view_query_args( $bbp_view );
652
653 // Bail if view args are empty
654 if ( empty( $view_args ) ) {
655 $posts_query->bbp_is_404 = true;
656 return;
657 }
658
659 // Correct is_home variable
660 $posts_query->is_home = false;
661
662 // We are in a custom topic view
663 $posts_query->bbp_is_view = true;
664
665 // No 404 because views are all (currently) public
666 $posts_query->bbp_is_404 = false;
667
668 // Search Page
669 } elseif ( ! is_null( $is_search ) ) {
670
671 // Check if there are search query args set
672 $search_terms = bbp_get_search_terms();
673 if ( ! empty( $search_terms ) ) {
674 $posts_query->bbp_search_terms = $search_terms;
675 }
676
677 // Correct is_home variable
678 $posts_query->is_home = false;
679
680 // We are in a search query
681 $posts_query->bbp_is_search = true;
682
683 // No 404 because search is always public
684 $posts_query->bbp_is_404 = false;
685
686 // Forum/Topic/Reply Edit Page
687 } elseif ( ! is_null( $is_edit ) ) {
688
689 // Get the post type from the main query loop
690 $post_type = $posts_query->get( 'post_type' );
691
692 // Check which post_type we are editing, if any
693 if ( ! empty( $post_type ) ) {
694 switch ( $post_type ) {
695
696 // We are editing a forum
697 case bbp_get_forum_post_type() :
698 $posts_query->bbp_is_forum_edit = true;
699 $posts_query->bbp_is_edit = true;
700 $posts_query->bbp_is_404 = false;
701 break;
702
703 // We are editing a topic
704 case bbp_get_topic_post_type() :
705 $posts_query->bbp_is_topic_edit = true;
706 $posts_query->bbp_is_edit = true;
707 $posts_query->bbp_is_404 = false;
708 break;
709
710 // We are editing a reply
711 case bbp_get_reply_post_type() :
712 $posts_query->bbp_is_reply_edit = true;
713 $posts_query->bbp_is_edit = true;
714 $posts_query->bbp_is_404 = false;
715 break;
716 }
717
718 // We are editing a topic tag
719 } elseif ( bbp_is_topic_tag() ) {
720 $posts_query->bbp_is_topic_tag_edit = true;
721 $posts_query->bbp_is_edit = true;
722 $posts_query->bbp_is_404 = false;
723 }
724
725 // We save post revisions on our own
726 remove_action( 'pre_post_update', 'wp_save_post_revision' );
727
728 // Topic tag page
729 } elseif ( bbp_is_topic_tag() ) {
730 $posts_query->set( 'bbp_topic_tag', get_query_var( 'term' ) );
731 $posts_query->set( 'post_type', bbp_get_topic_post_type() );
732 $posts_query->set( 'posts_per_page', bbp_get_topics_per_page() );
733
734 // Do topics on forums root
735 } elseif ( is_post_type_archive( bbp_get_post_types( array( 'has_archive' => true ) ) ) && ( 'topics' === bbp_show_on_root() ) ) {
736 $posts_query->bbp_show_topics_on_root = true;
737 }
738 }
739