到目前為止,你已經為你的主體框架添加了動作掛鈎 (action hooks),你已經編寫了一些函數,它們由這些掛鈎激活。下一步是添加一些過濾掛鈎,從而能夠帶給你更大的靈活性。

簡述動作掛鈎和過濾掛鈎

在開始之前,有必要對動作掛鈎和過濾掛鈎之間的差異做一個簡要的概述:

  • 動作掛鈎會在代碼的特定地點被觸發。動作掛鈎本身並不包含任何可執行代碼,但是會在代碼中提供一個地點,由相關函數在這個地點實現你想完成的事情,而這些函數又是由這些動作掛鈎激活的。
  • 過濾掛鈎使得改變已經寫入主題中的代碼成為可能。過濾掛鈎不會為空,而是包裹在一些現有的代碼之中,這樣你就可以使用附加到掛鈎上的函數來修改或覆蓋它。

更多細節,詳見動作掛鈎和過濾掛鈎初學者指南。

如何創建和使用一個過濾掛鈎

然後使用 add_filter() 函數訪問該過濾掛鈎,如下所示:

  1. <?php
  2. apply_filters( 'my_filter', 'code to be filtered goes here' );
  3. ?>

你添加到這個函數中的內容將代替框架中的過濾性代碼,這裏也就是你更改或重新覆蓋原有代碼的位置。

  1. <?php
  2. function my_function() {
  3.     // code for function here
  4. }
  5. add_filter( 'my_filter', 'my_function' );
  6. ?>

你需要做的是

跟隨本教程,你需要:

  • 安裝一個 WordPress 開發環境
  • 一個代碼編輯器
  • 來自前期教程的代碼,前提是你使用的是我的 WordPress 模板框架中的代碼

添加過濾掛鈎

在這一課,我會給主題框架添加三個過濾掛鈎:

  • 在網頁頁眉的過濾掛鈎中,我會附上該網站的標題和説明。
  • 在網頁頁腳中,我將給版權標記添加一個過濾掛鈎,這我們上節課就已經添加過了。

這意味着,將來這兩者都可以被子主題或插件修改/覆蓋。你可以給你的主題框架添加更多的過濾掛鈎:任何你要添加代碼的位置,或者之後你可能想要改變的標記,你都可以使用過濾掛鈎去實現這種改變,而無需去在一個子主題中新建模板文件。

添加一個過濾掛鈎到網站標題和説明

從網站標題和説明開始。打開你的主題 header.php 文件,找到下列代碼:

  1. <div >
  2.     <!-- 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 -->
  3.     <h1 id="site-title">
  4.         <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>
  5.     </h1>
  6.     <h2 id="site-description"><?php bloginfo( 'description' ); ?></h2>
  7. </div>

與其只編寫一個過濾掛鈎,倒不如分別給每一個標題和每一個説明都添加一個過濾掛鈎,這樣會更好,因為你可以修改或者改變其中任意一個在輸出內容,或者兩個都行。

每一種情況下,都要將 bloginfo() 函數替換成 get_bloginfo() 函數,在 apply_filters() 函數之前添加 echo 。我們就從網站標題開始。在元素 h1 中編輯代碼,如下所示:

  1. <h1 id="site-title">
  2.     <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">
  3.         <?php echo apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name' ) ); ?>
  4.     </a>
  5. </h1>

正如你所看到的,我已經先後兩次添加了 apply_filters() 函數——第一次是為了鏈接的標題屬性,之後是為了顯示的文本。新代碼如下:

  1. <?php echo apply_filters( 'wptutsplus_sitetitle', get_bloginfo( 'name' ) ); ?>

這裏建立了一個名為 wptutsplus_sitetitle 的掛鈎,然後將它應用到 get_bloginfo( 'name') 函數,再重新輸出。

標題説明也是如此,但會簡單一點,因為它沒有鏈接。編輯 h2 元素如下所示:

  1. <h2 id="site-description">
  2.     <?php echo apply_filters( 'wptutsplus_sitedescription', get_bloginfo( 'description' ) );?>
  3. </h2>

