Genesis框架從入門到精通(4):框架的內建動作(續)
在本系列的前一篇 Genesis框架從入門到精通(3):框架的內建動作 ,我解釋了在哪裡找Genesis 的內建動作,以及如何使用鉤子移除,移動或改變動作。在這篇文章的中,我將繼續講解如何使用自定義的函式、在新增動作時使用既有函式的技巧,以及怎樣使用Genesis函式。
使用自定義的函式
Genesis的函式是很好用,但是如果當你想在網站上新增其他內容時呢?你要自己寫一個函式,並使用 add_action()
把它掛載到某一個鉤子上。 (請記住, add_action()
, remove_action()
實際上只是指明瞭程式碼要在什麼位置執行)。編寫一個函式聽起來好像複雜的樣子,特別是對不熟悉php的人。不過它真的很容易。函式分為幾個關鍵部分,可以看成是某種按順序執行的任務模板。讓我們看一下這個 generic
函式
function generic( $arg='foo' ) { echo $arg; }
很簡單。一個函式包括6個部分,第1行就包括了其中的4個基礎部分。單詞“function”是第一部分,它告訴php“記住這個函式,後面要用到”。“generic”是函式名,這樣你就可以用這個名字來呼叫程式碼並執行,而不是每次都要寫同樣的一大啪啦的程式碼。當然,這個例子中沒那麼多程式碼,也不會節省太多打字量,但在實際開發中它可能會有很多程式碼。
說一下函式的名稱。 “generic”是一個非常糟糕的可怕的名稱。太短,沒有描述性,而且……太通用了(generic的意思就是通用)。名稱的長度不是問題。PHP的函式名字並不要求最少幾個字元,名稱太短問題是不好確定唯一性的,也不能很好的描述函式的作用。
函式名稱必須是唯一的。你不能擁有兩個具有相同名稱的函式,否則你可能會收到報錯並把網站搞崩潰。子主題裡函式通常使用子主題名稱或縮寫作為字首,這可以很大程度上避免函式重名導致的問題。
函式名字也應該是有意義的。雖然這不是強制要求。我可以隨便寫一個處理標題輸出的函式叫 child_function_a
,只要其他函式沒有叫這個名字,它就可以用,但是當我需要呼叫它的時候,我可能記不住這個名字,而且很可能會忘記什麼它是幹什麼用的了。 叫“child_do_title”要好得多,因為它告訴我它是子主題中的一個函式,它會去“處理標題”或輸出標題。
第一行的下一部分 ($arg ='foo')
是函式的“引數”。函式可以不需要引數,也可以有多個引數。在這個例子裡,我設定了一個引數的“預設”值,但是在呼叫該函式時可以用別的值來替換它。如果沒有引數,就寫成 function generic(){}
,可能大部分時候你都會這麼用。再往下,只是把這個引數給列印(echo)出來。這意味著,函式在哪裡執行,它就會把這個值列印輸出到函式所在的位置,如果我想輸出“bar”而不是預設的“foo”,那就寫成 generic('bar')
。在配合鉤子使用時,這個函式可能會更有意義。
在引數之後是左大括號 {
,開始寫函式的程式碼, {}
之間的所有內容都是函式的“內臟”,在呼叫函式時,這裡的程式碼都會執行(稍後將詳細介紹)。函式部分以右大括號“}”結束,因此php引擎知道在哪裡停止。
這就是一個完整的函數了,但是你可能會想“我又不懂php,就會點html和css,這玩意對我沒啥用”,就像我剛開始學的時候一樣。好訊息是,如果你會寫html並想使用html,也是可以的。
function generic_html() { ?> Now I'm in html, this will print out using whatever <strong>html</strong> markup I give it. <?php }
你甚至可以混合使用html和php:
function generic_html_php() { ?> <p>See, still in html, no need for any fancy php, unless I need something dynamic, like the date <?php echo date(); ?>.</p> <p>Pretty easy, and that date function loads inline just like it would in a template file</p> <?php }
使用自定義的動作
好,你現在可以編寫一個簡單的函數了,但你需要將它新增到Genesis嗎?嗯,這是最簡單的部分,只需寫出來你想怎麼用這個函式就行了。需要在標題之前執行程式碼嗎?
add_action( 'genesis_before_header', 'generic' );
現在你已經瞭解瞭如何通過鉤子向Genesis新增自己的程式碼,但是還有很多東西需要學習。
使用已有函式
一個常見的需求就是是將外掛與Genesis整合。通常,有的外掛會包含一段使用說明:“開啟模板檔案並將此程式碼新增到您希望顯示的位置”。這比較難搞,因為有的子主題中並沒有這個檔案,而在Genesis中這個檔案可能只有一行 genesis();
怎麼辦呢?用動作(action)就行。我們來看看 Add to Any 外掛。正常情況下,這個外掛很容易整合,可以自動執行,但是假設你想在文章資訊旁邊的位置顯示。外掛的安裝說明說要通過編輯器將一些程式碼新增到模板檔案中。
<?php if( function_exists('ADDTOANY_SHARE_SAVE_KIT') ) { ADDTOANY_SHARE_SAVE_KIT(); } ?>
你不能直接在Genesis的檔案裡修改,因此你需要把這段程式碼寫成一個動作函式。可以這樣做
add_action( 'genesis_after_post_content', 'child_do_add_to_any' ); /**add the add to any function after post content if the function exists*/ function child_do_add_to_any() { if( function_exists('ADDTOANY_SHARE_SAVE_KIT') ) ADDTOANY_SHARE_SAVE_KIT(); }
足夠簡單明瞭,但我們可以通過結合函式和動作來更簡化一點。請記住,在 add_action()
這條語句裡,“回撥函式”部分只是指明要使用的函式,只要這個函式存在,任何函式都可以,所以你可以改為
if( function_exists('ADDTOANY_SHARE_SAVE_KIT') ) add_action( 'genesis_after_post_content', 'ADDTOANY_SHARE_SAVE_KIT' );
如何呼叫Genesis函式
“呼叫函式”這個說法的意思就是告訴函式開始執行。如果你以前編輯過模板,很可能在你不知道的時候就已經呼叫過函式。如果你在模板檔案裡添加了什麼東西或者其他操作,
你就是在呼叫該函數了。當你使用鉤子時,你也是在呼叫一個函式,你就是告訴在函式執行之前告訴它要在哪裡執行。這意味著鉤子函式可以與“普通”函式互換。就像你可以在鉤子中使用另一個函式一樣,你可以在也不使用鉤子的情況下呼叫Genesis函式。
一個很好的用法就是在自定義 home.php
檔案中。你可能修改了一個子主題的 home.php
檔案,加入了一些自定義的內容,但你希望在某些內容之後再把部落格上的文章也顯示出來。看看 genesis/lib/structure/loops.php
檔案,你會發現是 genesis_do_loop()
呼叫了 genesis_standard_loop()
,所以你可以在 home.php
檔案中新增這個函式,你希望文章顯示在哪裡就新增在哪裡
<?php genesis_standard_loop(); ?>
這適用於任何Genesis函式。如果你想將導航選單放在主頁上,可以像這樣新增
<?php genesis_do_nav(); ?>
我希望通過這三篇文章把讓鉤子的實際意義講明白了。
接下來是關於過濾器的教程,還有一些重要的Genesis函式需要關注。
原文連結: Genesis Explained Framework Actions Continued
如果你不瞭解php的函式,推薦你看看下面這個免費教程
PHP入門-函式篇
簡介:本教程結合例項形式分析了PHP關於自定義函式的建立、返回值、預設值、引數、值傳遞、作用域 以及可變函式、巢狀函式、遞迴函式、閉包函式的使用等相關技巧。
如果你想從頭學習php,推薦先看這個
PHP The Right Way 中文版本
