[ Index ] |
PHP Cross Reference of BBPress |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * bbPress Theme Compatibility 5 * 6 * @package bbPress 7 * @subpackage Core 8 */ 9 10 // Exit if accessed directly 11 defined( 'ABSPATH' ) || exit; 12 13 /** Theme Compat **************************************************************/ 14 15 /** 16 * What follows is an attempt at intercepting the natural page load process 17 * to replace the_content() with the appropriate bbPress content. 18 * 19 * To do this, bbPress does several direct manipulations of global variables 20 * and forces them to do what they are not supposed to be doing. 21 * 22 * Don't try anything you're about to witness here, at home. Ever. 23 */ 24 25 /** Base Class ****************************************************************/ 26 27 /** 28 * Theme Compatibility base class 29 * 30 * This is only intended to be extended, and is included here as a basic guide 31 * for future Template Packs to use. @link bbp_setup_theme_compat() 32 * 33 * @since 2.0.0 bbPress (r3506) 34 */ 35 class BBP_Theme_Compat { 36 37 /** 38 * Should be like: 39 * 40 * array( 41 * 'id' => ID of the theme (should be unique) 42 * 'name' => Name of the theme (should match style.css) 43 * 'version' => Theme version for cache busting scripts and styling 44 * 'dir' => Path to theme 45 * 'url' => URL to theme 46 * ); 47 * @var array 48 */ 49 private $_data = array(); 50 51 /** 52 * Pass the $properties to the object on creation. 53 * 54 * @since 2.1.0 bbPress (r3926) 55 * 56 * @param array $properties 57 */ 58 public function __construct( array $properties = array() ) { 59 $this->_data = $properties; 60 } 61 62 /** 63 * Set a theme's property. 64 * 65 * @since 2.1.0 bbPress (r3926) 66 * 67 * @param string $property 68 * @param mixed $value 69 * @return mixed 70 */ 71 public function __set( $property, $value ) { 72 return $this->_data[ $property ] = $value; 73 } 74 75 /** 76 * Get a theme's property. 77 * 78 * @since 2.1.0 bbPress (r3926) 79 * 80 * @param string $property 81 * @param mixed $value 82 * @return mixed 83 */ 84 public function __get( $property ) { 85 return array_key_exists( $property, $this->_data ) 86 ? $this->_data[ $property ] 87 : ''; 88 } 89 90 /** 91 * Return the template directory. 92 * 93 * @since 2.6.0 bbPress (r6548) 94 * 95 * @return string 96 */ 97 public function get_dir() { 98 return $this->dir; 99 } 100 } 101 102 /** Functions *****************************************************************/ 103 104 /** 105 * Setup the active template pack and register it's directory in the stack. 106 * 107 * @since 2.0.0 bbPress (r3311) 108 * 109 * @param BBP_Theme_Compat $theme 110 */ 111 function bbp_setup_theme_compat( $theme = 'default' ) { 112 $bbp = bbpress(); 113 114 // Bail if something already has this under control 115 if ( ! empty( $bbp->theme_compat->theme ) ) { 116 return; 117 } 118 119 // Fallback for empty theme 120 if ( empty( $theme ) ) { 121 $theme = 'default'; 122 } 123 124 // If the theme is registered, use it and add it to the stack 125 if ( isset( $bbp->theme_compat->packages[ $theme ] ) ) { 126 $bbp->theme_compat->theme = $bbp->theme_compat->packages[ $theme ]; 127 128 // Setup the template stack for the active template pack 129 bbp_register_template_stack( array( $bbp->theme_compat->theme, 'get_dir' ) ); 130 } 131 } 132 133 /** 134 * Get the current template pack package. 135 * 136 * @since 2.6.0 bbPress (r6548) 137 * 138 * @return BBP_Theme_Compat 139 */ 140 function bbp_get_current_template_pack() { 141 $bbp = bbpress(); 142 143 // Theme was not setup, so fallback to an empty object 144 if ( empty( $bbp->theme_compat->theme ) ) { 145 $bbp->theme_compat->theme = new BBP_Theme_Compat(); 146 } 147 148 // Filter & return 149 return apply_filters( 'bbp_get_current_template_pack', $bbp->theme_compat->theme ); 150 } 151 152 /** 153 * Gets the id of the bbPress compatible theme used, in the event the 154 * currently active WordPress theme does not explicitly support bbPress. 155 * This can be filtered or set manually. Tricky theme authors can override the 156 * default and include their own bbPress compatibility layers for their themes. 157 * 158 * @since 2.0.0 bbPress (r3506) 159 * 160 * @return string 161 */ 162 function bbp_get_theme_compat_id() { 163 164 // Filter & return 165 return apply_filters( 'bbp_get_theme_compat_id', bbp_get_current_template_pack()->id ); 166 } 167 168 /** 169 * Gets the name of the bbPress compatible theme used, in the event the 170 * currently active WordPress theme does not explicitly support bbPress. 171 * This can be filtered or set manually. Tricky theme authors can override the 172 * default and include their own bbPress compatibility layers for their themes. 173 * 174 * @since 2.0.0 bbPress (r3506) 175 * 176 * @return string 177 */ 178 function bbp_get_theme_compat_name() { 179 180 // Filter & return 181 return apply_filters( 'bbp_get_theme_compat_name', bbp_get_current_template_pack()->name ); 182 } 183 184 /** 185 * Gets the version of the bbPress compatible theme used, in the event the 186 * currently active WordPress theme does not explicitly support bbPress. 187 * This can be filtered or set manually. Tricky theme authors can override the 188 * default and include their own bbPress compatibility layers for their themes. 189 * 190 * @since 2.0.0 bbPress (r3506) 191 * 192 * @return string 193 */ 194 function bbp_get_theme_compat_version() { 195 196 // Filter & return 197 return apply_filters( 'bbp_get_theme_compat_version', bbp_get_current_template_pack()->version ); 198 } 199 200 /** 201 * Gets the bbPress compatible theme used in the event the currently active 202 * WordPress theme does not explicitly support bbPress. This can be filtered, 203 * or set manually. Tricky theme authors can override the default and include 204 * their own bbPress compatibility layers for their themes. 205 * 206 * @since 2.0.0 bbPress (r3032) 207 * 208 * @return string 209 */ 210 function bbp_get_theme_compat_dir() { 211 212 // Filter & return 213 return apply_filters( 'bbp_get_theme_compat_dir', bbp_get_current_template_pack()->dir ); 214 } 215 216 /** 217 * Gets the bbPress compatible theme used in the event the currently active 218 * WordPress theme does not explicitly support bbPress. This can be filtered, 219 * or set manually. Tricky theme authors can override the default and include 220 * their own bbPress compatibility layers for their themes. 221 * 222 * @since 2.0.0 bbPress (r3032) 223 * 224 * @return string 225 */ 226 function bbp_get_theme_compat_url() { 227 228 // Filter & return 229 return apply_filters( 'bbp_get_theme_compat_url', bbp_get_current_template_pack()->url ); 230 } 231 232 /** 233 * Gets true/false if page is currently inside theme compatibility 234 * 235 * @since 2.0.0 bbPress (r3265) 236 * 237 * @return bool 238 */ 239 function bbp_is_theme_compat_active() { 240 $bbp = bbpress(); 241 242 if ( empty( $bbp->theme_compat->active ) ) { 243 return false; 244 } 245 246 return $bbp->theme_compat->active; 247 } 248 249 /** 250 * Sets true/false if page is currently inside theme compatibility 251 * 252 * @since 2.0.0 bbPress (r3265) 253 * 254 * @param bool $set 255 * @return bool 256 */ 257 function bbp_set_theme_compat_active( $set = true ) { 258 bbpress()->theme_compat->active = $set; 259 260 return (bool) bbpress()->theme_compat->active; 261 } 262 263 /** 264 * Set the theme compat templates global 265 * 266 * Stash possible template files for the current query. Useful if plugins want 267 * to override them, or see what files are being scanned for inclusion. 268 * 269 * @since 2.0.0 bbPress (r3311) 270 */ 271 function bbp_set_theme_compat_templates( $templates = array() ) { 272 bbpress()->theme_compat->templates = $templates; 273 274 return bbpress()->theme_compat->templates; 275 } 276 277 /** 278 * Set the theme compat template global 279 * 280 * Stash the template file for the current query. Useful if plugins want 281 * to override it, or see what file is being included. 282 * 283 * @since 2.0.0 bbPress (r3311) 284 */ 285 function bbp_set_theme_compat_template( $template = '' ) { 286 bbpress()->theme_compat->template = $template; 287 288 return bbpress()->theme_compat->template; 289 } 290 291 /** 292 * Set the theme compat original_template global 293 * 294 * Stash the original template file for the current query. Useful for checking 295 * if bbPress was able to find a more appropriate template. 296 * 297 * @since 2.1.0 bbPress (r3926) 298 */ 299 function bbp_set_theme_compat_original_template( $template = '' ) { 300 bbpress()->theme_compat->original_template = $template; 301 302 return bbpress()->theme_compat->original_template; 303 } 304 305 /** 306 * Is a template the original_template global 307 * 308 * Stash the original template file for the current query. Useful for checking 309 * if bbPress was able to find a more appropriate template. 310 * 311 * @since 2.1.0 bbPress (r3926) 312 */ 313 function bbp_is_theme_compat_original_template( $template = '' ) { 314 $bbp = bbpress(); 315 316 // Bail if no original template 317 if ( empty( $bbp->theme_compat->original_template ) ) { 318 return false; 319 } 320 321 return (bool) ( $bbp->theme_compat->original_template === $template ); 322 } 323 324 /** 325 * Register a new bbPress theme package to the active theme packages array 326 * 327 * @since 2.1.0 bbPress (r3829) 328 * 329 * @param array $theme 330 */ 331 function bbp_register_theme_package( $theme = array(), $override = true ) { 332 333 // Create new BBP_Theme_Compat object from the $theme array 334 if ( is_array( $theme ) ) { 335 $theme = new BBP_Theme_Compat( $theme ); 336 } 337 338 // Bail if $theme isn't a proper object 339 if ( ! is_a( $theme, 'BBP_Theme_Compat' ) ) { 340 return; 341 } 342 343 // Load up bbPress 344 $bbp = bbpress(); 345 346 // Only override if the flag is set and not previously registered 347 if ( empty( $bbp->theme_compat->packages[ $theme->id ] ) || ( true === $override ) ) { 348 $bbp->theme_compat->packages[ $theme->id ] = $theme; 349 } 350 } 351 352 /** 353 * This fun little function fills up some WordPress globals with dummy data to 354 * stop your average page template from complaining about it missing. 355 * 356 * @since 2.0.0 bbPress (r3108) 357 * 358 * @global WP_Query $wp_query 359 * @global object $post 360 * @param array $args 361 */ 362 function bbp_theme_compat_reset_post( $args = array() ) { 363 global $wp_query, $post; 364 365 // Switch defaults if post is set 366 if ( isset( $wp_query->post ) ) { 367 368 // Use primarily Post attributes 369 $defaults = array( 370 'ID' => $wp_query->post->ID, 371 'post_status' => $wp_query->post->post_status, 372 'post_author' => $wp_query->post->post_author, 373 'post_parent' => $wp_query->post->post_parent, 374 'post_type' => $wp_query->post->post_type, 375 'post_date' => $wp_query->post->post_date, 376 'post_date_gmt' => $wp_query->post->post_date_gmt, 377 'post_modified' => $wp_query->post->post_modified, 378 'post_modified_gmt' => $wp_query->post->post_modified_gmt, 379 'post_content' => $wp_query->post->post_content, 380 'post_title' => $wp_query->post->post_title, 381 'post_excerpt' => $wp_query->post->post_excerpt, 382 'post_content_filtered' => $wp_query->post->post_content_filtered, 383 'post_mime_type' => $wp_query->post->post_mime_type, 384 'post_password' => $wp_query->post->post_password, 385 'post_name' => $wp_query->post->post_name, 386 'guid' => $wp_query->post->guid, 387 'menu_order' => $wp_query->post->menu_order, 388 'pinged' => $wp_query->post->pinged, 389 'to_ping' => $wp_query->post->to_ping, 390 'ping_status' => $wp_query->post->ping_status, 391 'comment_status' => $wp_query->post->comment_status, 392 'comment_count' => $wp_query->post->comment_count, 393 'filter' => $wp_query->post->filter, 394 395 'is_404' => false, 396 'is_page' => false, 397 'is_single' => false, 398 'is_archive' => false, 399 'is_tax' => false 400 ); 401 } else { 402 403 // Get the default zero date value a single time 404 $zero_date = bbp_get_empty_datetime(); 405 406 // Use primarily empty attributes 407 $defaults = array( 408 'ID' => -9999, 409 'post_status' => bbp_get_public_status_id(), 410 'post_author' => 0, 411 'post_parent' => 0, 412 'post_type' => 'page', 413 'post_date' => $zero_date, 414 'post_date_gmt' => $zero_date, 415 'post_modified' => $zero_date, 416 'post_modified_gmt' => $zero_date, 417 'post_content' => '', 418 'post_title' => '', 419 'post_excerpt' => '', 420 'post_content_filtered' => '', 421 'post_mime_type' => '', 422 'post_password' => '', 423 'post_name' => '', 424 'guid' => '', 425 'menu_order' => 0, 426 'pinged' => '', 427 'to_ping' => '', 428 'ping_status' => '', 429 'comment_status' => 'closed', 430 'comment_count' => 0, 431 'filter' => 'raw', 432 433 'is_404' => false, 434 'is_page' => false, 435 'is_single' => false, 436 'is_archive' => false, 437 'is_tax' => false 438 ); 439 } 440 441 // Parse & filter 442 $dummy = bbp_parse_args( $args, $defaults, 'theme_compat_reset_post' ); 443 444 // Bail if dummy post is empty 445 if ( empty( $dummy ) ) { 446 return; 447 } 448 449 // Set the $post global 450 $post = new WP_Post( (object) $dummy ); 451 452 // Copy the new post global into the main $wp_query 453 $wp_query->post = $post; 454 $wp_query->posts = array( $post ); 455 456 // Prevent comments form from appearing 457 $wp_query->post_count = 1; 458 $wp_query->is_404 = $dummy['is_404']; 459 $wp_query->is_page = $dummy['is_page']; 460 $wp_query->is_single = $dummy['is_single']; 461 $wp_query->is_archive = $dummy['is_archive']; 462 $wp_query->is_tax = $dummy['is_tax']; 463 464 // Reset is_singular based on page/single args 465 // https://bbpress.trac.wordpress.org/ticket/2545 466 $wp_query->is_singular = $wp_query->is_single; 467 468 // Clean up the dummy post 469 unset( $dummy ); 470 471 // If we are resetting a post, we are in theme compat 472 bbp_set_theme_compat_active( true ); 473 } 474 475 /** 476 * Reset main query vars and filter 'the_content' to output a bbPress 477 * template part as needed. 478 * 479 * @since 2.0.0 bbPress (r3032) 480 * 481 * @param string $template 482 */ 483 function bbp_template_include_theme_compat( $template = '' ) { 484 485 /** 486 * Bail if a root template was already found. This prevents unintended 487 * recursive filtering of 'the_content'. 488 * 489 * @link https://bbpress.trac.wordpress.org/ticket/2429 490 */ 491 if ( bbp_is_template_included() ) { 492 return $template; 493 } 494 495 /** 496 * If BuddyPress is activated at a network level, the action order is 497 * reversed, which causes the template integration to fail. If we're looking 498 * at a BuddyPress page here, bail to prevent the extra processing. 499 * 500 * This is a bit more brute-force than is probably necessary, but gets the 501 * job done while we work towards something more elegant. 502 */ 503 if ( function_exists( 'is_buddypress' ) && is_buddypress() ) { 504 return $template; 505 } 506 507 // Define local variable(s) 508 $bbp_shortcodes = bbpress()->shortcodes; 509 510 // Bail if shortcodes are unset somehow 511 if ( ! is_a( $bbp_shortcodes, 'BBP_Shortcodes' ) ) { 512 return $template; 513 } 514 515 /** Users *************************************************************/ 516 517 if ( bbp_is_single_user_edit() || bbp_is_single_user() ) { 518 519 // Reset post 520 bbp_theme_compat_reset_post( array( 521 'ID' => 0, 522 'post_author' => 0, 523 'post_date' => bbp_get_empty_datetime(), 524 'post_content' => bbp_buffer_template_part( 'content', 'single-user', false ), 525 'post_type' => '', 526 'post_title' => bbp_get_displayed_user_field( 'display_name' ), 527 'post_status' => bbp_get_public_status_id(), 528 'is_archive' => false, 529 'comment_status' => 'closed' 530 ) ); 531 532 /** Forums ************************************************************/ 533 534 // Forum archive 535 } elseif ( bbp_is_forum_archive() ) { 536 537 // Page exists where this archive should be 538 $page = bbp_get_page_by_path( bbp_get_root_slug() ); 539 540 // Should we replace the content... 541 if ( empty( $page->post_content ) ) { 542 543 // Use the topics archive 544 if ( 'topics' === bbp_show_on_root() ) { 545 $new_content = $bbp_shortcodes->display_topic_index(); 546 547 // No page so show the archive 548 } else { 549 $new_content = $bbp_shortcodes->display_forum_index(); 550 } 551 552 // ...or use the existing page content? 553 } else { 554 $new_content = apply_filters( 'the_content', $page->post_content ); 555 } 556 557 // Should we replace the title... 558 if ( empty( $page->post_title ) ) { 559 560 // Use the topics archive 561 if ( 'topics' === bbp_show_on_root() ) { 562 $new_title = bbp_get_topic_archive_title(); 563 564 // No page so show the archive 565 } else { 566 $new_title = bbp_get_forum_archive_title(); 567 } 568 569 // ...or use the existing page title? 570 } else { 571 $new_title = apply_filters( 'the_title', $page->post_title, $page->ID ); 572 } 573 574 // Reset post 575 bbp_theme_compat_reset_post( array( 576 'ID' => ! empty( $page->ID ) ? $page->ID : 0, 577 'post_title' => $new_title, 578 'post_author' => 0, 579 'post_date' => bbp_get_empty_datetime(), 580 'post_content' => $new_content, 581 'post_type' => bbp_get_forum_post_type(), 582 'post_status' => bbp_get_public_status_id(), 583 'is_archive' => true, 584 'comment_status' => 'closed' 585 ) ); 586 587 // Single Forum 588 } elseif ( bbp_is_forum_edit() ) { 589 590 // Reset post 591 bbp_theme_compat_reset_post( array( 592 'ID' => bbp_get_forum_id(), 593 'post_title' => bbp_get_forum_title(), 594 'post_author' => bbp_get_forum_author_id(), 595 'post_date' => bbp_get_empty_datetime(), 596 'post_content' => $bbp_shortcodes->display_forum_form(), 597 'post_type' => bbp_get_forum_post_type(), 598 'post_status' => bbp_get_forum_visibility(), 599 'is_single' => true, 600 'comment_status' => 'closed' 601 ) ); 602 603 // Lock the forum from other edits 604 bbp_set_post_lock( bbp_get_forum_id() ); 605 606 } elseif ( bbp_is_single_forum() ) { 607 608 // Reset post 609 bbp_theme_compat_reset_post( array( 610 'ID' => bbp_get_forum_id(), 611 'post_title' => bbp_get_forum_title(), 612 'post_author' => bbp_get_forum_author_id(), 613 'post_date' => bbp_get_empty_datetime(), 614 'post_content' => $bbp_shortcodes->display_forum( array( 'id' => bbp_get_forum_id() ) ), 615 'post_type' => bbp_get_forum_post_type(), 616 'post_status' => bbp_get_forum_visibility(), 617 'is_single' => true, 618 'comment_status' => 'closed' 619 ) ); 620 621 /** Topics ************************************************************/ 622 623 // Topic archive 624 } elseif ( bbp_is_topic_archive() ) { 625 626 // Page exists where this archive should be 627 $page = bbp_get_page_by_path( bbp_get_topic_archive_slug() ); 628 629 // Should we replace the content... 630 if ( empty( $page->post_content ) ) { 631 $new_content = $bbp_shortcodes->display_topic_index(); 632 633 // ...or use the existing page content? 634 } else { 635 $new_content = apply_filters( 'the_content', $page->post_content ); 636 } 637 638 // Should we replace the title... 639 if ( empty( $page->post_title ) ) { 640 $new_title = bbp_get_topic_archive_title(); 641 642 // ...or use the existing page title? 643 } else { 644 $new_title = apply_filters( 'the_title', $page->post_title ); 645 } 646 647 // Reset post 648 bbp_theme_compat_reset_post( array( 649 'ID' => ! empty( $page->ID ) ? $page->ID : 0, 650 'post_title' => bbp_get_topic_archive_title(), 651 'post_author' => 0, 652 'post_date' => bbp_get_empty_datetime(), 653 'post_content' => $new_content, 654 'post_type' => bbp_get_topic_post_type(), 655 'post_status' => bbp_get_public_status_id(), 656 'is_archive' => true, 657 'comment_status' => 'closed' 658 ) ); 659 660 // Single Topic 661 } elseif ( bbp_is_topic_edit() || bbp_is_single_topic() ) { 662 663 // Split 664 if ( bbp_is_topic_split() ) { 665 $new_content = bbp_buffer_template_part( 'form', 'topic-split', false ); 666 667 // Merge 668 } elseif ( bbp_is_topic_merge() ) { 669 $new_content = bbp_buffer_template_part( 'form', 'topic-merge', false ); 670 671 // Edit 672 } elseif ( bbp_is_topic_edit() ) { 673 $new_content = $bbp_shortcodes->display_topic_form(); 674 675 // Lock the topic from other edits 676 bbp_set_post_lock( bbp_get_topic_id() ); 677 678 // Single 679 } else { 680 $new_content = $bbp_shortcodes->display_topic( array( 'id' => bbp_get_topic_id() ) ); 681 } 682 683 // Reset post 684 bbp_theme_compat_reset_post( array( 685 'ID' => bbp_get_topic_id(), 686 'post_title' => bbp_get_topic_title(), 687 'post_author' => bbp_get_topic_author_id(), 688 'post_date' => bbp_get_empty_datetime(), 689 'post_content' => $new_content, 690 'post_type' => bbp_get_topic_post_type(), 691 'post_status' => bbp_get_topic_status(), 692 'is_single' => true, 693 'comment_status' => 'closed' 694 ) ); 695 696 /** Replies ***********************************************************/ 697 698 // Reply archive 699 } elseif ( is_post_type_archive( bbp_get_reply_post_type() ) ) { 700 701 // Reset post 702 bbp_theme_compat_reset_post( array( 703 'ID' => 0, 704 'post_title' => esc_html__( 'Replies', 'bbpress' ), 705 'post_author' => 0, 706 'post_date' => bbp_get_empty_datetime(), 707 'post_content' => $bbp_shortcodes->display_reply_index(), 708 'post_type' => bbp_get_reply_post_type(), 709 'post_status' => bbp_get_public_status_id(), 710 'is_archive' => true, 711 'comment_status' => 'closed' 712 ) ); 713 714 // Single Reply 715 } elseif ( bbp_is_reply_edit() || bbp_is_single_reply() ) { 716 717 // Move 718 if ( bbp_is_reply_move() ) { 719 $new_content = bbp_buffer_template_part( 'form', 'reply-move', false ); 720 721 // Edit 722 } elseif ( bbp_is_reply_edit() ) { 723 $new_content = $bbp_shortcodes->display_reply_form(); 724 725 // Lock the reply from other edits 726 bbp_set_post_lock( bbp_get_reply_id() ); 727 728 // Single 729 } else { 730 $new_content = $bbp_shortcodes->display_reply( array( 'id' => get_the_ID() ) ); 731 } 732 733 // Reset post 734 bbp_theme_compat_reset_post( array( 735 'ID' => bbp_get_reply_id(), 736 'post_title' => bbp_get_reply_title(), 737 'post_author' => bbp_get_reply_author_id(), 738 'post_date' => bbp_get_empty_datetime(), 739 'post_content' => $new_content, 740 'post_type' => bbp_get_reply_post_type(), 741 'post_status' => bbp_get_reply_status(), 742 'is_single' => true, 743 'comment_status' => 'closed' 744 ) ); 745 746 /** Views *************************************************************/ 747 748 } elseif ( bbp_is_single_view() ) { 749 750 // Reset post 751 bbp_theme_compat_reset_post( array( 752 'ID' => 0, 753 'post_title' => bbp_get_view_title(), 754 'post_author' => 0, 755 'post_date' => bbp_get_empty_datetime(), 756 'post_content' => $bbp_shortcodes->display_view( array( 'id' => get_query_var( bbp_get_view_rewrite_id() ) ) ), 757 'post_type' => '', 758 'post_status' => bbp_get_public_status_id(), 759 'is_archive' => true, 760 'comment_status' => 'closed' 761 ) ); 762 763 /** Search ************************************************************/ 764 765 } elseif ( bbp_is_search() ) { 766 767 // Reset post 768 bbp_theme_compat_reset_post( array( 769 'ID' => 0, 770 'post_title' => bbp_get_search_title(), 771 'post_author' => 0, 772 'post_date' => bbp_get_empty_datetime(), 773 'post_content' => $bbp_shortcodes->display_search( array( 'search' => get_query_var( bbp_get_search_rewrite_id() ) ) ), 774 'post_type' => '', 775 'post_status' => bbp_get_public_status_id(), 776 'is_archive' => true, 777 'comment_status' => 'closed' 778 ) ); 779 780 /** Topic Tags ********************************************************/ 781 782 // Topic Tag Edit 783 } elseif ( bbp_is_topic_tag_edit() || bbp_is_topic_tag() ) { 784 785 // Stash the current term in a new var 786 set_query_var( 'bbp_topic_tag', get_query_var( 'term' ) ); 787 788 // Show topics of tag 789 if ( bbp_is_topic_tag() ) { 790 $new_content = $bbp_shortcodes->display_topics_of_tag( array( 'id' => bbp_get_topic_tag_id() ) ); 791 792 // Edit topic tag 793 } elseif ( bbp_is_topic_tag_edit() ) { 794 $new_content = $bbp_shortcodes->display_topic_tag_form(); 795 } 796 797 // Reset the post with our new title 798 bbp_theme_compat_reset_post( array( 799 'ID' => 0, 800 'post_author' => 0, 801 'post_date' => bbp_get_empty_datetime(), 802 'post_content' => $new_content, 803 'post_type' => '', 804 'post_title' => sprintf( esc_html__( 'Topic Tag: %s', 'bbpress' ), bbp_get_topic_tag_name() ), 805 'post_status' => bbp_get_public_status_id(), 806 'is_tax' => true, 807 'is_archive' => true, 808 'comment_status' => 'closed' 809 ) ); 810 } 811 812 /** 813 * Bail if the template already matches a bbPress template. This includes 814 * archive-* and single-* WordPress post_type matches (allowing 815 * themes to use the expected format) as well as all bbPress-specific 816 * template files for users, topics, forums, etc... 817 * 818 * We do this after the above checks to prevent incorrect 404 body classes 819 * and header statuses, as well as to set the post global as needed. 820 * 821 * @see https://bbpress.trac.wordpress.org/ticket/1478/ 822 */ 823 if ( bbp_is_template_included() ) { 824 return $template; 825 826 /** 827 * If we are relying on the built-in theme compatibility API to load 828 * the proper content, we need to intercept the_content, replace the 829 * output, and display ours instead. 830 * 831 * To do this, we first remove all filters from 'the_content' and hook 832 * our own function into it, which runs a series of checks to determine 833 * the context, and then uses the built in shortcodes to output the 834 * correct results from inside an output buffer. 835 * 836 * Uses bbp_get_theme_compat_templates() to provide fall-backs that 837 * should be coded without superfluous mark-up and logic (prev/next 838 * navigation, comments, date/time, etc...) 839 * 840 * Hook into the 'bbp_get_bbpress_template' to override the array of 841 * possible templates, or 'bbp_bbpress_template' to override the result. 842 */ 843 } elseif ( bbp_is_theme_compat_active() ) { 844 bbp_remove_all_filters( 'the_content' ); 845 846 $template = bbp_get_theme_compat_templates(); 847 } 848 849 // Filter & return 850 return apply_filters( 'bbp_template_include_theme_compat', $template ); 851 } 852 853 /** Helpers *******************************************************************/ 854 855 /** 856 * Remove the canonical redirect to allow pretty pagination 857 * 858 * @since 2.0.0 bbPress (r2628) 859 * 860 * @param string $redirect_url Redirect url 861 * 862 * @return bool|string False if it's a topic/forum and their first page, 863 * otherwise the redirect url 864 */ 865 function bbp_redirect_canonical( $redirect_url ) { 866 867 // Canonical is for the beautiful 868 if ( bbp_use_pretty_urls() ) { 869 870 // If viewing beyond page 1 of several 871 if ( 1 < bbp_get_paged() ) { 872 873 // Only on single topics... 874 if ( bbp_is_single_topic() ) { 875 $redirect_url = false; 876 877 // ...and single forums... 878 } elseif ( bbp_is_single_forum() ) { 879 $redirect_url = false; 880 881 // ...and single replies... 882 } elseif ( bbp_is_single_reply() ) { 883 $redirect_url = false; 884 885 // ...and any single anything else... 886 // 887 // @todo - Find a more accurate way to disable paged canonicals for 888 // paged shortcode usage within other posts. 889 } elseif ( is_page() || is_singular() ) { 890 $redirect_url = false; 891 } 892 893 // If editing a topic 894 } elseif ( bbp_is_topic_edit() ) { 895 $redirect_url = false; 896 897 // If editing a reply 898 } elseif ( bbp_is_reply_edit() ) { 899 $redirect_url = false; 900 } 901 } 902 903 return $redirect_url; 904 } 905 906 /** Filters *******************************************************************/ 907 908 /** 909 * Removes all filters from a WordPress filter, and stashes them in the $bbp 910 * global in the event they need to be restored later. 911 * 912 * @since 2.0.0 bbPress (r3251) 913 * 914 * @global WP_filter $wp_filter 915 * @global array $merged_filters 916 * @param string $tag 917 * @param int $priority 918 * @return bool 919 */ 920 function bbp_remove_all_filters( $tag, $priority = false ) { 921 global $wp_filter, $merged_filters; 922 923 $bbp = bbpress(); 924 925 // Filters exist 926 if ( isset( $wp_filter[ $tag ] ) ) { 927 928 // Filters exist in this priority 929 if ( ! empty( $priority ) && isset( $wp_filter[ $tag ][ $priority ] ) ) { 930 931 // Store filters in a backup 932 $bbp->filters->wp_filter[ $tag ][ $priority ] = $wp_filter[ $tag ][ $priority ]; 933 934 // Unset the filters 935 unset( $wp_filter[ $tag ][ $priority ] ); 936 937 // Priority is empty 938 } else { 939 940 // Store filters in a backup 941 $bbp->filters->wp_filter[ $tag ] = $wp_filter[ $tag ]; 942 943 // Unset the filters 944 unset( $wp_filter[ $tag ] ); 945 } 946 } 947 948 // Check merged filters 949 if ( isset( $merged_filters[ $tag ] ) ) { 950 951 // Store filters in a backup 952 $bbp->filters->merged_filters[ $tag ] = $merged_filters[ $tag ]; 953 954 // Unset the filters 955 unset( $merged_filters[ $tag ] ); 956 } 957 958 return true; 959 } 960 961 /** 962 * Restores filters from the $bbp global that were removed using 963 * bbp_remove_all_filters() 964 * 965 * @since 2.0.0 bbPress (r3251) 966 * 967 * @global WP_filter $wp_filter 968 * @global array $merged_filters 969 * @param string $tag 970 * @param int $priority 971 * @return bool 972 */ 973 function bbp_restore_all_filters( $tag, $priority = false ) { 974 global $wp_filter, $merged_filters; 975 976 $bbp = bbpress(); 977 978 // Filters exist 979 if ( isset( $bbp->filters->wp_filter[ $tag ] ) ) { 980 981 // Filters exist in this priority 982 if ( ! empty( $priority ) && isset( $bbp->filters->wp_filter[ $tag ][ $priority ] ) ) { 983 984 // Store filters in a backup 985 $wp_filter[ $tag ][ $priority ] = $bbp->filters->wp_filter[ $tag ][ $priority ]; 986 987 // Unset the filters 988 unset( $bbp->filters->wp_filter[ $tag ][ $priority ] ); 989 990 // Priority is empty 991 } else { 992 993 // Store filters in a backup 994 $wp_filter[ $tag ] = $bbp->filters->wp_filter[ $tag ]; 995 996 // Unset the filters 997 unset( $bbp->filters->wp_filter[ $tag ] ); 998 } 999 } 1000 1001 // Check merged filters 1002 if ( isset( $bbp->filters->merged_filters[ $tag ] ) ) { 1003 1004 // Store filters in a backup 1005 $merged_filters[ $tag ] = $bbp->filters->merged_filters[ $tag ]; 1006 1007 // Unset the filters 1008 unset( $bbp->filters->merged_filters[ $tag ] ); 1009 } 1010 1011 return true; 1012 } 1013 1014 /** 1015 * Force comments_status to 'closed' for bbPress post types 1016 * 1017 * @since 2.1.0 bbPress (r3589) 1018 * 1019 * @param bool $open True if open, false if closed 1020 * @param int $post_id ID of the post to check 1021 * @return bool True if open, false if closed 1022 */ 1023 function bbp_force_comment_status( $open = false, $post_id = 0 ) { 1024 1025 // Default return value is what is passed in $open 1026 $retval = (bool) $open; 1027 1028 // Get the post type of the post ID 1029 $post_type = get_post_type( $post_id ); 1030 1031 // Only force for bbPress post types 1032 if ( in_array( $post_type, bbp_get_post_types(), true ) ) { 1033 $retval = false; 1034 } 1035 1036 // Filter & return 1037 return (bool) apply_filters( 'bbp_force_comment_status', $retval, $open, $post_id, $post_type ); 1038 } 1039 1040 /** 1041 * Remove "prev" and "next" relational links from <head> on bbPress pages. 1042 * 1043 * WordPress automatically generates these relational links to the current 1044 * page, but bbPress does not use these links, nor would they work the same. 1045 * 1046 * In this function, we remove these links when on a bbPress page. This also 1047 * prevents additional, unnecessary queries from running. 1048 * 1049 * @since 2.6.0 bbPress (r7071) 1050 */ 1051 function bbp_remove_adjacent_posts() { 1052 1053 // Bail if not a bbPress page 1054 if ( ! is_bbpress() ) { 1055 return; 1056 } 1057 1058 // Remove the WordPress core action for adjacent posts 1059 remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10 ); 1060 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sat Dec 21 01:00:52 2024 | Cross-referenced by PHPXref 0.7.1 |