這不會影響 h2 元素的輸出內容,但是會給你一個過濾掛鈎,之後你可以用它來改變 h2 元素。

給版權標記添加一個過濾掛鈎

下面,我要給版權標記添加一個過濾掛鈎,這個掛鈎在我的 functions.php 文件中的一個函數裏。它能讓我的框架用户修改或者覆蓋版權標記的內容。

首先打開你的 functions.php 文件,找到下面的代碼塊:

  1. function wptp_colophon() { ?>
  2.     <section  role="contentinfo">
  3.         <small >
  4.             © <a href="http://span<?php/span%20spanecho/span%20home_urlspan(/span%20span'/'/span%20span)/span%20span?>/span"><?php bloginfo( 'name' ); ?></a> 2014
  5.         </small><!-- #copyright -->
  6.  
  7.         <small >
  8.             <?php _e( 'Proudly powered by', 'tutsplus' ); ?> 
  9.             <a href="http://WordPress.org/">WordPress</a>.
  10.         </small><!-- #credits -->
  11.     </section><!--#colophon-->
  12.  
  13. <?php        
  14. }

現在將輸出博客名的那行代碼放於一個鏈接中,把這兩個函數包裹在一個 apply_filters() 函數中,如下所示:

  1. function wptp_colophon() { ?>
  2.     <section  role="contentinfo">
  3.         <small >
  4.             ©<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
  5.         </small><!-- #copyright -->
  6.  
  7.         <small >
  8.             <?php _e( 'Proudly powered by', 'tutsplus' ); ?> 
  9.             <a href="http://WordPress.org/">WordPress</a>.
  10.         </small><!-- #credits -->
  11.     </section><!--#colophon-->
  12.  
  13. <?php        
  14. }

這裏,我創建了兩個過濾掛鈎:

  • echo apply_filters( 'wptp_colophon_link', home_url( '/' ) 應用於該名稱指向的鏈接。
  • echo apply_filters('wptp_colophon_name', get_bloginfo( 'name' ) ) 應用於該名稱本身。

如果之後我想要改變這兩個過濾掛鈎的話,我可以用幾個簡單的函數做到,如下所示:

  1. function wptp_amend_colophon_name() {
  2.  
  3.     $name = 'Rachel McCollin';
  4.     return $name;
  5.  
  6. }
  7. add_filter( 'wptp_colophon_name', 'wptp_amend_colophon_name' );
  8.  
  9. function wptp_amend_colophon_link() {
  10.  
  11.     $link = 'http://rachelmccollin.co.uk';
  12.     return $link;
  13.  
  14. }
  15. add_filter( 'wptp_colophon_link', 'wptp_amend_colophon_link' );

每一個函數在原有的過濾掛鈎中返回了 PHP 函數中一些靜態內容,取代了主頁網址 (the home url) 、博客名和網址:

add-filter-hooks-to-WordPress-framework-update-colophon

小結

在這裏,我已經添加了幾個簡單的過濾掛鈎,可以讓你或你的框架用户在更改輸出內容時,無需去創建新的模板文件。正如我們所看到的,一個過濾掛鈎,不同於一個動作掛鈎,它可以讓你修改已經通過掛鈎輸出的內容,而不是增加新的東西到一個空掛鈎中。

在某些情況下,你也許會發現,一個過濾掛鈎會變得過於複雜,在這種情況下,你需要編寫一個新的函數,而有時也需要新建一個模板文件。例如,如果我想讓版權標記變化更加明顯,我可以在我的子主題中添加一個名為 wptp_colophon() 的新函數——由於框架中的 wptp_colophon() 函數是可插拔的,我的新函數會覆蓋它。但是,如果我想更換整個頁腳,我就不得不去創建一個新的 footer.php 文件了。

過濾掛鈎是非常有用的,但為了避免繁重的無用之功——當你在編寫框架模板文件時,最好考慮一下用户可能想要修改的輸出內容,並把它包裹在 apply_filters() 函數裏面。