2012-10-09 29 views
4

我正在使用save_post操作來檢查自定義帖子中的元數據字段並對該值採取一些操作。這是我如何做它的基本膽量:在WordPress中創建帖子時獲取元數據

add_action('save_post', 'my_save_post'); 

function my_save_post($post_id) 
{ 
    // Check if not autosaving, processing correct post type etc. 
    // ... 

    // Get the custom field value. 
    $my_field_value = get_post_meta($post_id, 'my_field', true); 

    // Do some action 
    // ... 
} 

這通過管理頁面更新帖子時正常工作。但是,首次創建帖子時,my_field_value始終爲空。該字段確實得到正確保存,但此操作觸發器似乎無法看到它,也沒有任何其他自定義字段值。

我想要對所創建的此類型的所有帖子執行操作,並且我將通過CSV導入的插件導入很多帖子。即使這樣,自定義字段也會被正確導入,並且對於每個導入的行都會觸發操作觸發器,但save_post操作仍然看不到自定義字段值。

就我從文檔中看到的情況而言,該帖子已在創建此動作時觸發,因此我應該始終能夠看到該自定義元字段。


答案似乎是事情發生的順序。從表單創建帖子時,自定義字段全部由相應的操作收集,並在我的save_post操作觸發前添加到帖子中。這意味着我的觸發器能夠看到這些自定義字段值。

從CSV導入時,首先創建基本帖子,然後添加自定義元域。 save_post觸發器在第一次創建時觸發,在添加metafields之前,所以自定義字段數據對save_post操作不可見。

我的解決辦法是使用updated_post_metaadded_post_meta行動以及save_post動作捕捉的元數據的更新:

add_action('updated_post_meta', 'my_updated_post_meta', 10, 4); 
add_action('added_post_meta', 'my_updated_post_meta', 10, 4); 

function my_updated_post_meta($meta_id, $post_id, $meta_key, $meta_value) 
{ 
    // Make sure we are handling just the meta field we are interested in. 
    if ($meta_key != 'my_custom_field') return; 
    if (wp_is_post_revision($post_id)) return; 
    if (get_post_type($post_id) != 'my_post_type') return; 
    if (trim($meta_value) == '') return; 

    // Do my custom task (linking this post to a parent post in a different 
    // post type). This is the same task performed by the save_post action. 
    my_link_product_track($post_id, trim($meta_value)); 
} 

這基本上是我做什麼,它似乎運作良好。我將上述所有內容封裝到主題中的自定義類中,並且不建議使用全局作用域變量,如下所示,但這只是爲了顯示方法。

+0

一些附加信息:自定義字段通過高級自定義字段插件進行管理。在導入帖子之後,如果我編輯任何帖子並保存(「更新」)它們,那麼設置my_field_value,並且使用該值的後續操作成功。在創建帖子時,我在此save_post操作中記錄了my_field_value和'get_post_meta($ post_id)'的值,並且實際上無法看到元字段值。 – Jason

+0

同樣,'get_post_custom($ post_id)'及其相關函數返回空數組(我小心post_id是正確的。 – Jason

+0

我不確定如何關閉此功能。我是否將其標記爲自己回答,還是我可以與Alex Demchak分享答案,他以我沒有考慮的方向指向我? – Jason

回答

2

你應該看看使用$post->ID代替$post_id -

$my_field_value = get_post_meta($post->ID, 'my_field', true); 

get_post_meta in the Codex

編輯

你能不能做這樣的事?

if($post->ID == ''){ 
    $pid = $post_id; 
} else { 
    $pid = $post->ID; 
} 

//$pid = $post->ID or $post_id, whichever contains a value 
$my_field_value = get_post_meta($pid, 'my_field', true); 

在$ post-> ID和$ post_id中尋找一個值,並使用哪一個不是空白?

+0

$ post-> ID稍微好一點。它允許在通過管理員表單創建帖子時讀取元字段。但通過CSV導入創建時不起作用。當通過CSV導入時,'$ post_id'包含帖子ID,而'$ post-> ID'不包含。我假設$ post只能在處理來自表單的帖子時使用? – Jason

+0

因此,在將CSV記錄導入帖子類型時回顯值:我可以看到帖子ID,並將正確的ID傳遞給get_post_meta(),但在創建後調用時,get_post_meta()僅返回空字段。在更新期間,它返回正確的存儲值。 – Jason

+0

補充編輯回答。不幸的是,我對CSVi - > Post不是很有經驗。也許你可以檢查哪個變量在導入過程中有一個值,如上面的編輯所反映的那樣? – Xhynk

相關問題