iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 4
0
Modern Web

WordPress 遇上 Chatbot,像極了愛情系列 第 4

【第 04 天】聊聊 WordPress 的 Action Hooks

前面提到,我們今天如果想透過這段程式碼來達成我們想在 WordPress 上面的一些目的就得透過 hook。正因如此,hooks 也是 WordPress 外掛和主題與 WordPress 核心程式碼互動的基礎。

因此,WordPress 核心提供了許多好用的 hooks ,來幫助開發者開發 WordPress 外掛或是主題。當然了,我們也可以自己埋 hook 讓第三方開發者新增或修改我們的功能。

埋 Action Hook

在使用 action hook 之前,我們先來看看埋 action hook 的語法:

WordPress 提供了一個好用的函式讓我們可以埋 action hook ,叫做 do_action()

do_action('do_something'); // 我們在某個角落埋下了一個 'do_something' 的 action hook

接著我們就可以來試看看剛剛埋的 action hook 囉!

我們可以通過兩個步驟新增一個函數到 action hook 上面。

  1. 創建一個自己定義的回呼函式(callback function)。
  2. 使用 add_action() 函式,將這個函式加到對應的 actoin hook 上面。

這裡說一下 add_action() 這個函式,這個函式基本需要傳遞兩個參數:第一個是 hook 名稱(也就是你要去觸發哪個 hook );第二個是 回呼函式(就是剛剛你創建的那個回呼函式)。

下面示範一個在剛剛埋的 action hook (do_something)上,插入我的自定義 love_wp 回呼函式:

<?php
function love_wp() {
    // 做一些事情
}
add_action('do_something', 'love_wp');

是的,就是這麼簡單!所以囉,在 WordPress 的世界埋了許許多多的 hooks ,我們可以通過查看 WordPress 核心、主題或外掛的原始碼找到自己可以用到的 hook。

再來講更複雜一點點點點的,剛剛如果有打開官方文件,看 add_action() 這個 function 的話,應該會看到,後面還可以塞很多參數誒!

沒錯,add_action() 除了上述的兩個參數之外,還可以接受兩個額外的參數,分別是 $priority (優先級),和 $accepted_args (定義傳遞給回呼函式的參數數量)。

$priority 優先權

我們先來聊聊優先權。今天如果一個 hook 上面掛載了一堆回呼函式,那誰先誰後呢?這時候 hooks 可能就需要一個優先權,來確定這些回呼函式的執行順序。優先權只接受整數,默認的整數為 10,數字越小,就越優先。

例如,下面的回呼函式全部掛載到了剛剛我埋的 action hook上面,但他們有不同的優先權。

<?php
add_action('do_something', 'run_me_early', 9);
add_action('do_something', 'run_me_normal'); // 沒有指定,默認為 10
add_action('do_something', 'run_me_late', 11);

上面的 hook 都是 do_something ,但是執行的順序就被改變了! run_me_early() 會先被第一個運行,其次是 run_me_normal(),最後一個才會是 run_me_late() 被運行。

$accepted_args 傳遞給回呼函式的參數數量

講完優先權,接著我們來講講如何定義傳遞給回呼函式的參數數量。

有時候,action hook 會需要接收一些參數放進函式。例如,當 WordPress 保存一篇文章時,有一個 save_post 這個 action hook,這個 action hook 會有三個參數,分別是:

  1. 保存文章的 ID
  2. 文章對象
  3. 這是否是正在更新的現有文章。
do_action( 'save_post', $post_ID, $post, $update );

所以,當我們想要放個 自定義函式 love_wp() 到 save_post 這個 action hook 時,我們就需要告訴他需要接收三個參數:

add_action('save_post', 'love_wp', 10, 3);

簡單說,就是我要去掛上一個 love_wp() 這個自定義函式,優先權是 10 、要被放入 3 個參數

然後我們就可以在剛剛我自己定義的函式中使用 Hook 提供的參數了。

function love_wp( $post_ID, $post, $update ) {
   // 做點事情吧
}

接著明天,我們會來聊聊 Filter Hooks~


上一篇
【第 03 天】第一個 WordPress 外掛
下一篇
【第 05 天】聊聊 WordPress 的 Filter Hooks
系列文
WordPress 遇上 Chatbot,像極了愛情30

尚未有邦友留言

立即登入留言