在WordPress中创建帖子时获取元数据

时间:2012-10-09 22:49:57

标签: wordpress

我正在使用save_post操作来检查自定义帖子中的元数据字段,并对该值执行一些操作。这是我如何做到这一点的基本内容:

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触发器在添加元数据之前在第一次创建时触发,因此自定义字段数据对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));
}

这基本上就是我所做的,而且似乎运作良好。我将以上所有内容封装到主题中的自定义类中,并且不建议使用如此处所示的全局范围变量,但这只是为了显示方法。

1 个答案:

答案 0 :(得分: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中查找值的内容,并使用哪一个不为空?