WordPress.org

Make WordPress Core

Ticket #13691: get_template_part.4.diff

File get_template_part.4.diff, 6.0 KB (added by wjm, 5 years ago)

Cache system + require_once

  • general-template.php

     
    1919 * @since 1.5.0 
    2020 * @uses do_action() Calls 'get_header' action. 
    2121 * 
    22  * @param string $name The name of the specialised header. 
     22 * @param mixed $names The names of the specialised header templates (it can be a string, or an array of names to search for in priority order.). 
    2323 */ 
    24 function get_header( $name = null ) { 
    25         do_action( 'get_header', $name ); 
     24function get_header( $names = array() ) { 
     25        do_action( 'get_header', $names ); 
    2626 
    27         $templates = array(); 
    28         if ( isset($name) ) 
    29                 $templates[] = "header-{$name}.php"; 
    30  
    31         $templates[] = "header.php"; 
    32  
    3327        // Backward compat code will be removed in a future release 
    34         if ('' == locate_template($templates, true)) 
     28        if ('' == get_template_part( 'header', $names, true ) ) 
    3529                load_template( WPINC . '/theme-compat/header.php'); 
    3630} 
    3731 
     
    4842 * @since 1.5.0 
    4943 * @uses do_action() Calls 'get_footer' action. 
    5044 * 
    51  * @param string $name The name of the specialised footer. 
     45 * @param mixed $names The names of the specialised footer templates (it can be a string, or an array of names to search for in priority order.). 
    5246 */ 
    53 function get_footer( $name = null ) { 
    54         do_action( 'get_footer', $name ); 
     47function get_footer( $names = null ) { 
     48        do_action( 'get_footer', $names ); 
    5549 
    56         $templates = array(); 
    57         if ( isset($name) ) 
    58                 $templates[] = "footer-{$name}.php"; 
    59  
    60         $templates[] = "footer.php"; 
    61  
    6250        // Backward compat code will be removed in a future release 
    63         if ('' == locate_template($templates, true)) 
     51        if ('' == get_template_part( 'footer', $names, true ) ) 
    6452                load_template( WPINC . '/theme-compat/footer.php'); 
    6553} 
    6654 
     
    7765 * @since 1.5.0 
    7866 * @uses do_action() Calls 'get_sidebar' action. 
    7967 * 
    80  * @param string $name The name of the specialised sidebar. 
     68 * @param mixed $names The names of the specialised sidebar templates (it can be a string, or an array of names to search for in priority order.).  
    8169 */ 
    82 function get_sidebar( $name = null ) { 
    83         do_action( 'get_sidebar', $name ); 
     70function get_sidebar( $names = array() ) { 
     71        do_action( 'get_sidebar', $names ); 
    8472 
    85         $templates = array(); 
    86         if ( isset($name) ) 
    87                 $templates[] = "sidebar-{$name}.php"; 
    88  
    89         $templates[] = "sidebar.php"; 
    90  
    9173        // Backward compat code will be removed in a future release 
    92         if ('' == locate_template($templates, true)) 
     74        if ('' == get_template_part( 'sidebar', $names ) ) 
    9375                load_template( WPINC . '/theme-compat/sidebar.php'); 
    9476} 
    9577 
     
    11193 * 
    11294 * @uses locate_template() 
    11395 * @since 3.0.0 
    114  * @uses do_action() Calls 'get_template_part{$slug}' action. 
     96 * @uses do_action() Calls 'get_template_part_{$slug}' action. 
    11597 * 
    11698 * @param string $slug The slug name for the generic template. 
    117  * @param string $name The name of the specialised template. 
     99 * @param mixed $names The names of the specialised templates (it can be a string, or an array of names to search for in priority order.). 
    118100 */ 
    119 function get_template_part( $slug, $name = null ) { 
    120         do_action( "get_template_part_{$slug}", $slug, $name ); 
    121  
     101function get_template_part( $slug, $names = array(), $require_once = false ) { 
     102        do_action( "get_template_part_{$slug}", $slug, $names ); 
     103         
    122104        $templates = array(); 
    123         if ( isset($name) ) 
     105        foreach ( (array)$names as $name ) { 
    124106                $templates[] = "{$slug}-{$name}.php"; 
    125  
     107        } 
    126108        $templates[] = "{$slug}.php"; 
    127109 
    128         locate_template($templates, true, false); 
     110        return locate_template($templates, true, $require_once); 
    129111} 
    130112 
    131113/** 
  • theme.php

     
    10441044function locate_template($template_names, $load = false, $require_once = true ) { 
    10451045        if ( !is_array($template_names) ) 
    10461046                return ''; 
    1047  
     1047         
    10481048        $located = ''; 
    10491049        foreach ( $template_names as $template_name ) { 
    10501050                if ( !$template_name ) 
    10511051                        continue; 
    1052                 if ( file_exists(STYLESHEETPATH . '/' . $template_name)) { 
     1052                if ( template_exists( STYLESHEETPATH, $template_name ) ) { 
    10531053                        $located = STYLESHEETPATH . '/' . $template_name; 
    10541054                        break; 
    1055                 } else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) { 
     1055                } else if ( TEMPLATEPATH != STYLESHEETPATH && template_exists( TEMPLATEPATH, $template_name ) ) { 
    10561056                        $located = TEMPLATEPATH . '/' . $template_name; 
    10571057                        break; 
    10581058                } 
     
    10641064        return $located; 
    10651065} 
    10661066 
     1067// Cache the parent and child theme's template paths 
     1068add_action( 'init', 'wp_cache_template_paths', 1 ); 
     1069function wp_cache_template_paths() { 
     1070        foreach ( array( STYLESHEETPATH, TEMPLATEPATH ) as $dir ) 
     1071                wp_cache_templates( $dir ); 
     1072        global $wp_templates; 
     1073} 
     1074 
    10671075/** 
     1076 * Stores template files in the cache in global $wp_templates; 
     1077 * 
     1078 * @param string $dir Directory location to scan. 
     1079 * @return bool 
     1080 */ 
     1081function wp_cache_templates( $dir ) { 
     1082        global $wp_templates; 
     1083        if ( $handle = opendir( $dir ) ) { 
     1084                $wp_templates[$dir] = 'dir'; 
     1085                while ( false !== ($file = readdir( $handle )) ) { 
     1086                        if ( is_file( $dir.'/'.$file ) && $file != '.' && $file != '..' ) 
     1087                                $wp_templates[$dir.'/'.$file] = true; 
     1088                } 
     1089                closedir( $handle ); 
     1090                return true; 
     1091        } 
     1092        return false; 
     1093} 
     1094 
     1095/** 
     1096 * Checks in the cache if a template file exists locally. 
     1097 * 
     1098 * @param string $dir Directory location (template path). 
     1099 * @param string $file Relative template file location. 
     1100 * @return bool 
     1101 */ 
     1102function template_exists( $dir, $file ) { 
     1103        if ( '' == $file || '' == $dir ) 
     1104                return false; 
     1105         
     1106        global $wp_templates; 
     1107        $path = $dir.'/'.$file; 
     1108         
     1109        if ( isset( $wp_templates[$path] ) ) 
     1110                return true; 
     1111 
     1112        //if its a file in a subdirectory, scan that dir 
     1113        if ( false !== strpos( $file, '/' ) || false !== strpos( $file, '\\' ) ) { 
     1114                $dir = dirname( $path ); 
     1115                if ( !isset( $wp_templates[$dir] ) ) 
     1116                        wp_cache_templates( $dir ); 
     1117        } 
     1118        return isset( $wp_templates[$path] ); 
     1119} 
     1120 
     1121/** 
    10681122 * Require the template file with WordPress environment. 
    10691123 * 
    10701124 * The globals are set up for the template file to ensure that the WordPress