在SAVE_POST操作中更新POST元数据

时间:2017-03-09 作者:Austin Biggs

我目前正在尝试在save\\u post操作中更新帖子的元值。问题是它会立即被覆盖。我已经为这个问题绞尽脑汁好几个小时了,没法让它发挥作用。有没有办法在不被覆盖的情况下更新元数据?

我的代码如下

add_action( \'save_post_promo\', \'update_promo_tag_id\', 10, 1 );
function update_promo_tag_id( $post_id ) { update_field( \'one_time_tag_id\', \'updated!\', $post_id ); }

1 个回复
SO网友:Nathan Johnson

问题可能是$post_id 通过传递给的参数save_post_$post_type 钩子不同$post_id 作为原始帖子-它是$post_id 编辑帖子时创建的临时帖子的。

要确认这一点,请执行以下操作:

add_filter( \'pre_post_update\', \'wpse_pre_post_update\', 10, 3 );
add_filter( \'save_post\', \'wpse_save_post\', 10, 1 );

function wpse_pre_post_update( $post_id, $post, $update ) {
  echo $post_id . \'<br>\';
}
function wpse_save_post( $post_id ) {
  echo $post_id;
  wp_die();
}
如果您试图添加一个新帖子,那么pre\\u post\\u update钩子不会启动,WP将在带您进入编辑屏幕之前终止。注释掉wp_die() 行,然后单击“添加新”链接。现在,取消注释wp_die() 并保存帖子。在WP死之前,应输出两个不相同的ID。

第一个ID是实际帖子的ID。第二个ID是临时职位的ID。

我真的不明白WordPress为什么这样做,我也不知道它是否总是这样。但在运行新安装的WP 4.7.3时,它有这种行为。

除非你出于某种原因need 要在保存帖子后更新选项,我将使用pre_post_update 改为挂钩。

add_filter( \'pre_post_update\', \'update_promo_tag_id\', 10, 3 );
function update_promo_tag_id( $post_id, $post, $update ) { 
  if( \'promo\' !== $post->post_type ) {
    return $post_id;
  } 
  update_field( \'one_time_tag_id\', \'updated!\', $post_id );
  return $post_id;
}