WordPress 讀取模板 (template) 的方式
從網路上整理出一些 WordPress 載入範本頁面的方式,順便也將 Source Code 附上,簡單比較一下差別。
先說結論,對於佈景主題的範本載入,直接用 get_template_part()
就好,大部分的主題也是使用這個方式去載入範本。
1. 傳統 PHP 方法
PHP 原生方法,如果不想用 WordPress 的 function,就是用 include()
、include_once()
、require()
、require_once()
去載入。
不會檢查路徑,必須使用完整範本路徑。
include(TEMPLATEPATH . '/template-name.php');
2. load_template()
WordPress 的函數,載入範本用的,從下方 Source 中可以發現,就是將原本 PHP 函數包裝起來。
不會檢查範本資料,所以必須使用完整範本路徑。
load_template(TEMPLATEPATH . '/template-name.php');
function load_template( $_template_file, $require_once = true, $args = array() ) {
global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;
if ( is_array( $wp_query->query_vars ) ) {
/*
* This use of extract() cannot be removed. There are many possible ways that
* templates could depend on variables that it creates existing, and no way to
* detect and deprecate it.
*
* Passing the EXTR_SKIP flag is the safest option, ensuring globals and
* function variables cannot be overwritten.
*/
// phpcs:ignore WordPress.PHP.DontExtract.extract_extract
extract( $wp_query->query_vars, EXTR_SKIP );
}
if ( isset( $s ) ) {
$s = esc_attr( $s );
}
if ( $require_once ) {
require_once $_template_file;
} else {
require $_template_file;
}
}
3. locate_template()
WordPress 的函數,將第二項的 load_template()
包裝起來,並加入路徑搜索功能,所以可以使用相對路徑。
如果有找到對應的範本文件,就會立即回傳文件路徑位置。
locate_template(array(
'download.php',
'custom-download.php',
'mytheme-download.php'
), true);
function locate_template( $template_names, $load = false, $require_once = true, $args = array() ) {
$located = '';
foreach ( (array) $template_names as $template_name ) {
if ( ! $template_name ) {
continue;
}
if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {
$located = STYLESHEETPATH . '/' . $template_name;
break;
} elseif ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {
$located = TEMPLATEPATH . '/' . $template_name;
break;
} elseif ( file_exists( ABSPATH . WPINC . '/theme-compat/' . $template_name ) ) {
$located = ABSPATH . WPINC . '/theme-compat/' . $template_name;
break;
}
}
if ( $load && '' !== $located ) {
load_template( $located, $require_once, $args );
}
return $located;
}
4. get_query_template()
一樣是 WordPress 的函數,會將第三項的 load_template()
包裝起來,能夠不用副檔名 (file extension name) 的情況下搜索範本文件,並會*回傳完整路徑。
還有一點與 load_template()
不同,需要指定頁面類型,例如下面範例載入 404 範本頁面時,通過 get_query_template()
可以取得副檔名供 include()
使用。
include(get_404_template());
// the same
include(get_query_template('404'));
Note: 可以搜索的清單可以看 Source Code 註解。
function get_query_template( $type, $templates = array() ) {
$type = preg_replace( '|[^a-z0-9-]+|', '', $type );
if ( empty( $templates ) ) {
$templates = array( "{$type}.php" );
}
/**
* Filters the list of template filenames that are searched for when retrieving a template to use.
*
* The dynamic portion of the hook name, `$type`, refers to the filename -- minus the file
* extension and any non-alphanumeric characters delimiting words -- of the file to load.
* The last element in the array should always be the fallback template for this query type.
*
* Possible hook names include:
*
* - `404_template_hierarchy`
* - `archive_template_hierarchy`
* - `attachment_template_hierarchy`
* - `author_template_hierarchy`
* - `category_template_hierarchy`
* - `date_template_hierarchy`
* - `embed_template_hierarchy`
* - `frontpage_template_hierarchy`
* - `home_template_hierarchy`
* - `index_template_hierarchy`
* - `page_template_hierarchy`
* - `paged_template_hierarchy`
* - `privacypolicy_template_hierarchy`
* - `search_template_hierarchy`
* - `single_template_hierarchy`
* - `singular_template_hierarchy`
* - `tag_template_hierarchy`
* - `taxonomy_template_hierarchy`
*
* @since 4.7.0
*
* @param string[] $templates A list of template candidates, in descending order of priority.
*/
$templates = apply_filters( "{$type}_template_hierarchy", $templates );
$template = locate_template( $templates );
$template = locate_block_template( $template, $type, $templates );
/**
* Filters the path of the queried template by type.
*
* The dynamic portion of the hook name, `$type`, refers to the filename -- minus the file
* extension and any non-alphanumeric characters delimiting words -- of the file to load.
* This hook also applies to various types of files loaded as part of the Template Hierarchy.
*
* Possible hook names include:
*
* - `404_template`
* - `archive_template`
* - `attachment_template`
* - `author_template`
* - `category_template`
* - `date_template`
* - `embed_template`
* - `frontpage_template`
* - `home_template`
* - `index_template`
* - `page_template`
* - `paged_template`
* - `privacypolicy_template`
* - `search_template`
* - `single_template`
* - `singular_template`
* - `tag_template`
* - `taxonomy_template`
*
* @since 1.5.0
* @since 4.8.0 The `$type` and `$templates` parameters were added.
*
* @param string $template Path to the template. See locate_template().
* @param string $type Sanitized filename without extension.
* @param string[] $templates A list of template candidates, in descending order of priority.
*/
return apply_filters( "{$type}_template", $template, $type, $templates );
}
5. get_template_part()
最後是最常用也最常看到的 WordPress 函數,一樣會去包裝 locate_template()
,通常會用於 body
tag 裡面,所以可以使用這個方式來製作各個範本零件 (template part),最後再將其整合在你的佈景主題中。
function get_template_part( $slug, $name = null, $args = array() ) {
/**
* Fires before the specified template part file is loaded.
*
* The dynamic portion of the hook name, `$slug`, refers to the slug name
* for the generic template part.
*
* @since 3.0.0
* @since 5.5.0 The `$args` parameter was added.
*
* @param string $slug The slug name for the generic template.
* @param string|null $name The name of the specialized template.
* @param array $args Additional arguments passed to the template.
*/
do_action( "get_template_part_{$slug}", $slug, $name, $args );
$templates = array();
$name = (string) $name;
if ( '' !== $name ) {
$templates[] = "{$slug}-{$name}.php";
}
$templates[] = "{$slug}.php";
/**
* Fires before a template part is loaded.
*
* @since 5.2.0
* @since 5.5.0 The `$args` parameter was added.
*
* @param string $slug The slug name for the generic template.
* @param string $name The name of the specialized template.
* @param string[] $templates Array of template files to search for, in order.
* @param array $args Additional arguments passed to the template.
*/
do_action( 'get_template_part', $slug, $name, $templates, $args );
if ( ! locate_template( $templates, true, false, $args ) ) {
return false;
}
}
Refer
- load_template() | Function | WordPress Developer Resources
- locate_template() | Function | WordPress Developer Resources
- get_query_template() | Function | WordPress Developer Resources
- get_template_part() | Function | WordPress Developer Resources
- 5 Ways To Include Template Files In WordPress – Deluxe Blog Tips
458 則留言
LorenMep
average dose of tadalafil: TadalAccess – buy tadalafil reddit
JosephSom
where to buy generic cialis cialis doesnt work for me cialis australia online shopping
JosephSom
how long does it take cialis to start working canada cialis ordering cialis online
Scottemips
tadalafil 5mg once a day: Tadal Access – cialis reviews photos
Frankiemef
https://tadalaccess.com/# sublingual cialis