【问题标题】:Getting hold of metadata when creating a post in WordPress在 WordPress 中创建帖子时获取元数据
【发布时间】:2012-10-09 22:49:57
【问题描述】:

我正在使用 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));
}

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

【问题讨论】:

  • 一些附加信息:自定义字段是通过高级自定义字段插件管理的。导入帖子后,如果我编辑任何帖子并保存(“更新”)它们,则设置 my_field_value 并且我使用该值的后续操作成功。在创建帖子时,我已经在这个 save_post 操作中记录了 my_field_value 和 get_post_meta($post_id) 的值,并且确实看不到元字段值。
  • 同样,get_post_custom($post_id) 及其相关函数返回空数组(我注意 post_id 是正确的。
  • 我不知道如何关闭它。我是否将其标记为自己回答,或者我可以与 Alex Demchak 分享答案,他指出了我没有考虑的方向?

标签: wordpress


【解决方案1】:

您应该考虑使用$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 中查找值并使用不为空的那个?

【讨论】:

  • $post->ID 稍微好一点。它允许在通过管理表单创建帖子时读取元字段。但是,通过 CSV 导入创建时它不起作用。通过 CSV 导入时,$post_id 包含帖子 ID,而 $post->ID 不包含。我假设 $post 仅在处理来自表单的帖子时可用?
  • 因此在将 CSV 记录导入帖子类型时回显值:我可以看到帖子 ID,并将正确的 ID 传递给 get_post_meta(),但在帖子创建期间调用 get_post_meta() 时仅返回空字段.在更新期间,它会返回正确的存储值。
  • 添加编辑回答。不幸的是,我对 CSVi -> Post 不是很有经验。也许您可以检查在导入过程中哪个变量具有值,正如上面的编辑所反映的那样?
  • 是的 - 当你第一次建议使用 $post->ID 时,我就是这样做的 - 我选择设置的任何一个,并且总是两个之一。
  • 我想伟大的思想是一样的 :)。嗯,您是否在对save_post 的钩子中正确使用了add_post_meta()update_post_meta?那是我唯一可以看到绘制该错误的地方,因为它处于困境中:/
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多