wp/wp-includes/template.php
changeset 0 d970ebf37754
child 5 5e2f62d02dcd
equal deleted inserted replaced
-1:000000000000 0:d970ebf37754
       
     1 <?php
       
     2 /**
       
     3  * Template loading functions.
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Template
       
     7  */
       
     8 
       
     9 /**
       
    10  * Retrieve path to a template
       
    11  *
       
    12  * Used to quickly retrieve the path of a template without including the file
       
    13  * extension. It will also check the parent theme, if the file exists, with
       
    14  * the use of {@link locate_template()}. Allows for more generic template location
       
    15  * without the use of the other get_*_template() functions.
       
    16  *
       
    17  * @since 1.5.0
       
    18  *
       
    19  * @param string $type Filename without extension.
       
    20  * @param array $templates An optional list of template candidates
       
    21  * @return string Full path to file.
       
    22  */
       
    23 function get_query_template( $type, $templates = array() ) {
       
    24 	$type = preg_replace( '|[^a-z0-9-]+|', '', $type );
       
    25 
       
    26 	if ( empty( $templates ) )
       
    27 		$templates = array("{$type}.php");
       
    28 
       
    29 	$template = locate_template( $templates );
       
    30 	/**
       
    31 	 * Filter the path of the queried template by type.
       
    32 	 *
       
    33 	 * The dynamic portion of the hook name, $type, refers to the filename
       
    34 	 * -- minus the extension -- of the file to load. This hook also applies
       
    35 	 * to various types of files loaded as part of the Template Hierarchy.
       
    36 	 *
       
    37 	 * @since 1.5.2
       
    38 	 *
       
    39 	 * @param string $template Path to the template. @see locate_template()
       
    40 	 */
       
    41 	return apply_filters( "{$type}_template", $template );
       
    42 }
       
    43 
       
    44 /**
       
    45  * Retrieve path of index template in current or parent template.
       
    46  *
       
    47  * @since 3.0.0
       
    48  *
       
    49  * @return string
       
    50  */
       
    51 function get_index_template() {
       
    52 	return get_query_template('index');
       
    53 }
       
    54 
       
    55 /**
       
    56  * Retrieve path of 404 template in current or parent template.
       
    57  *
       
    58  * @since 1.5.0
       
    59  *
       
    60  * @return string
       
    61  */
       
    62 function get_404_template() {
       
    63 	return get_query_template('404');
       
    64 }
       
    65 
       
    66 /**
       
    67  * Retrieve path of archive template in current or parent template.
       
    68  *
       
    69  * @since 1.5.0
       
    70  *
       
    71  * @return string
       
    72  */
       
    73 function get_archive_template() {
       
    74 	$post_types = array_filter( (array) get_query_var( 'post_type' ) );
       
    75 
       
    76 	$templates = array();
       
    77 
       
    78 	if ( count( $post_types ) == 1 ) {
       
    79 		$post_type = reset( $post_types );
       
    80 		$templates[] = "archive-{$post_type}.php";
       
    81 	}
       
    82 	$templates[] = 'archive.php';
       
    83 
       
    84 	return get_query_template( 'archive', $templates );
       
    85 }
       
    86 
       
    87 /**
       
    88  * Retrieve path of post type archive template in current or parent template.
       
    89  *
       
    90  * @since 3.7.0
       
    91  *
       
    92  * @return string
       
    93  */
       
    94 function get_post_type_archive_template() {
       
    95 	$post_type = get_query_var( 'post_type' );
       
    96 	if ( is_array( $post_type ) )
       
    97 		$post_type = reset( $post_type );
       
    98 
       
    99 	$obj = get_post_type_object( $post_type );
       
   100 	if ( ! $obj->has_archive )
       
   101 		return '';
       
   102 
       
   103 	return get_archive_template();
       
   104 }
       
   105 
       
   106 /**
       
   107  * Retrieve path of author template in current or parent template.
       
   108  *
       
   109  * @since 1.5.0
       
   110  *
       
   111  * @return string
       
   112  */
       
   113 function get_author_template() {
       
   114 	$author = get_queried_object();
       
   115 
       
   116 	$templates = array();
       
   117 
       
   118 	if ( is_a( $author, 'WP_User' ) ) {
       
   119 		$templates[] = "author-{$author->user_nicename}.php";
       
   120 		$templates[] = "author-{$author->ID}.php";
       
   121 	}
       
   122 	$templates[] = 'author.php';
       
   123 
       
   124 	return get_query_template( 'author', $templates );
       
   125 }
       
   126 
       
   127 /**
       
   128  * Retrieve path of category template in current or parent template.
       
   129  *
       
   130  * Works by first retrieving the current slug, for example 'category-default.php', and then
       
   131  * trying category ID, for example 'category-1.php', and will finally fall back to category.php
       
   132  * template, if those files don't exist.
       
   133  *
       
   134  * @since 1.5.0
       
   135  * @uses apply_filters() Calls 'category_template' on file path of category template.
       
   136  *
       
   137  * @return string
       
   138  */
       
   139 function get_category_template() {
       
   140 	$category = get_queried_object();
       
   141 
       
   142 	$templates = array();
       
   143 
       
   144 	if ( ! empty( $category->slug ) ) {
       
   145 		$templates[] = "category-{$category->slug}.php";
       
   146 		$templates[] = "category-{$category->term_id}.php";
       
   147 	}
       
   148 	$templates[] = 'category.php';
       
   149 
       
   150 	return get_query_template( 'category', $templates );
       
   151 }
       
   152 
       
   153 /**
       
   154  * Retrieve path of tag template in current or parent template.
       
   155  *
       
   156  * Works by first retrieving the current tag name, for example 'tag-wordpress.php', and then
       
   157  * trying tag ID, for example 'tag-1.php', and will finally fall back to tag.php
       
   158  * template, if those files don't exist.
       
   159  *
       
   160  * @since 2.3.0
       
   161  * @uses apply_filters() Calls 'tag_template' on file path of tag template.
       
   162  *
       
   163  * @return string
       
   164  */
       
   165 function get_tag_template() {
       
   166 	$tag = get_queried_object();
       
   167 
       
   168 	$templates = array();
       
   169 
       
   170 	if ( ! empty( $tag->slug ) ) {
       
   171 		$templates[] = "tag-{$tag->slug}.php";
       
   172 		$templates[] = "tag-{$tag->term_id}.php";
       
   173 	}
       
   174 	$templates[] = 'tag.php';
       
   175 
       
   176 	return get_query_template( 'tag', $templates );
       
   177 }
       
   178 
       
   179 /**
       
   180  * Retrieve path of taxonomy template in current or parent template.
       
   181  *
       
   182  * Retrieves the taxonomy and term, if term is available. The template is
       
   183  * prepended with 'taxonomy-' and followed by both the taxonomy string and
       
   184  * the taxonomy string followed by a dash and then followed by the term.
       
   185  *
       
   186  * The taxonomy and term template is checked and used first, if it exists.
       
   187  * Second, just the taxonomy template is checked, and then finally, taxonomy.php
       
   188  * template is used. If none of the files exist, then it will fall back on to
       
   189  * index.php.
       
   190  *
       
   191  * @since 2.5.0
       
   192  * @uses apply_filters() Calls 'taxonomy_template' filter on found path.
       
   193  *
       
   194  * @return string
       
   195  */
       
   196 function get_taxonomy_template() {
       
   197 	$term = get_queried_object();
       
   198 
       
   199 	$templates = array();
       
   200 
       
   201 	if ( ! empty( $term->slug ) ) {
       
   202 		$taxonomy = $term->taxonomy;
       
   203 		$templates[] = "taxonomy-$taxonomy-{$term->slug}.php";
       
   204 		$templates[] = "taxonomy-$taxonomy.php";
       
   205 	}
       
   206 	$templates[] = 'taxonomy.php';
       
   207 
       
   208 	return get_query_template( 'taxonomy', $templates );
       
   209 }
       
   210 
       
   211 /**
       
   212  * Retrieve path of date template in current or parent template.
       
   213  *
       
   214  * @since 1.5.0
       
   215  *
       
   216  * @return string
       
   217  */
       
   218 function get_date_template() {
       
   219 	return get_query_template('date');
       
   220 }
       
   221 
       
   222 /**
       
   223  * Retrieve path of home template in current or parent template.
       
   224  *
       
   225  * This is the template used for the page containing the blog posts.
       
   226  *
       
   227  * Attempts to locate 'home.php' first before falling back to 'index.php'.
       
   228  *
       
   229  * @since 1.5.0
       
   230  * @uses apply_filters() Calls 'home_template' on file path of home template.
       
   231  *
       
   232  * @return string
       
   233  */
       
   234 function get_home_template() {
       
   235 	$templates = array( 'home.php', 'index.php' );
       
   236 
       
   237 	return get_query_template( 'home', $templates );
       
   238 }
       
   239 
       
   240 /**
       
   241  * Retrieve path of front-page template in current or parent template.
       
   242  *
       
   243  * Looks for 'front-page.php'.
       
   244  *
       
   245  * @since 3.0.0
       
   246  * @uses apply_filters() Calls 'front_page_template' on file path of template.
       
   247  *
       
   248  * @return string
       
   249  */
       
   250 function get_front_page_template() {
       
   251 	$templates = array('front-page.php');
       
   252 
       
   253 	return get_query_template( 'front_page', $templates );
       
   254 }
       
   255 
       
   256 /**
       
   257  * Retrieve path of page template in current or parent template.
       
   258  *
       
   259  * Will first look for the specifically assigned page template.
       
   260  * Then will search for 'page-{slug}.php', followed by 'page-{id}.php',
       
   261  * and finally 'page.php'.
       
   262  *
       
   263  * @since 1.5.0
       
   264  *
       
   265  * @return string
       
   266  */
       
   267 function get_page_template() {
       
   268 	$id = get_queried_object_id();
       
   269 	$template = get_page_template_slug();
       
   270 	$pagename = get_query_var('pagename');
       
   271 
       
   272 	if ( ! $pagename && $id ) {
       
   273 		// If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object
       
   274 		$post = get_queried_object();
       
   275 		if ( $post )
       
   276 			$pagename = $post->post_name;
       
   277 	}
       
   278 
       
   279 	$templates = array();
       
   280 	if ( $template && 0 === validate_file( $template ) )
       
   281 		$templates[] = $template;
       
   282 	if ( $pagename )
       
   283 		$templates[] = "page-$pagename.php";
       
   284 	if ( $id )
       
   285 		$templates[] = "page-$id.php";
       
   286 	$templates[] = 'page.php';
       
   287 
       
   288 	return get_query_template( 'page', $templates );
       
   289 }
       
   290 
       
   291 /**
       
   292  * Retrieve path of paged template in current or parent template.
       
   293  *
       
   294  * @since 1.5.0
       
   295  *
       
   296  * @return string
       
   297  */
       
   298 function get_paged_template() {
       
   299 	return get_query_template('paged');
       
   300 }
       
   301 
       
   302 /**
       
   303  * Retrieve path of search template in current or parent template.
       
   304  *
       
   305  * @since 1.5.0
       
   306  *
       
   307  * @return string
       
   308  */
       
   309 function get_search_template() {
       
   310 	return get_query_template('search');
       
   311 }
       
   312 
       
   313 /**
       
   314  * Retrieve path of single template in current or parent template.
       
   315  *
       
   316  * @since 1.5.0
       
   317  *
       
   318  * @return string
       
   319  */
       
   320 function get_single_template() {
       
   321 	$object = get_queried_object();
       
   322 
       
   323 	$templates = array();
       
   324 
       
   325 	if ( ! empty( $object->post_type ) )
       
   326 		$templates[] = "single-{$object->post_type}.php";
       
   327 	$templates[] = "single.php";
       
   328 
       
   329 	return get_query_template( 'single', $templates );
       
   330 }
       
   331 
       
   332 /**
       
   333  * Retrieve path of attachment template in current or parent template.
       
   334  *
       
   335  * The attachment path first checks if the first part of the mime type exists.
       
   336  * The second check is for the second part of the mime type. The last check is
       
   337  * for both types separated by an underscore. If neither are found then the file
       
   338  * 'attachment.php' is checked and returned.
       
   339  *
       
   340  * Some examples for the 'text/plain' mime type are 'text.php', 'plain.php', and
       
   341  * finally 'text_plain.php'.
       
   342  *
       
   343  * @since 2.0.0
       
   344  *
       
   345  * @return string
       
   346  */
       
   347 function get_attachment_template() {
       
   348 	global $posts;
       
   349 
       
   350 	if ( ! empty( $posts ) && isset( $posts[0]->post_mime_type ) ) {
       
   351 		$type = explode( '/', $posts[0]->post_mime_type );
       
   352 
       
   353 		if ( ! empty( $type ) ) {
       
   354 			if ( $template = get_query_template( $type[0] ) )
       
   355 				return $template;
       
   356 			elseif ( ! empty( $type[1] ) ) {
       
   357 				if ( $template = get_query_template( $type[1] ) )
       
   358 					return $template;
       
   359 				elseif ( $template = get_query_template( "$type[0]_$type[1]" ) )
       
   360 					return $template;
       
   361 			}
       
   362 		}
       
   363 	}
       
   364 
       
   365 	return get_query_template( 'attachment' );
       
   366 }
       
   367 
       
   368 /**
       
   369  * Retrieve path of comment popup template in current or parent template.
       
   370  *
       
   371  * Checks for comment popup template in current template, if it exists or in the
       
   372  * parent template.
       
   373  *
       
   374  * @since 1.5.0
       
   375  * @uses apply_filters() Calls 'comments_popup_template' filter on path.
       
   376  *
       
   377  * @return string
       
   378  */
       
   379 function get_comments_popup_template() {
       
   380 	$template = get_query_template( 'comments_popup', array( 'comments-popup.php' ) );
       
   381 
       
   382 	// Backward compat code will be removed in a future release
       
   383 	if ('' == $template)
       
   384 		$template = ABSPATH . WPINC . '/theme-compat/comments-popup.php';
       
   385 
       
   386 	return $template;
       
   387 }
       
   388 
       
   389 /**
       
   390  * Retrieve the name of the highest priority template file that exists.
       
   391  *
       
   392  * Searches in the STYLESHEETPATH before TEMPLATEPATH so that themes which
       
   393  * inherit from a parent theme can just overload one file.
       
   394  *
       
   395  * @since 2.7.0
       
   396  *
       
   397  * @param string|array $template_names Template file(s) to search for, in order.
       
   398  * @param bool $load If true the template file will be loaded if it is found.
       
   399  * @param bool $require_once Whether to require_once or require. Default true. Has no effect if $load is false.
       
   400  * @return string The template filename if one is located.
       
   401  */
       
   402 function locate_template($template_names, $load = false, $require_once = true ) {
       
   403 	$located = '';
       
   404 	foreach ( (array) $template_names as $template_name ) {
       
   405 		if ( !$template_name )
       
   406 			continue;
       
   407 		if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
       
   408 			$located = STYLESHEETPATH . '/' . $template_name;
       
   409 			break;
       
   410 		} else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
       
   411 			$located = TEMPLATEPATH . '/' . $template_name;
       
   412 			break;
       
   413 		}
       
   414 	}
       
   415 
       
   416 	if ( $load && '' != $located )
       
   417 		load_template( $located, $require_once );
       
   418 
       
   419 	return $located;
       
   420 }
       
   421 
       
   422 /**
       
   423  * Require the template file with WordPress environment.
       
   424  *
       
   425  * The globals are set up for the template file to ensure that the WordPress
       
   426  * environment is available from within the function. The query variables are
       
   427  * also available.
       
   428  *
       
   429  * @since 1.5.0
       
   430  *
       
   431  * @param string $_template_file Path to template file.
       
   432  * @param bool $require_once Whether to require_once or require. Default true.
       
   433  */
       
   434 function load_template( $_template_file, $require_once = true ) {
       
   435 	global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;
       
   436 
       
   437 	if ( is_array( $wp_query->query_vars ) )
       
   438 		extract( $wp_query->query_vars, EXTR_SKIP );
       
   439 
       
   440 	if ( $require_once )
       
   441 		require_once( $_template_file );
       
   442 	else
       
   443 		require( $_template_file );
       
   444 }
       
   445