到目前為止,你已經為你的主體框架添加了動作掛鈎 (action hooks),你已經編寫了一些函數,它們由這些掛鈎激活。下一步是添加一些過濾掛鈎,從而能夠帶給你更大的靈活性。
簡述動作掛鈎和過濾掛鈎
在開始之前,有必要對動作掛鈎和過濾掛鈎之間的差異做一個簡要的概述:
- 動作掛鈎會在代碼的特定地點被觸發。動作掛鈎本身並不包含任何可執行代碼,但是會在代碼中提供一個地點,由相關函數在這個地點實現你想完成的事情,而這些函數又是由這些動作掛鈎激活的。
- 過濾掛鈎使得改變已經寫入主題中的代碼成為可能。過濾掛鈎不會為空,而是包裹在一些現有的代碼之中,這樣你就可以使用附加到掛鈎上的函數來修改或覆蓋它。
更多細節,詳見動作掛鈎和過濾掛鈎初學者指南。
如何創建和使用一個過濾掛鈎
然後使用 add_filter() 函數訪問該過濾掛鈎,如下所示:
-
<?php -
apply_filters( 'my_filter', 'code to be filtered goes here' );
-
?>
你添加到這個函數中的內容將代替框架中的過濾性代碼,這裏也就是你更改或重新覆蓋原有代碼的位置。
-
<?php -
function my_function() {
-
// code for function here -
} -
add_filter( 'my_filter', 'my_function' );
-
?>
你需要做的是
跟隨本教程,你需要:
- 安裝一個 WordPress 開發環境
- 一個代碼編輯器
- 來自前期教程的代碼,前提是你使用的是我的 WordPress 模板框架中的代碼
添加過濾掛鈎
在這一課,我會給主題框架添加三個過濾掛鈎:
- 在網頁頁眉的過濾掛鈎中,我會附上該網站的標題和説明。
- 在網頁頁腳中,我將給版權標記添加一個過濾掛鈎,這我們上節課就已經添加過了。
這意味着,將來這兩者都可以被子主題或插件修改/覆蓋。你可以給你的主題框架添加更多的過濾掛鈎:任何你要添加代碼的位置,或者之後你可能想要改變的標記,你都可以使用過濾掛鈎去實現這種改變,而無需去在一個子主題中新建模板文件。
添加一個過濾掛鈎到網站標題和説明
從網站標題和説明開始。打開你的主題 header.php 文件,找到下列代碼:
-
<div >
-
<!-- site name and description - site name is inside a div element on all pages except the front page and/or main blog page, where it is in a h1 element -->
-
<h1 id="site-title">
-
<a href="http://span<?php/span%20spanecho/span%20home_urlspan(/spanspan)/spanspan;/span%20span?>/span" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a>
-
</h1>
-
<h2 id="site-description"><?php bloginfo( 'description' ); ?></h2>
-
</div>
與其只編寫一個過濾掛鈎,倒不如分別給每一個標題和每一個説明都添加一個過濾掛鈎,這樣會更好,因為你可以修改或者改變其中任意一個在輸出內容,或者兩個都行。
每一種情況下,都要將 bloginfo() 函數替換成 get_bloginfo() 函數,在 apply_filters() 函數之前添加 echo 。我們就從網站標題開始。在元素 h1 中編輯代碼,如下所示:
-
<h1 id="site-title">
-
<a href="http://span<?php/span%20spanecho/span%20home_urlspan(/spanspan)/spanspan;/span%20span?>/span" title="<?php echo esc_attr( apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name', 'display' ) ) ); ?>" rel="home">
-
<?php echo apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name' ) ); ?>
-
</a>
-
</h1>
正如你所看到的,我已經先後兩次添加了 apply_filters() 函數——第一次是為了鏈接的標題屬性,之後是為了顯示的文本。新代碼如下:
-
<?php echo apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name' ) ); ?>
這裏建立了一個名為 wptutsplus_sitetitle 的掛鈎,然後將它應用到 get_bloginfo( 'name') 函數,再重新輸出。
標題説明也是如此,但會簡單一點,因為它沒有鏈接。編輯 h2 元素如下所示:
-
<h2 id="site-description">
-
<?php echo apply_filters( 'wptutsplus_sitedescription', get_bloginfo( 'description' ) );?>
-
</h2>
這不會影響 h2 元素的輸出內容,但是會給你一個過濾掛鈎,之後你可以用它來改變 h2 元素。
給版權標記添加一個過濾掛鈎
下面,我要給版權標記添加一個過濾掛鈎,這個掛鈎在我的 functions.php 文件中的一個函數裏。它能讓我的框架用户修改或者覆蓋版權標記的內容。
首先打開你的 functions.php 文件,找到下面的代碼塊:
-
function wptp_colophon() { ?> -
<section role="contentinfo">
-
<small >
-
© <a href="http://span<?php/span%20spanecho/span%20home_urlspan(/span%20span'/'/span%20span)/span%20span?>/span"><?php bloginfo( 'name' ); ?></a> 2014
-
</small><!-- #copyright -->
-
-
<small >
-
<?php _e( 'Proudly powered by', 'tutsplus' ); ?>
-
<a href="http://WordPress.org/">WordPress</a>.
-
</small><!-- #credits -->
-
</section><!--#colophon-->
-
-
<?php -
}
現在將輸出博客名的那行代碼放於一個鏈接中,把這兩個函數包裹在一個 apply_filters() 函數中,如下所示:
-
function wptp_colophon() { ?> -
<section role="contentinfo">
-
<small >
-
©<a href="http://span<?php/span%20spanecho/span%20apply_filtersspan(/span%20span'wptp_colophon_link'/spanspan,/span%20home_urlspan(/span%20span'/'/span%20span)/span%20span?>/span">) ?>"><?php echo apply_filters('wptp_colophon_name', get_bloginfo( 'name' ) ); ?></a> 2014
-
</small><!-- #copyright -->
-
-
<small >
-
<?php _e( 'Proudly powered by', 'tutsplus' ); ?>
-
<a href="http://WordPress.org/">WordPress</a>.
-
</small><!-- #credits -->
-
</section><!--#colophon-->
-
-
<?php -
}
這裏,我創建了兩個過濾掛鈎:
- echo apply_filters( 'wptp_colophon_link', home_url( '/' ) 應用於該名稱指向的鏈接。
- echo apply_filters('wptp_colophon_name', get_bloginfo( 'name' ) ) 應用於該名稱本身。
如果之後我想要改變這兩個過濾掛鈎的話,我可以用幾個簡單的函數做到,如下所示:
-
function wptp_amend_colophon_name() {
-
-
$name = 'Rachel McCollin';
-
return $name;
-
-
} -
add_filter( 'wptp_colophon_name', 'wptp_amend_colophon_name' );
-
-
function wptp_amend_colophon_link() {
-
-
$link = 'http://rachelmccollin.co.uk';
-
return $link;
-
-
} -
add_filter( 'wptp_colophon_link', 'wptp_amend_colophon_link' );
每一個函數在原有的過濾掛鈎中返回了 PHP 函數中一些靜態內容,取代了主頁網址 (the home url) 、博客名和網址:

小結
在這裏,我已經添加了幾個簡單的過濾掛鈎,可以讓你或你的框架用户在更改輸出內容時,無需去創建新的模板文件。正如我們所看到的,一個過濾掛鈎,不同於一個動作掛鈎,它可以讓你修改已經通過掛鈎輸出的內容,而不是增加新的東西到一個空掛鈎中。
在某些情況下,你也許會發現,一個過濾掛鈎會變得過於複雜,在這種情況下,你需要編寫一個新的函數,而有時也需要新建一個模板文件。例如,如果我想讓版權標記變化更加明顯,我可以在我的子主題中添加一個名為 wptp_colophon() 的新函數——由於框架中的 wptp_colophon() 函數是可插拔的,我的新函數會覆蓋它。但是,如果我想更換整個頁腳,我就不得不去創建一個新的 footer.php 文件了。
過濾掛鈎是非常有用的,但為了避免繁重的無用之功——當你在編寫框架模板文件時,最好考慮一下用户可能想要修改的輸出內容,並把它包裹在 apply_filters() 函數裏面。