Changeset 10518 for trunk/src/bp-core/bp-core-component.php
- Timestamp:
- 02/05/2016 04:26:30 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bp-core/bp-core-component.php
r10497 r10518 11 11 defined( 'ABSPATH' ) || exit; 12 12 13 if ( !class_exists( 'BP_Component' ) ) : 14 15 /** 16 * BuddyPress Component Class. 17 * 18 * The BuddyPress component class is responsible for simplifying the creation 19 * of components that share similar behaviors and routines. It is used 20 * internally by BuddyPress to create the bundled components, but can be 21 * extended to create other really neat things. 22 * 23 * @since 1.5.0 24 */ 25 class BP_Component { 26 27 /** Variables *************************************************************/ 28 29 /** 30 * Translatable name for the component. 31 * 32 * @internal 33 * @var string $name 34 */ 35 public $name = ''; 36 37 /** 38 * Unique ID for the component. 39 * 40 * @since 1.5.0 41 * @var string $id 42 */ 43 public $id = ''; 44 45 /** 46 * Unique slug for the component, for use in query strings and URLs. 47 * 48 * @since 1.5.0 49 * @var string $slug 50 */ 51 public $slug = ''; 52 53 /** 54 * Does the component need a top-level directory? 55 * 56 * @since 1.5.0 57 * @var bool $has_directory 58 */ 59 public $has_directory = false; 60 61 /** 62 * The path to the component's files. 63 * 64 * @since 1.5.0 65 * @var string $path 66 */ 67 public $path = ''; 68 69 /** 70 * The WP_Query loop for this component. 71 * 72 * @since 1.5.0 73 * @var WP_Query $query 74 */ 75 public $query = false; 76 77 /** 78 * The current ID of the queried object. 79 * 80 * @since 1.5.0 81 * @var string $current_id 82 */ 83 public $current_id = ''; 84 85 /** 86 * Callback for formatting notifications. 87 * 88 * @since 1.5.0 89 * @var callable $notification_callback 90 */ 91 public $notification_callback = ''; 92 93 /** 94 * WordPress Toolbar links. 95 * 96 * @since 1.5.0 97 * @var array $admin_menu 98 */ 99 public $admin_menu = ''; 100 101 /** 102 * Placeholder text for component directory search box. 103 * 104 * @since 1.6.0 105 * @var string $search_string 106 */ 107 public $search_string = ''; 108 109 /** 110 * Root slug for the component. 111 * 112 * @since 1.6.0 113 * @var string $root_slug 114 */ 115 public $root_slug = ''; 116 117 /** 118 * Metadata tables for the component (if applicable). 119 * 120 * @since 2.0.0 121 * 122 * @var array 123 */ 124 public $meta_tables = array(); 125 126 /** 127 * Global tables for the component (if applicable). 128 * 129 * @since 2.0.0 130 * 131 * @var array 132 */ 133 public $global_tables = array(); 134 135 /** 136 * Query argument for component search URLs. 137 * 138 * @since 2.4.0 139 * @var string 140 */ 141 public $search_query_arg = 's'; 142 143 /** Methods ***************************************************************/ 144 145 /** 146 * Component loader. 147 * 148 * @since 1.5.0 149 * @since 1.9.0 Added $params as a parameter. 150 * @since 2.3.0 Added $params['features'] as a configurable value. 151 * @since 2.4.0 Added $params['search_query_arg'] as a configurable value. 152 * 153 * @param string $id Unique ID. Letters, numbers, and underscores only. 154 * @param string $name Unique name. This should be a translatable name, eg. 155 * __( 'Groups', 'buddypress' ). 156 * @param string $path The file path for the component's files. Used by {@link BP_Component::includes()}. 157 * @param array $params { 158 * Additional parameters used by the component. 159 * @type int $adminbar_myaccount_order Set the position for our menu under the WP Toolbar's "My Account menu". 160 * @type array $features An array of feature names. This is used to load additional files from your 161 * component directory and for feature active checks. eg. array( 'awesome' ) 162 * would look for a file called "bp-{$this->id}-awesome.php" and you could use 163 * bp_is_active( $this->id, 'awesome' ) to determine if the feature is active. 164 * @type string $search_query_arg String to be used as the query argument in component search URLs. 165 * } 166 */ 167 public function start( $id = '', $name = '', $path = '', $params = array() ) { 168 169 // Internal identifier of component. 170 $this->id = $id; 171 172 // Internal component name. 173 $this->name = $name; 174 175 // Path for includes. 176 $this->path = $path; 177 178 // Miscellaneous component parameters that need to be set early on. 179 if ( ! empty( $params ) ) { 180 // Sets the position for our menu under the WP Toolbar's "My Account" menu. 181 if ( ! empty( $params['adminbar_myaccount_order'] ) ) { 182 $this->adminbar_myaccount_order = (int) $params['adminbar_myaccount_order']; 183 } 184 185 // Register features. 186 if ( ! empty( $params['features'] ) ) { 187 $this->features = array_map( 'sanitize_title', (array) $params['features'] ); 188 } 189 190 if ( ! empty( $params['search_query_arg'] ) ) { 191 $this->search_query_arg = sanitize_title( $params['search_query_arg'] ); 192 } 193 194 // Set defaults if not passed. 195 } else { 196 // New component menus are added before the settings menu if not set. 197 $this->adminbar_myaccount_order = 90; 198 } 199 200 // Move on to the next step. 201 $this->setup_actions(); 202 } 203 204 /** 205 * Set up component global variables. 206 * 207 * @since 1.5.0 208 * 209 * @uses apply_filters() Calls 'bp_{@link bp_Component::name}_id'. 210 * @uses apply_filters() Calls 'bp_{@link bp_Component::name}_slug'. 211 * 212 * @param array $args { 213 * All values are optional. 214 * @type string $slug The component slug. Used to construct certain URLs, such as 'friends' in 215 * http://example.com/members/joe/friends/. Default: the value of $this->id. 216 * @type string $root_slug The component root slug. Note that this value is generally unused if the 217 * component has a root directory (the slug will be overridden by the 218 * post_name of the directory page). Default: the slug of the directory page 219 * if one is found, otherwise an empty string. 220 * @type bool $has_directory Set to true if the component requires an associated WordPress page. 221 * @type callable $notification_callback Optional. The callable function that formats the component's notifications. 222 * @type string $search_term Optional. The placeholder text in the component directory search box. Eg, 223 * 'Search Groups...'. 224 * @type array $global_tables Optional. An array of database table names. 225 * @type array $meta_tables Optional. An array of metadata table names. 226 * } 227 */ 228 public function setup_globals( $args = array() ) { 229 230 /** Slugs ************************************************************ 231 */ 232 233 // If a WP directory page exists for the component, it should 234 // be the default value of 'root_slug'. 235 $default_root_slug = isset( buddypress()->pages->{$this->id}->slug ) ? buddypress()->pages->{$this->id}->slug : ''; 236 237 $r = wp_parse_args( $args, array( 238 'slug' => $this->id, 239 'root_slug' => $default_root_slug, 240 'has_directory' => false, 241 'directory_title' => '', 242 'notification_callback' => '', 243 'search_string' => '', 244 'global_tables' => '', 245 'meta_tables' => '', 246 ) ); 247 248 /** 249 * Filters the slug to be used for the permalink URI chunk after root. 250 * 251 * @since 1.5.0 252 * 253 * @param string $value Slug to use in permalink URI chunk. 254 */ 255 $this->slug = apply_filters( 'bp_' . $this->id . '_slug', $r['slug'] ); 256 257 /** 258 * Filters the slug used for root directory. 259 * 260 * @since 1.5.0 261 * 262 * @param string $value Root directory slug. 263 */ 264 $this->root_slug = apply_filters( 'bp_' . $this->id . '_root_slug', $r['root_slug'] ); 265 266 /** 267 * Filters the component's top-level directory if available. 268 * 269 * @since 1.5.0 270 * 271 * @param bool $value Whether or not there is a top-level directory. 272 */ 273 $this->has_directory = apply_filters( 'bp_' . $this->id . '_has_directory', $r['has_directory'] ); 274 275 /** 276 * Filters the component's directory title. 277 * 278 * @since 2.0.0 279 * 280 * @param string $value Title to use for the directory. 281 */ 282 $this->directory_title = apply_filters( 'bp_' . $this->id . '_directory_title', $r['directory_title'] ); 283 284 /** 285 * Filters the placeholder text for search inputs for component. 286 * 287 * @since 1.5.0 288 * 289 * @param string $value Name to use in search input placeholders. 290 */ 291 $this->search_string = apply_filters( 'bp_' . $this->id . '_search_string', $r['search_string'] ); 292 293 /** 294 * Filters the callable function that formats the component's notifications. 295 * 296 * @since 1.5.0 297 * 298 * @param string $value Function callback. 299 */ 300 $this->notification_callback = apply_filters( 'bp_' . $this->id . '_notification_callback', $r['notification_callback'] ); 301 302 // Set the global table names, if applicable. 303 if ( ! empty( $r['global_tables'] ) ) { 304 $this->register_global_tables( $r['global_tables'] ); 305 } 306 307 // Set the metadata table, if applicable. 308 if ( ! empty( $r['meta_tables'] ) ) { 309 $this->register_meta_tables( $r['meta_tables'] ); 310 } 311 312 /** BuddyPress ******************************************************* 313 */ 314 315 // Register this component in the loaded components array. 316 buddypress()->loaded_components[$this->slug] = $this->id; 317 318 /** 319 * Fires at the end of the setup_globals method inside BP_Component. 320 * 321 * This is a dynamic hook that is based on the component string ID. 322 * 323 * @since 1.5.0 324 */ 325 do_action( 'bp_' . $this->id . '_setup_globals' ); 326 } 327 328 /** 329 * Include required files. 330 * 331 * Please note that, by default, this method is fired on the bp_include 332 * hook, with priority 8. This is necessary so that core components are 333 * loaded in time to be available to third-party plugins. However, this 334 * load order means that third-party plugins whose main files are 335 * loaded at bp_include with priority 10 (as recommended), will not be 336 * loaded in time for their includes() method to fire automatically. 337 * 338 * For this reason, it is recommended that your plugin has its own 339 * method or function for requiring necessary files. If you must use 340 * this method, you will have to call it manually in your constructor 341 * class, ie 342 * $this->includes(); 343 * 344 * Note that when you pass an array value like 'actions' to includes, 345 * it looks for the following three files (assuming your component is 346 * called 'my_component'): 347 * - ./actions 348 * - ./bp-my_component/actions 349 * - ./bp-my_component/bp-my_component-actions.php 350 * 351 * @since 1.5.0 352 * 353 * @uses do_action() Calls 'bp_{@link bp_Component::name}includes'. 354 * 355 * @param array $includes An array of file names, or file name chunks, 356 * to be parsed and then included. 357 */ 358 public function includes( $includes = array() ) { 359 360 // Bail if no files to include. 361 if ( ! empty( $includes ) ) { 362 $slashed_path = trailingslashit( $this->path ); 363 364 // Loop through files to be included. 365 foreach ( (array) $includes as $file ) { 366 367 $paths = array( 368 369 // Passed with no extension. 370 'bp-' . $this->id . '/bp-' . $this->id . '-' . $file . '.php', 371 'bp-' . $this->id . '-' . $file . '.php', 372 'bp-' . $this->id . '/' . $file . '.php', 373 374 // Passed with extension. 375 $file, 376 'bp-' . $this->id . '-' . $file, 377 'bp-' . $this->id . '/' . $file, 378 ); 379 380 foreach ( $paths as $path ) { 381 if ( @is_file( $slashed_path . $path ) ) { 382 require( $slashed_path . $path ); 383 break; 384 } 385 } 386 } 387 } 388 389 /** 390 * Fires at the end of the includes method inside BP_Component. 391 * 392 * This is a dynamic hook that is based on the component string ID. 393 * 394 * @since 1.5.0 395 */ 396 do_action( 'bp_' . $this->id . '_includes' ); 397 } 398 399 /** 400 * Set up the actions. 401 * 402 * @since 1.5.0 403 * 404 * @uses add_action() To add various actions. 405 * @uses do_action() Calls 'bp_{@link BP_Component::name}setup_actions'. 406 */ 407 public function setup_actions() { 408 409 // Setup globals. 410 add_action( 'bp_setup_globals', array( $this, 'setup_globals' ), 10 ); 411 412 // Set up canonical stack. 413 add_action( 'bp_setup_canonical_stack', array( $this, 'setup_canonical_stack' ), 10 ); 414 415 // Include required files. Called early to ensure that BP core 416 // components are loaded before plugins that hook their loader functions 417 // to bp_include with the default priority of 10. This is for backwards 418 // compatibility; henceforth, plugins should register themselves by 419 // extending this base class. 420 add_action( 'bp_include', array( $this, 'includes' ), 8 ); 421 422 // Setup navigation. 423 add_action( 'bp_setup_nav', array( $this, 'setup_nav' ), 10 ); 424 425 // Setup WP Toolbar menus. 426 add_action( 'bp_setup_admin_bar', array( $this, 'setup_admin_bar' ), $this->adminbar_myaccount_order ); 427 428 // Setup component title. 429 add_action( 'bp_setup_title', array( $this, 'setup_title' ), 10 ); 430 431 // Setup cache groups. 432 add_action( 'bp_setup_cache_groups', array( $this, 'setup_cache_groups' ), 10 ); 433 434 // Register post types. 435 add_action( 'bp_register_post_types', array( $this, 'register_post_types' ), 10 ); 436 437 // Register taxonomies. 438 add_action( 'bp_register_taxonomies', array( $this, 'register_taxonomies' ), 10 ); 439 440 // Add the rewrite tags. 441 add_action( 'bp_add_rewrite_tags', array( $this, 'add_rewrite_tags' ), 10 ); 442 443 // Add the rewrite rules. 444 add_action( 'bp_add_rewrite_rules', array( $this, 'add_rewrite_rules' ), 10 ); 445 446 // Add the permalink structure. 447 add_action( 'bp_add_permastructs', array( $this, 'add_permastructs' ), 10 ); 448 449 // Allow components to parse the main query. 450 add_action( 'bp_parse_query', array( $this, 'parse_query' ), 10 ); 451 452 // Generate rewrite rules. 453 add_action( 'bp_generate_rewrite_rules', array( $this, 'generate_rewrite_rules' ), 10 ); 454 455 /** 456 * Fires at the end of the setup_actions method inside BP_Component. 457 * 458 * This is a dynamic hook that is based on the component string ID. 459 * 460 * @since 1.5.0 461 */ 462 do_action( 'bp_' . $this->id . '_setup_actions' ); 463 } 464 465 /** 466 * Set up the canonical URL stack for this component. 467 * 468 * @since 2.1.0 469 */ 470 public function setup_canonical_stack() {} 471 472 /** 473 * Set up component navigation. 474 * 475 * @since 1.5.0 476 * 477 * @see bp_core_new_nav_item() For a description of the $main_nav 478 * parameter formatting. 479 * @see bp_core_new_subnav_item() For a description of how each item 480 * in the $sub_nav parameter array should be formatted. 481 * 482 * @param array $main_nav Optional. Passed directly to bp_core_new_nav_item(). 483 * See that function for a description. 484 * @param array $sub_nav Optional. Multidimensional array, each item in 485 * which is passed to bp_core_new_subnav_item(). See that 486 * function for a description. 487 */ 488 public function setup_nav( $main_nav = array(), $sub_nav = array() ) { 489 490 // No sub nav items without a main nav item. 491 if ( !empty( $main_nav ) ) { 492 bp_core_new_nav_item( $main_nav ); 493 494 // Sub nav items are not required. 495 if ( !empty( $sub_nav ) ) { 496 foreach( (array) $sub_nav as $nav ) { 497 bp_core_new_subnav_item( $nav ); 498 } 499 } 500 } 501 502 /** 503 * Fires at the end of the setup_nav method inside BP_Component. 504 * 505 * This is a dynamic hook that is based on the component string ID. 506 * 507 * @since 1.5.0 508 */ 509 do_action( 'bp_' . $this->id . '_setup_nav' ); 510 } 511 512 /** 513 * Set up the component entries in the WordPress Admin Bar. 514 * 515 * @since 1.5.0 516 * 517 * @see WP_Admin_Bar::add_menu() for a description of the syntax 518 * required by each item in the $wp_admin_nav parameter array. 519 * @global object $wp_admin_bar 520 * 521 * @param array $wp_admin_nav An array of nav item arguments. Each item in this parameter 522 * array is passed to {@link WP_Admin_Bar::add_menu()}. 523 * See that method for a description of the required syntax for 524 * each item. 525 */ 526 public function setup_admin_bar( $wp_admin_nav = array() ) { 527 528 // Bail if this is an ajax request. 529 if ( defined( 'DOING_AJAX' ) ) { 530 return; 531 } 532 533 // Do not proceed if BP_USE_WP_ADMIN_BAR constant is not set or is false. 534 if ( ! bp_use_wp_admin_bar() ) { 535 return; 536 } 537 538 /** 539 * Filters the admin navigation passed into setup_admin_bar. 540 * 541 * This is a dynamic hook that is based on the component string ID. 542 * 543 * @since 1.9.0 544 * 545 * @param array $wp_admin_nav Array of navigation items to add. 546 */ 547 $wp_admin_nav = apply_filters( 'bp_' . $this->id . '_admin_nav', $wp_admin_nav ); 548 549 // Do we have Toolbar menus to add? 550 if ( !empty( $wp_admin_nav ) ) { 551 552 // Set this objects menus. 553 $this->admin_menu = $wp_admin_nav; 554 555 // Define the WordPress global. 556 global $wp_admin_bar; 557 558 // Add each admin menu. 559 foreach( $this->admin_menu as $admin_menu ) { 560 $wp_admin_bar->add_menu( $admin_menu ); 561 } 562 } 563 564 /** 565 * Fires at the end of the setup_admin_bar method inside BP_Component. 566 * 567 * This is a dynamic hook that is based on the component string ID. 568 * 569 * @since 1.5.0 570 */ 571 do_action( 'bp_' . $this->id . '_setup_admin_bar' ); 572 } 573 574 /** 575 * Set up the component title. 576 * 577 * @since 1.5.0 578 * 579 * @uses do_action() Calls 'bp_{@link bp_Component::name}_setup_title'. 580 */ 581 public function setup_title() { 582 583 /** 584 * Fires in the setup_title method inside BP_Component. 585 * 586 * This is a dynamic hook that is based on the component string ID. 587 * 588 * @since 1.5.0 589 */ 590 do_action( 'bp_' . $this->id . '_setup_title' ); 591 } 592 593 /** 594 * Setup component-specific cache groups. 595 * 596 * @since 2.2.0 597 * 598 * @uses do_action() Calls 'bp_setup_{@link bp_Component::name}_cache_groups'. 599 */ 600 public function setup_cache_groups() { 601 602 /** 603 * Fires in the setup_cache_groups method inside BP_Component. 604 * 605 * This is a dynamic hook that is based on the component string ID. 606 * 607 * @since 2.2.0 608 */ 609 do_action( 'bp_' . $this->id . '_setup_cache_groups' ); 610 } 611 612 /** 613 * Register global tables for the component, so that it may use WordPress's database API. 614 * 615 * @since 2.0.0 616 * 617 * @param array $tables Table names to register. 618 */ 619 public function register_global_tables( $tables = array() ) { 620 621 /** 622 * Filters the global tables for the component, so that it may use WordPress' database API. 623 * 624 * This is a dynamic hook that is based on the component string ID. 625 * It allows for component-specific filtering of table names. To filter 626 * *all* tables, use the 'bp_core_get_table_prefix' filter instead. 627 * 628 * @since 1.6.0 629 */ 630 $tables = apply_filters( 'bp_' . $this->id . '_global_tables', $tables ); 631 632 // Add to the BuddyPress global object. 633 if ( !empty( $tables ) && is_array( $tables ) ) { 634 foreach ( $tables as $global_name => $table_name ) { 635 $this->$global_name = $table_name; 636 } 637 638 // Keep a record of the metadata tables in the component. 639 $this->global_tables = $tables; 640 } 641 642 /** 643 * Fires at the end of the register_global_tables method inside BP_Component. 644 * 645 * This is a dynamic hook that is based on the component string ID. 646 * 647 * @since 2.0.0 648 */ 649 do_action( 'bp_' . $this->id . '_register_global_tables' ); 650 } 651 652 /** 653 * Register component metadata tables. 654 * 655 * Metadata tables are registered in the $wpdb global, for 656 * compatibility with the WordPress metadata API. 657 * 658 * @since 2.0.0 659 * 660 * @param array $tables Table names to register. 661 */ 662 public function register_meta_tables( $tables = array() ) { 663 global $wpdb; 664 665 /** 666 * Filters the global meta_tables for the component. 667 * 668 * This is a dynamic hook that is based on the component string ID. 669 * It allows for component-specific filtering of table names. To filter 670 * *all* tables, use the 'bp_core_get_table_prefix' filter instead. 671 * 672 * @since 2.0.0 673 */ 674 $tables = apply_filters( 'bp_' . $this->id . '_meta_tables', $tables ); 675 676 /** 677 * Add the name of each metadata table to WPDB to allow BuddyPress 678 * components to play nicely with the WordPress metadata API. 679 */ 680 if ( !empty( $tables ) && is_array( $tables ) ) { 681 foreach( $tables as $meta_prefix => $table_name ) { 682 $wpdb->{$meta_prefix . 'meta'} = $table_name; 683 } 684 685 // Keep a record of the metadata tables in the component. 686 $this->meta_tables = $tables; 687 } 688 689 /** 690 * Fires at the end of the register_meta_tables method inside BP_Component. 691 * 692 * This is a dynamic hook that is based on the component string ID. 693 * 694 * @since 2.0.0 695 */ 696 do_action( 'bp_' . $this->id . '_register_meta_tables' ); 697 } 698 699 /** 700 * Set up the component post types. 701 * 702 * @since 1.5.0 703 * 704 * @uses do_action() Calls 'bp_{@link bp_Component::name}_register_post_types'. 705 */ 706 public function register_post_types() { 707 708 /** 709 * Fires in the register_post_types method inside BP_Component. 710 * 711 * This is a dynamic hook that is based on the component string ID. 712 * 713 * @since 1.5.0 714 */ 715 do_action( 'bp_' . $this->id . '_register_post_types' ); 716 } 717 718 /** 719 * Register component-specific taxonomies. 720 * 721 * @since 1.5.0 722 * 723 * @uses do_action() Calls 'bp_{@link bp_Component::name}_register_taxonomies'. 724 */ 725 public function register_taxonomies() { 726 727 /** 728 * Fires in the register_taxonomies method inside BP_Component. 729 * 730 * This is a dynamic hook that is based on the component string ID. 731 * 732 * @since 1.5.0 733 */ 734 do_action( 'bp_' . $this->id . '_register_taxonomies' ); 735 } 736 737 /** 738 * Add any additional rewrite tags. 739 * 740 * @since 1.5.0 741 * 742 * @uses do_action() Calls 'bp_{@link bp_Component::name}_add_rewrite_tags'. 743 */ 744 public function add_rewrite_tags() { 745 746 /** 747 * Fires in the add_rewrite_tags method inside BP_Component. 748 * 749 * This is a dynamic hook that is based on the component string ID. 750 * 751 * @since 1.5.0 752 */ 753 do_action( 'bp_' . $this->id . '_add_rewrite_tags' ); 754 } 755 756 /** 757 * Add any additional rewrite rules. 758 * 759 * @since 1.9.0 760 * 761 * @uses do_action() Calls 'bp_{@link bp_Component::name}_add_rewrite_rules'. 762 */ 763 public function add_rewrite_rules() { 764 765 /** 766 * Fires in the add_rewrite_rules method inside BP_Component. 767 * 768 * This is a dynamic hook that is based on the component string ID. 769 * 770 * @since 1.9.0 771 */ 772 do_action( 'bp_' . $this->id . '_add_rewrite_rules' ); 773 } 774 775 /** 776 * Add any permalink structures. 777 * 778 * @since 1.9.0 779 * 780 * @uses do_action() Calls 'bp_{@link bp_Component::name}_add_permastruct'. 781 */ 782 public function add_permastructs() { 783 784 /** 785 * Fires in the add_permastructs method inside BP_Component. 786 * 787 * This is a dynamic hook that is based on the component string ID. 788 * 789 * @since 1.9.0 790 */ 791 do_action( 'bp_' . $this->id . '_add_permastructs' ); 792 } 793 794 /** 795 * Allow components to parse the main query. 796 * 797 * @since 1.9.0 798 * 799 * @uses do_action() Calls 'bp_{@link bp_Component::name}_parse_query'. 800 * 801 * @param object $query The main WP_Query. 802 */ 803 public function parse_query( $query ) { 804 805 /** 806 * Fires in the parse_query method inside BP_Component. 807 * 808 * This is a dynamic hook that is based on the component string ID. 809 * 810 * @since 1.9.0 811 * 812 * @param object $query Main WP_Query object. Passed by reference. 813 */ 814 do_action_ref_array( 'bp_' . $this->id . '_parse_query', array( &$query ) ); 815 } 816 817 /** 818 * Generate any additional rewrite rules. 819 * 820 * @since 1.5.0 821 * 822 * @uses do_action() Calls 'bp_{@link bp_Component::name}_generate_rewrite_rules'. 823 */ 824 public function generate_rewrite_rules() { 825 826 /** 827 * Fires in the generate_rewrite_rules method inside BP_Component. 828 * 829 * This is a dynamic hook that is based on the component string ID. 830 * 831 * @since 1.5.0 832 */ 833 do_action( 'bp_' . $this->id . '_generate_rewrite_rules' ); 834 } 835 } 836 endif; // BP_Component. 13 require dirname( __FILE__ ) . '/classes/class-bp-core-component.php';
Note: See TracChangeset
for help on using the changeset viewer.