WordPress.org

Make WordPress Core

Ticket #13691: get_template_part.5.diff

File get_template_part.5.diff, 6.3 KB (added by wjm, 9 years ago)

This removes the need to add an action

  • 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
     
    10385 * specialised part will be included. If the theme contains no {slug}.php file
    10486 * then no template will be included.
    10587 *
    106  * The template is included using require, not require_once, so you may include the
    107  * same template part multiple times.
    108  *
    10988 * For the parameter, if the file is called "{slug}-special.php" then specify
    11089 * "special".
    11190 *
    11291 * @uses locate_template()
    11392 * @since 3.0.0
    114  * @uses do_action() Calls 'get_template_part{$slug}' action.
     93 * @uses do_action() Calls 'get_template_part_{$slug}' action.
    11594 *
    11695 * @param string $slug The slug name for the generic template.
    117  * @param string $name The name of the specialised template.
     96 * @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.).
     97 * @param bool $require_once Where to require the template file once. Default is false.
     98 * @return string The template filename if one is located.
    11899 */
    119 function get_template_part( $slug, $name = null ) {
    120         do_action( "get_template_part_{$slug}", $slug, $name );
    121 
     100function get_template_part( $slug, $names = array(), $require_once = false ) {
     101        do_action( "get_template_part_{$slug}", $slug, $names );
     102       
    122103        $templates = array();
    123         if ( isset($name) )
     104        foreach ( (array)$names as $name ) {
    124105                $templates[] = "{$slug}-{$name}.php";
    125 
     106        }
    126107        $templates[] = "{$slug}.php";
    127108
    128         locate_template($templates, true, false);
     109        return locate_template($templates, true, $require_once);
    129110}
    130111
    131112/**
  • 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                }
     
    10651065}
    10661066
    10671067/**
     1068 * Stores template files in the cache in global $wp_templates;
     1069 *
     1070 * @param string $dir Directory location to scan.
     1071 * @return bool
     1072 */
     1073function wp_cache_templates( $dir ) {
     1074        global $wp_templates;
     1075        if ( $handle = opendir( $dir ) ) {
     1076                $wp_templates[$dir] = 'dir';
     1077                while ( false !== ($file = readdir( $handle )) ) {
     1078                        if ( is_file( $dir.'/'.$file ) && $file != '.' && $file != '..' )
     1079                                $wp_templates[$dir.'/'.$file] = true;
     1080                }
     1081                closedir( $handle );
     1082                return true;
     1083        }
     1084        return false;
     1085}
     1086
     1087/**
     1088 * Checks in the cache if a template file exists locally.
     1089 *
     1090 * @param string $dir Directory location (template path).
     1091 * @param string $file Relative template file location.
     1092 * @return bool
     1093 */
     1094function template_exists( $dir, $file ) {
     1095        if ( '' == $file || '' == $dir )
     1096                return false;
     1097       
     1098        global $wp_templates;
     1099        $path = $dir.'/'.$file;
     1100       
     1101        if ( empty( $wp_templates ) ) {
     1102                wp_cache_templates( STYLESHEETPATH );
     1103                if ( TEMPLATEPATH != STYLESHEETPATH )
     1104                        wp_cache_templates( TEMPLATEPATH );
     1105        }
     1106       
     1107        if ( isset( $wp_templates[$path] ) )
     1108                return true;
     1109
     1110        //if its a file in a subdirectory, cache that dir
     1111        if ( false !== strpos( $file, '/' ) || false !== strpos( $file, '\\' ) ) {
     1112                $dir = dirname( $path );
     1113                if ( !isset( $wp_templates[$dir] ) )
     1114                        wp_cache_templates( $dir );
     1115        }
     1116        return isset( $wp_templates[$path] );
     1117}
     1118
     1119/**
    10681120 * Require the template file with WordPress environment.
    10691121 *
    10701122 * The globals are set up for the template file to ensure that the WordPress