到目前為止,你已經為你的主體框架新增了動作掛鉤 (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() 函式裡面。