| 371 | | if ( file_exists(STYLESHEETPATH . '/' . $template_name)) { |
| 372 | | $located = STYLESHEETPATH . '/' . $template_name; |
| 373 | | break; |
| 374 | | } else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) { |
| 375 | | $located = TEMPLATEPATH . '/' . $template_name; |
| 376 | | break; |
| | 375 | |
| | 376 | $template_name = ltrim( $template_name, '/' ); |
| | 377 | |
| | 378 | foreach ( (array) $template_stack as $template_location ) { |
| | 379 | |
| | 380 | // Continue if $template_location is empty |
| | 381 | if ( empty( $template_location ) ) |
| | 382 | continue; |
| | 383 | |
| | 384 | if ( file_exists( trailingslashit( $template_location ) . $template_name ) ) { |
| | 385 | $located = trailingslashit( $template_location ) . $template_name; |
| | 386 | break 2; |
| | 387 | } |
| | 421 | |
| | 422 | /** |
| | 423 | * This function registers a new template stack location, using WordPress's |
| | 424 | * built-in filters API. |
| | 425 | * |
| | 426 | * This allows for templates to live in places beyond just the parent/child |
| | 427 | * relationship, to allow for custom template locations. Used in conjunction |
| | 428 | * with locate_template(), this allows for easy template overrides. |
| | 429 | * |
| | 430 | * @package WordPress |
| | 431 | * @since 3.6 |
| | 432 | * |
| | 433 | * @param string $location Callback function that returns the |
| | 434 | * @param int $priority |
| | 435 | */ |
| | 436 | function register_template_stack( $location_callback = '', $priority = 10 ) { |
| | 437 | |
| | 438 | // Bail if no location, or function does not exist |
| | 439 | if ( empty( $location_callback ) || ! function_exists( $location_callback ) ) |
| | 440 | return false; |
| | 441 | |
| | 442 | // Add location callback to template stack |
| | 443 | add_filter( 'template_stack', $location_callback, (int) $priority ); |
| | 444 | } |
| | 445 | |
| | 446 | /** |
| | 447 | * Call the functions added to the 'template_stack' filter hook, and return |
| | 448 | * an array of the template locations. |
| | 449 | * |
| | 450 | * @see register_template_stack() |
| | 451 | * |
| | 452 | * @package WordPress |
| | 453 | * @since 3.6 |
| | 454 | * |
| | 455 | * @global array $wp_filter Stores all of the filters |
| | 456 | * @global array $merged_filters Merges the filter hooks using this function. |
| | 457 | * @global array $wp_current_filter stores the list of current filters with the current one last |
| | 458 | * |
| | 459 | * @return array The filtered value after all hooked functions are applied to it. |
| | 460 | */ |
| | 461 | function get_template_stack() { |
| | 462 | global $wp_filter, $merged_filters, $wp_current_filter; |
| | 463 | |
| | 464 | // Setup some default variables |
| | 465 | $tag = 'template_stack'; |
| | 466 | $args = $stack = array(); |
| | 467 | |
| | 468 | // Add 'template_stack' to the current filter array |
| | 469 | $wp_current_filter[] = $tag; |
| | 470 | |
| | 471 | // Sort |
| | 472 | if ( ! isset( $merged_filters[ $tag ] ) ) { |
| | 473 | ksort( $wp_filter[$tag] ); |
| | 474 | $merged_filters[ $tag ] = true; |
| | 475 | } |
| | 476 | |
| | 477 | // Ensure we're always at the beginning of the filter array |
| | 478 | reset( $wp_filter[ $tag ] ); |
| | 479 | |
| | 480 | // Loop through 'template_stack' filters, and call callback functions |
| | 481 | while ( next( $wp_filter[$tag] ) !== false ) { |
| | 482 | foreach( (array) current( $wp_filter[$tag] ) as $the_ ) { |
| | 483 | if ( ! is_null( $the_['function'] ) ) { |
| | 484 | $args[1] = $stack; |
| | 485 | $stack[] = call_user_func_array( $the_['function'], array_slice( $args, 1, (int) $the_['accepted_args'] ) ); |
| | 486 | } |
| | 487 | } |
| | 488 | }; |
| | 489 | |
| | 490 | // Remove 'template_stack' from the current filter array |
| | 491 | array_pop( $wp_current_filter ); |
| | 492 | |
| | 493 | // Remove empties and duplicates |
| | 494 | $stack = array_unique( array_filter( $stack ) ); |
| | 495 | |
| | 496 | return (array) apply_filters( 'get_template_stack', $stack ) ; |
| | 497 | } |