这就是我要做的-我在数据库中创建了一个自定义表,每次创建帖子时,我都会尝试向其中输入数据。需要创建数据库条目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 :
- A new post is created 并将其与自定义元数据一起置于草稿状态(元数据现在在DB中可用,因此现在可以复制到DB中的自定义表)一旦元数据可用,我们的function runs and updates 自定义表的值
如果我在这里没有错的话,我的函数似乎需要在创建帖子后立即运行,只需要运行一次,并且不应该受到任何类型的帖子更新的影响。
更新:因为我没有找到解决方案,所以我选择了另一条路线。谢谢@s\\u ha\\u dum的尝试。
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 );