使用SAVE_POST或wp_INSERT_POST时数据库中存在重复条目

时间:2015-06-20 作者:gurung

这就是我要做的-我在数据库中创建了一个自定义表,每次创建帖子时,我都会尝试向其中输入数据。需要创建数据库条目ONCE AND ONLY WHEN A NEW POST IS CREATED. 不在更新、修订、状态更改等岗位上。仅供参考,创建的新岗位始终放在draft 状态,然后稍后发布。插入到表中的数据是所创建post的元数据,即post元键及其post元值。我需要将此自定义数据放在单独的表中。

这就是我所尝试的-我不确定应该挂入哪个特定的wp挂钩来执行此功能。经过一些研究,这里是我编写的一些代码,它使用wp_insert_post().

function update_profile_record( $post_id ) {

                //if ($post->post_type = \'post\') return;
                $pro_realname = get_post_meta( $post_id, \'realname\', true );
                $pro_cell = get_post_meta( $post_id, \'cell\', true );
                $pro_email = get_post_meta( $post_id, \'e_mail\', true );
                $pro_subdate = get_post_meta( $post_id, \'submit_date\', true );
                if ($pro_subdate == \'\') { $pro_subdate = get_the_date( $format, $post_id ); }

                    global $wpdb;
                    $table_name = $wpdb->prefix . "profile_record";
                    $wpdb->insert( $table_name, array(
                    \'rec_profile_name\' => $pro_realname,
                    \'rec_profile_contact\' => $pro_cell,
                    \'rec_profile_email\' => $pro_email,
                    \'rec_profile_date\' => $pro_subdate
                    ));
            }
        add_action(  \'wp_insert_post\',  \'update_profile_record\', 10, 1 );
更新这里是正在发生的事情-此代码使用wp_insert_post 有助于顺利地将条目输入数据库,问题是每次更新帖子时,都会将重复条目插入数据库。答案中@s\\u ha\\u dum提供的解决方案会导致自定义表中出现空值。

根据post transition status, 我也试过了{auto-draft}_to_{draft}, {new}_to_{draft}, {new}_{post} 但它并没有填充表中的任何数据。所以我的问题是,对于我试图实现的功能,是否有一个特定的挂钩,或者我需要依赖它save_post/wp_insert_post 仅与if\\u else语句一起使用。

<小时>

Here is the order of how it needs to happen :
  1. A new post is created 并将其与自定义元数据一起置于草稿状态(元数据现在在DB中可用,因此现在可以复制到DB中的自定义表)function runs and updates 自定义表的值
如果我在这里没有错的话,我的函数似乎需要在创建帖子后立即运行,只需要运行一次,并且不应该受到任何类型的帖子更新的影响。

更新:因为我没有找到解决方案,所以我选择了另一条路线。谢谢@s\\u ha\\u dum的尝试。

1 个回复
SO网友:s_ha_dum

wp_insert_post runs when a post is updated as well. 如果你scan the source 您将看到许多代码块在更新与否之间切换。事实上wp_update_post() 经过一点处理后,只需将数据传递给wp_insert_post() 对于大部分工作。这就是为什么你的代码运行得比你想象的要多——钩子并没有像你想象的那样工作。幸运的是,WordPress传递了一个参数,告诉您钩子是否正在更新中使用。

do_action( \'wp_insert_post\', $post_ID, $post, $update );
所以。。。

function update_profile_record( $post_ID, $post, $update ) {
  if (true == $update) return;

  //if ($post->post_type = \'post\') return;
  $pro_realname = get_post_meta( $post_id, \'realname\', true );
  $pro_cell = get_post_meta( $post_id, \'cell\', true );
  $pro_email = get_post_meta( $post_id, \'e_mail\', true );
  $pro_subdate = get_post_meta( $post_id, \'submit_date\', true );
  if ($pro_subdate == \'\') { 
    $pro_subdate = get_the_date( $format, $post_id ); 
  }

  global $wpdb;
  $table_name = $wpdb->prefix . "profile_record";
  $wpdb->insert( 
    $table_name, 
    array(
      \'rec_profile_name\' => $pro_realname,
      \'rec_profile_contact\' => $pro_cell,
      \'rec_profile_email\' => $pro_email,
      \'rec_profile_date\' => $pro_subdate,
    )
  );
}
add_action(  \'wp_insert_post\',  \'update_profile_record\', 10, 3 );

结束