PluginProbe
bbPress / 2.6.15
bbPress v2.6.15
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 / core / template-functions.php

template-functions.php in bbPress 2.6.15, at 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