WordPress常用的有兩種鉤子,過濾鉤子add_filter和動作鉤子add_action,它們是WordPress插件機制中非常重要的兩個函數。過濾鉤子用來創建一個過濾器,讓其它的主題和插件對一個值進行修改過濾;動作鉤子核心代碼跟過濾鉤子差不多,但是沒有返回值,單純的就是在特定的地方執行插件或者主題開發者掛載的函數。
在開發WordPress博客同步到CSDN插件時,需要在WordPress發布文章后,加入一些動作鉤子函數,實現同步發布到其它博客平臺的功能,但同時又要避免修改文章后的重復發布。最早版本用的是publish_post和xmlrpc_public_post這兩個函數,結合發布時間判斷,實現了基本的功能;隨后又加入了publish_future_post來支持晚于當前時間的定時發布功能,但對于將定時發布時間設在當前時間之前的,就沒法同步了。為了解決這個問題,今天又查了一些資料,最后用transition_post_status替換了上面提到的幾個鉤子,完美實現了定時發布后的文章同步問題,值得記錄一下。
首先需要了解的是動作鉤子的用法和參數:
<?php
add_action( $tag, $function_to_add, $priority = 10, $accepted_args =1);
?>
$tag是所掛載的動作鉤子(action hooks)的名稱,就是WordPress核心調用do_action()時一些可以觸發的動作,用來確定掛載函數的位置,在官方Plugin API/Action Reference或WordPress Hooks Database上可以查看動作鉤子列表;$tag也可以是一個主題或插件文件內部的一個動作,或者特定的標簽“all”,這個函數將被所有的鉤子調用。
$function_to_add是你掛載的函數,用來實現期望添加的功能。
$priority是可選項,用于指定和特定的動作相關聯函數的執行順序,數字越小,執行越早,默認值為10。
$accepted_args也是可選項,用于標識掛鉤函數所接受的參數數量,默認值為1。
然后為了便于了解下面那些發布文章時會被觸發的鉤子,先簡單介紹下幾個涉及到的屬性值:
$post為文章對象;$post_ID為文章ID;$post_status為文章對象的發布狀態(包括new,publish,future,draft,pending,private,trash,auto-draft等);$post_type為文章對象的發布類型(包括post,page,attachment,revision等)。
最后就是相關的動作鉤子:
publish_post:參數一個($post_ID),點擊發布文章時就會被觸發;
save_post:參數一個($post_ID),發布或更新文章時就會被觸發;
edit_post:參數兩個($post_ID, $post),只要編輯已經存在的文章就會被觸發;
publish_future_post:參數一個($post_ID),到定時發布文章設定的時間點就會被觸發,如果設定的時間早于發布時間,不會被觸發;
transition_post_status:參數三個($new_status, $old_status, $post),實現功能比較強大,可以根據文章發布狀態的變化實現一些功能。
{$old_status}to{$new_status}:參數一個($post),比如draft_to_publish是通常的文章發布事件,future_to_publish則可以用來處理定時文章發布事件。
post_updated:參數三個($post_ID, $post_after, $post_before),已存在文章更新了就會被觸發。
對比上面的函數說明可以發現,post_updated事件是最強大的,可以獲取到文章修改前后的所有內容,參數較多;其次是transition_post_status事件,功能也比較強;接著是{$old_status}to{$new_status}事件,針對性較強,可以對特定情況進行事件抓取;而publish_post、save_post、edit_post和publish_future_post這四個事件就相對比較簡單,可以視情況而用。
WordPress中有關發布、編輯文章的代碼主要在文件/wp-includes/post.php里,主要函數有wp_update_post、wp_insert_post等,有興趣可以去細細看下源碼或者官方網站上的相關文檔,一定會收獲不少的。
最后的最后,如果你也有同步文章的需求,記得去試下WP2CSDNBlog插件,目前已經支持同步CSDN、新浪和網易博客了,好用的話記得給個好評喔!