WordPress.org

Make WordPress Core

Ticket #22355: 22355.2.patch

File 22355.2.patch, 4.0 KB (added by johnjamesjacoby, 6 years ago)

Reverse lookup (name to stack) and break out of both loops

  • wp-includes/template.php

     
    364364 * @return string The template filename if one is located.
    365365 */
    366366function locate_template($template_names, $load = false, $require_once = true ) {
    367         $located = '';
     367        $located        = '';
     368        $template_stack = get_template_stack();
     369
    368370        foreach ( (array) $template_names as $template_name ) {
    369                 if ( !$template_name )
     371
     372                // Continue if $template_name is empty
     373                if ( empty( $template_name ) )
    370374                        continue;
    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                        }
    377388                }
    378389        }
    379390
     
    407418                require( $_template_file );
    408419}
    409420
     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 */
     436function 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 */
     461function 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}
  • wp-settings.php

     
    268268// Define the template related constants.
    269269wp_templating_constants(  );
    270270
     271// Register the parent/child template stack
     272register_template_stack( 'get_stylesheet_directory', 10 );
     273register_template_stack( 'get_template_directory',   12 );
     274
    271275// Load the default text localization domain.
    272276load_default_textdomain();
    273277