2011-03-25 51 views
5

我開發了一個WordPress插件,需要在保存自定義帖子類型的帖子時執行額外的處理。WordPress的「save_post」問題動作

最合理的解決方案是利用「save_post」動作。被調用時,動作處理程序可以創建或更新自定義表中的數據庫記錄(取決於是否單擊「創建發佈」或「更新發布」)。

我已經實現了這一點,它似乎是完美的工作,但我想解決一個小問題。當第一次加載「創建發佈」頁面時(即,在輸入任何用戶輸入之前以及在按下提交新/更改按鈕之前),似乎也會觸發「save_post」。

這意味着,自定義數據庫表是越來越充滿了一個空白行對於保存每個新的崗位。這也意味着每次加載發佈頁面時都會有一個空白行。

這裏是我的「save_post」處理器的簡化版本:

function do_save_post($post_id) { 
    if (get_post_type($post_id) !== 'mycustomtype') 
     return $post_id; 

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
     return $post_id; 

    if (!current_user_can('edit_mycustomtype')) 
     return $post_id; 

    echo 'This happens when selecting "Add New" from admin sidebar.'; 
    echo 'Even though post has not been saved or updated.'; 
    echo 'This should only happen when button on right of editor is clicked.'; 
} 

我怎樣才能檢測是否崗位實際上是被保存?

+1

的是當它失敗返回$ POST_ID點? – helgatheviking 2012-01-08 13:53:51

+1

@helgatheviking它允許其他鉤子使用正確的'$ post_id'執行它們的處理。我的鉤子沒有失敗,它只是想控制何時進行處理。 '$ post_id'通過返回從每個鉤子傳遞給每個鉤子。 – 2012-01-08 14:15:53

+0

@lea_hayes感謝您的回覆!我不知道$ post_id是從鉤子傳遞過來的。如果我不返回它,我還沒有注意到有任何代碼停滯的問題。 – helgatheviking 2012-01-08 14:26:40

回答

17

我有這個同樣的問題,看一看在post.php中的相關部分。原來save_post被稱爲每次post.php中運行,所以你會在創建後,列表等運行

在WP 3.1,「post_updated」之稱僅在post.php中保存/創建事件。所以我用:

add_action('post_updated', 'some_function'); 

希望這對你也有效。

+0

謝謝,現在這麼近了。是否可以防止帖子被轉移到垃圾時觸發? – 2011-05-02 11:24:54

+0

這對我來說很簡單,我所要做的就是'if(!isset($ _ POST ['my-extra-data']))return $ post_id;' – 2011-05-02 11:29:52

+0

+1這真的讓我感到困擾,因爲它似乎爲我的所有字段創建了一組默認值,所有複選框都被關閉。 – 2011-05-16 14:01:45

2

每當文章或頁面創建或更新這個鉤子運行,這可能是來自進口,後/頁的編輯形式,xmlrpc的,或交電子郵件。所以我猜想它也會在保存修改後版本時運行。如果我在哪裏檢查是否設置了postID(是鉤子函數應該獲得的唯一參數),並且它是否爲版本wp_is_post_revision()

+0

'$ post_id'包含一個有效的ID,'wp_is_post_revision()'似乎沒有幫助。只要從管理員側欄中選擇「添加新」,掛鉤即會運行。我已經用演示代碼更新了我的原始問題,以幫助解釋這個問題。謝謝。 – 2011-03-25 17:04:48

3

使用「post_updated」鉤往往是有問題的,使用自定義後的類型時尤爲如此。相反,我用這個作爲我的解決方案:

function do_save_post($post_id){ 
     $post = get_post($post_id); 
     if($post->post_status == 'trash' or $post->post_status == 'auto-draft'){ 
       return $post_id; 
     } 
     echo "do stuff"; 
    } 

我不想執行任何操作,當物品被送到垃圾,無論是。

0

您可能只想檢查數據是否實際發佈。

if(isset($_POST['post_title'])){ 
    //do stuff 
}