WordPress.org

Make WordPress Core

Ticket #22355: 22355.3.patch

File 22355.3.patch, 4.1 KB (added by meloniq, 6 years ago)

Patch according to @scribu and @chacha102 suggestions: uses separate global instead of filters api, pass path instead of callback, added 'remove' and 'has' functions

  • wp-includes/template.php

     
    367367 */
    368368function locate_template($template_names, $load = false, $require_once = true ) {
    369369        $located = '';
     370        $template_stack = get_template_stack();
     371
    370372        foreach ( (array) $template_names as $template_name ) {
    371                 if ( !$template_name )
     373                if ( empty( $template_name ) )
    372374                        continue;
    373                 if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
    374                         $located = STYLESHEETPATH . '/' . $template_name;
    375                         break;
    376                 } else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
    377                         $located = TEMPLATEPATH . '/' . $template_name;
    378                         break;
     375
     376                $template_name = ltrim( $template_name, '/' );
     377
     378                foreach ( (array) $template_stack as $template_location ) {
     379                        // Continue if $template_location is empty
     380                        if ( empty( $template_location ) )
     381                                continue;
     382
     383                        if ( file_exists( trailingslashit( $template_location ) . $template_name ) ) {
     384                                $located = trailingslashit( $template_location ) . $template_name;
     385                                break 2;
     386                        }
    379387                }
    380388        }
    381389
     
    409417                require( $_template_file );
    410418}
    411419
     420/**
     421 * This function adds a new template stack location.
     422 *
     423 * This allows for templates to live in places beyond just the parent/child
     424 * relationship, to allow for custom template locations. Used in conjunction
     425 * with locate_template(), this allows for easy template overrides.
     426 *
     427 * @since 3.6.0
     428 *
     429 * @param string $location Path to template files
     430 * @param int $priority
     431 *
     432 * @return bool True if added.
     433 */
     434function add_template_stack( $location, $priority = 10 ) {
     435        global $wp_template_stack;
     436
     437        $idx = md5( $location );
     438        $r = ! isset( $wp_template_stack[ $priority ][ $idx ] );
     439
     440        if ( $r === true )
     441                $wp_template_stack[ $priority ][ $idx ] = $location;
     442
     443        return $r;
     444}
     445
     446/**
     447 * This function removes a template stack location.
     448 *
     449 * @since 3.6.0
     450 *
     451 * @param string $location Path to template files
     452 * @param int $priority
     453 *
     454 * @return bool True if removed.
     455 */
     456function remove_template_stack( $location, $priority = 10 ) {
     457        global $wp_template_stack;
     458
     459        $idx = md5( $location );
     460        $r = isset( $wp_template_stack[ $priority ][ $idx ] );
     461
     462        if ( $r === true )
     463                unset( $wp_template_stack[ $priority ][ $idx ] );
     464
     465        return $r;
     466}
     467
     468/**
     469 * This function checks if a template stack location exists.
     470 *
     471 * @since 3.6.0
     472 *
     473 * @param string $location Path to template files
     474 *
     475 * @return bool True if found.
     476 */
     477function has_template_stack( $location ) {
     478        global $wp_template_stack;
     479
     480        $idx = md5( $location );
     481
     482        // Loop through template locations
     483        foreach ( (array) $wp_template_stack as $stacks ) {
     484                if ( array_key_exists( $idx, $stacks ) )
     485                        return true;
     486        }
     487
     488        return false;
     489}
     490
     491/**
     492 * Return an array of the template locations added to the $wp_template_stack.
     493 *
     494 * @since 3.6.0
     495 *
     496 * @return array Template locations.
     497 */
     498function get_template_stack() {
     499        global $wp_template_stack;
     500
     501        // Setup default variables
     502        $stack = array();
     503        if ( ! is_array( $wp_template_stack ) )
     504                $wp_template_stack = array();
     505
     506        // Sort
     507        ksort( $wp_template_stack );
     508
     509        // Ensure we're always at the beginning of the array
     510        reset( $wp_template_stack );
     511
     512        // Loop through template locations
     513        foreach ( $wp_template_stack as $stacks ) {
     514                foreach ( $stacks as $location )
     515                        $stack[] = $location;
     516        }
     517
     518        // Remove empties and duplicates
     519        $stack = array_unique( array_filter( $stack ) );
     520
     521        return (array) apply_filters( 'get_template_stack', $stack );
     522}
  • wp-settings.php

     
    266266// Define the template related constants.
    267267wp_templating_constants(  );
    268268
     269// Register the parent/child template stack
     270add_template_stack( get_stylesheet_directory(), 10 );
     271add_template_stack( get_template_directory(), 12 );
     272
    269273// Load the default text localization domain.
    270274load_default_textdomain();
    271275