WordPress.org

Make WordPress Core

Ticket #13691: get_template_part.4.diff

File get_template_part.4.diff, 6.0 KB (added by wjm, 8 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