我正在使用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_meta
和added_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));
}
這基本上是我做什麼,它似乎運作良好。我將上述所有內容封裝到主題中的自定義類中,並且不建議使用全局作用域變量,如下所示,但這只是爲了顯示方法。
一些附加信息:自定義字段通過高級自定義字段插件進行管理。在導入帖子之後,如果我編輯任何帖子並保存(「更新」)它們,那麼設置my_field_value,並且使用該值的後續操作成功。在創建帖子時,我在此save_post操作中記錄了my_field_value和'get_post_meta($ post_id)'的值,並且實際上無法看到元字段值。 – Jason
同樣,'get_post_custom($ post_id)'及其相關函數返回空數組(我小心post_id是正確的。 – Jason
我不確定如何關閉此功能。我是否將其標記爲自己回答,還是我可以與Alex Demchak分享答案,他以我沒有考慮的方向指向我? – Jason